Compare commits
No commits in common. "master" and "master" have entirely different histories.
|
|
@ -1,2 +0,0 @@
|
|||
env_variables.env
|
||||
__pycache__/
|
||||
21
LICENSE
|
|
@ -1,21 +0,0 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2024 mshumer
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
24
README.md
|
|
@ -1 +1,23 @@
|
|||
|
||||
# 昇思MindSopre开源任务挑战赛
|
||||
随着人工智能技术的飞速发展,大模型技术已成为推动AI应用创新的重要力量。为了促进大模型技术的深入研究和应用,昇思MindSpore开源社区联合启智社区发布赛道《昇思MindSopre开源任务挑战赛》,即《基于昇思MindSpore AI框架的套件及大模型应用创新赛》,旨在发掘和培育具有创新性和实用性的大模型应用。
|
||||
|
||||
#赛事任务
|
||||
参赛者需基于昇思MindSpore AI框架和昇思套件,设计并开发一款具有创新性、实用性和可扩展性的人工智能应用。该方案应能够解决某一具体领域的实际问题,并展示出卓越的性能和效果。
|
||||
|
||||
#奖项设置
|
||||
本项赛事设置一等奖、二等奖、三等奖及优秀奖若干。
|
||||
奖项 数量 含税奖金(单位:元)
|
||||
一等奖 1组 30000+获奖证书
|
||||
二等奖 3组 10000+获奖证书
|
||||
三等奖 8组 5000+获奖证书
|
||||
优秀奖 实际参与的15%(不包括一、二、三等奖) 获奖证书
|
||||
|
||||
#赛事委员会
|
||||
主席
|
||||
余跃 鹏城实验室OpenI启智社区运营中心主任
|
||||
杨滔 昇思MindSpore开源社区负责人
|
||||
|
||||
委员
|
||||
刘冰姿 OpenI启智社区开发者主管
|
||||
邓 清 鹏城实验室算网联盟合作与交流部部长
|
||||
何芦微 昇思MindSpore开源社区资深专家
|
||||
|
|
|
|||
89
README_CN.md
|
|
@ -1,89 +0,0 @@
|
|||
# **🌟 SMARTStockBot: 您的专属投资助手🌟**
|
||||
|
||||
欢迎来到 **SMARTStockBot**,这是一款集成了最新科技、市场分析与智能推荐的投资助手。通过自动化数据收集、智能情绪分析、股价预测与行业竞争分析,**SMARTStockBot** 为您提供精准的投资建议,帮助您做出明智的投资决策。在快速变化的市场中,**SMARTStockBot** 是您掌握最新动态、优化投资组合的理想选择。
|
||||
|
||||
## **🚀 项目亮点**
|
||||
|
||||
- **实时财经新闻追踪**:基于RSS数据源,自动获取财经网站最新市场新闻、政策变化和公司公告,确保您始终了解最新的财经资讯。
|
||||
- **智能情绪分析**:利用大模型对新闻标题和摘要进行情绪分析,准确衡量市场情绪,捕捉市场走势。
|
||||
- **股价预测与财务数据整合**:通过MindSpore深度学习模型,结合股价预测数据,生成精准的未来价格预估。
|
||||
- **RAG检索技术**:从历史价格数据、资产负债表、财务报表及公司评级中提取相关信息,为每只股票提供深入的行业分析。
|
||||
- **自动化投资建议**:根据综合分析,包括情绪分数、股价目标和财务状况,生成详细的投资建议并按吸引力对股票进行排名。
|
||||
|
||||
## **🛠️ 实用性与有效性**
|
||||
|
||||
- **提升投资决策效率**:通过快速获取和分析市场动态,帮助您把握投资机会,做出数据驱动的决策。
|
||||
- **多维度数据整合**:结合新闻、财务数据、分析师评级等多维度信息,提供全面的股票分析。
|
||||
- **定期更新的预测**:股价预测与行业分析每天自动更新,确保决策依据始终基于最新数据。
|
||||
- **适用于不同投资风格**:无论是短线交易者还是长期投资者,**SMARTStockBot** 的智能建议都能为您提供支持。
|
||||
|
||||
## **🌐 功能概览**
|
||||
|
||||
- **财经新闻追踪与情绪分析**:自动化爬取财经新闻,生成标题、摘要并分析市场情绪,为每个行业股票提供情绪分数。
|
||||
- **股价预测与RAG技术**:基于MindSpore模型的股价预测结合RAG检索,获取公司历史价格、资产负债表和财务报表数据,确保分析的准确性。
|
||||
- **投资建议生成**:通过综合分析财务健康、市场趋势和行业竞争,提供明确的投资建议(买入、持有或卖出)与有力依据。
|
||||
- **股票吸引力排名**:根据投资吸引力,对同一行业的股票进行排名,帮助投资者优先选择具备最大潜力的标的。
|
||||
|
||||
## **📊 系统功能展示**
|
||||
|
||||
![image] (https://gitlink.org.cn/BBing/mindspore/tree/master/news_report.jpg)
|
||||
|
||||
![image] (https://gitlink.org.cn/BBing/mindspore/tree/master/gpt_investor.png)
|
||||
|
||||
## **📝 安装与使用**
|
||||
|
||||
### **环境准备**
|
||||
|
||||
- 确保您的系统已安装 Python 3.8+。
|
||||
- 配置 MindSpore 进行股价预测模型的支持。
|
||||
|
||||
### **快速开始**
|
||||
|
||||
1. **克隆项目代码**:
|
||||
```bash
|
||||
git clone https://gitlink.org.cn/BBing/mindspore.git
|
||||
```
|
||||
|
||||
2. **安装依赖**:
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
3. **配置项目**:
|
||||
- 在 `config.json` 中设置您所需的RSS源(财经网站相关),配置API密钥(如Tushare API,OpenAI API)。
|
||||
- 编辑 `env_variables.env` 文件,填写大模型API密钥和股价预测相关参数。
|
||||
|
||||
4. **启动应用**:
|
||||
```bash
|
||||
python main.py
|
||||
```
|
||||
|
||||
```bash
|
||||
python utils.py
|
||||
```
|
||||
|
||||
```bash
|
||||
python gradio_app.py
|
||||
```
|
||||
|
||||
### **使用指南**
|
||||
|
||||
- **新闻情绪分析**:SMARTStockBot 会定期从RSS源获取最新财经新闻并分析情绪,访问 `http://127.0.0.1:5000/news` 查看最新的市场情绪分析结果。
|
||||
- **股价预测模型**:基于MindSpore的股价预测每日更新,点击相关股票详情获取最新预测结果。
|
||||
- **股票投资建议生成**:系统自动为每只股票提供综合投资建议,并按投资吸引力进行排名,访问 `http://127.0.0.1:5000/investment-suggestions` 查看建议。
|
||||
|
||||
## **🌟 为何选择SMARTStockBot?**
|
||||
|
||||
- **精准推荐**:结合情绪分析、财务数据与股价预测的智能分析,StockSage 为您提供最具参考价值的投资建议。
|
||||
- **全面信息整合**:无论是新闻情绪、行业分析、公司财务,还是股价预测,StockSage 皆为您整合多维度信息。
|
||||
- **智能预测**:基于MindSpore深度学习的股价预测模型,帮助您提前洞悉市场走势。
|
||||
- **动态更新**:每日自动更新数据,确保您的投资决策基于最新信息。
|
||||
- **行业对比排名**:通过全面分析行业内的每只股票,按投资吸引力排序,帮助您发现最佳投资机会。
|
||||
|
||||
## **🔍 探索SMARTStockBot的新篇章**
|
||||
|
||||
**SMARTStockBot** 是您在瞬息万变的市场中洞察先机的最佳助手。它不仅帮助您捕捉市场动态,还能为您提供经过深入分析的投资建议。立即体验 **SMARTStockBot**,让您的投资决策更加智能与高效!
|
||||
|
||||
---
|
||||
|
||||
**SMARTStockBot** —— 您的专属投资助手,助您在金融市场中稳健前行!
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
{
|
||||
"OPENAI_API_KEY": "",
|
||||
"OPENAI_URL": "",
|
||||
"OPENAI_MODEL": ""
|
||||
}
|
||||
10
config.py
|
|
@ -1,10 +0,0 @@
|
|||
import json
|
||||
|
||||
class Config:
|
||||
with open('config.json', 'r') as f:
|
||||
config_data = json.load(f)
|
||||
|
||||
# 从配置文件中读取 API Key 和 URL
|
||||
LLM_API_KEY = config_data.get('LLM_API_KEY')
|
||||
LLM_URL = config_data.get('LLM_URL')
|
||||
LLM_MODEL = config_data.get('LLM_MODEL')
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
from html_fetcher import fetch_html
|
||||
from openai_processor import generate_summary
|
||||
from models import RawData, SummaryData, db
|
||||
from datetime import datetime
|
||||
import pytz
|
||||
|
||||
def convert_to_beijing_time(rss_time_str):
|
||||
"""将 RSS 时间字符串转换为北京时间。
|
||||
|
||||
Args:
|
||||
rss_time_str: RSS 时间字符串,例如 "Tue, 27 Oct 2021 11:05:29 +0000"
|
||||
|
||||
Returns:
|
||||
北京时间 datetime 对象
|
||||
"""
|
||||
beijing_tz = pytz.timezone('Asia/Shanghai')
|
||||
dt = datetime.strptime(rss_time_str, "%a, %d %b %Y %H:%M:%S %z")
|
||||
dt_utc = dt.astimezone(pytz.utc)
|
||||
dt_beijing = dt_utc.astimezone(beijing_tz)
|
||||
return dt_beijing
|
||||
|
||||
def fetch_html_and_update_raw_data():
|
||||
"""获取 HTML 内容并更新 RawData 表中的 raw_html 字段"""
|
||||
raw_data_entries = RawData.query.filter(RawData.raw_html.is_(None)).all()
|
||||
print(f"Fetching HTML content for {len(raw_data_entries)} RawData entries.")
|
||||
for entry in raw_data_entries:
|
||||
print(f"Fetching HTML content for link: {entry.link}")
|
||||
jina_data = next(fetch_html([entry.link]))[1]
|
||||
entry.raw_html = jina_data
|
||||
db.session.commit()
|
||||
print(f"Updated RawData entry with raw_html for link: {entry.link}")
|
||||
|
||||
def generate_summaries_and_save():
|
||||
"""生成摘要并保存到 SummaryData 表中,同时处理datetime"""
|
||||
# db.session.query(SummaryData).delete() # 如果需要每次都清空 SummaryData 表,请取消注释
|
||||
raw_data_entries = RawData.query.filter(RawData.raw_html.isnot(None)).all()
|
||||
print(f"Generating summaries for {len(raw_data_entries)} RawData entries.")
|
||||
for entry in raw_data_entries:
|
||||
print(f"Generating summary for HTML content from: {entry.link}")
|
||||
summary_data = generate_summary(entry.raw_html)
|
||||
# 将 RSS 时间字符串转换为北京时间
|
||||
if summary_data:
|
||||
bj_pub_date = convert_to_beijing_time(entry.pub_date)
|
||||
# 检查 SummaryData 中是否已经存在此链接
|
||||
existing_summary = SummaryData.query.filter_by(link=entry.link).first()
|
||||
if existing_summary:
|
||||
print(f"Summary for link {entry.link} already exists, skipping.")
|
||||
continue # 跳过此链接
|
||||
|
||||
summary = SummaryData(
|
||||
title=entry.title,
|
||||
link=entry.link,
|
||||
pub_date = entry.pub_date,
|
||||
bj_pub_date = bj_pub_date,
|
||||
summary_title=summary_data.get('title', ''),
|
||||
summary_content=summary_data.get('content', ''),
|
||||
summary_image=summary_data.get('image', ''),
|
||||
)
|
||||
db.session.add(summary)
|
||||
db.session.commit()
|
||||
print(f"Added summary for link: {entry.link} to SummaryData table.")
|
||||
BIN
gpt_investor.png
|
Before Width: | Height: | Size: 337 KiB |
|
|
@ -1,70 +0,0 @@
|
|||
import gradio as gr
|
||||
from utils import get_openai_verdict_2
|
||||
import argparse
|
||||
|
||||
# 最大允许的股票数量
|
||||
parser = argparse.ArgumentParser(description='Stock Analysis Tool')
|
||||
parser.add_argument('--max_tickers', type=int, default=5, help='Maximum number of tickers')
|
||||
args = parser.parse_args()
|
||||
|
||||
max_tickers = args.max_tickers
|
||||
|
||||
# 动态显示股票代码输入框
|
||||
def variable_inputs(k):
|
||||
k = int(k)
|
||||
return [gr.Textbox(visible=True)] * k + [gr.Textbox(visible=False)] * (max_tickers - k)
|
||||
|
||||
# 修改后的分析函数,增加新闻标题与内容
|
||||
async def analyze_stocks(*args):
|
||||
# 提取输入的新闻标题和内容
|
||||
news_title = args[-3]
|
||||
news_content = args[-2]
|
||||
|
||||
# 提取行业
|
||||
industry_input = args[-1]
|
||||
|
||||
# 提取股票代码
|
||||
tickers = args[:-3]
|
||||
tickers = [ticker for ticker in tickers if ticker]
|
||||
|
||||
# 调用异步的股票分析函数,并传递新闻数据
|
||||
result = await get_openai_verdict_2(news_title, news_content, tickers, industry_input)
|
||||
|
||||
return result
|
||||
|
||||
# Gradio界面
|
||||
with gr.Blocks() as demo:
|
||||
with gr.Row():
|
||||
with gr.Column():
|
||||
# 新增新闻输入框
|
||||
news_title_input = gr.Textbox(label="News Title", placeholder="Enter news title here")
|
||||
news_content_input = gr.Textbox(label="News Content", placeholder="Enter news content here", lines=5)
|
||||
|
||||
# 行业输入框
|
||||
industry_input = gr.Textbox(label="Industry")
|
||||
|
||||
# 股票数量选择器
|
||||
num_tickers_slider = gr.Slider(1, max_tickers, value=1, step=1, label="Number of Stock Tickers")
|
||||
|
||||
# 股票代码输入框
|
||||
ticker_inputs = []
|
||||
for i in range(max_tickers):
|
||||
ticker_input = gr.Textbox(label=f"Stock Ticker {i+1}", visible=False)
|
||||
ticker_inputs.append(ticker_input)
|
||||
|
||||
# 根据股票数量显示输入框
|
||||
num_tickers_slider.change(variable_inputs, num_tickers_slider, ticker_inputs)
|
||||
|
||||
with gr.Column():
|
||||
# 输出分析结果
|
||||
output_text = gr.Textbox(label="OpenAI Analysis")
|
||||
|
||||
# 分析按钮
|
||||
concat_btn = gr.Button("Analyze Stocks with OpenAI")
|
||||
|
||||
# 点击按钮调用分析函数
|
||||
concat_btn.click(analyze_stocks, inputs=[*ticker_inputs, news_title_input, news_content_input, industry_input], outputs=output_text)
|
||||
|
||||
# 启动Gradio界面
|
||||
if __name__ == "__main__":
|
||||
demo.launch(ssl_verify=False, share=False, debug=False)
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
import requests
|
||||
from collections import deque
|
||||
import time
|
||||
from config import Config
|
||||
|
||||
jina_key = Config.JINA_API_KEY
|
||||
|
||||
def fetch_html(urls):
|
||||
queue = deque(urls)
|
||||
headers = {
|
||||
"Authorization": f"Bearer {jina_key}", # Replace with your authorization information
|
||||
"Accept": "application/json"
|
||||
}
|
||||
while queue:
|
||||
url = queue.popleft()
|
||||
print(f"Fetching HTML content from: {url}")
|
||||
jina_url = f"https://r.jina.ai/{url}"
|
||||
response = requests.get(jina_url, headers=headers)
|
||||
if response.status_code == 200:
|
||||
# Assuming the response contains the HTML content in the 'data' field
|
||||
data = response.json().get('data', {})
|
||||
content = data.get('content', '')
|
||||
yield url, content
|
||||
print(f"Fetched HTML content from: {url}")
|
||||
else:
|
||||
print(f"Request to r.jina.ai failed, status code: {response.status_code}")
|
||||
if len(queue) > 0:
|
||||
time.sleep(6) # Control 10 messages per minute
|
||||
BIN
instance/rss.db
56
main.py
|
|
@ -1,56 +0,0 @@
|
|||
from flask import Flask, jsonify, render_template_string,render_template
|
||||
from sqlalchemy import false
|
||||
from config import Config
|
||||
from flask_cors import CORS
|
||||
from models import db, RSSFeed, RawData, SummaryData
|
||||
from rss_updater import update_rss_feeds
|
||||
from data_processor import fetch_html_and_update_raw_data, generate_summaries_and_save
|
||||
import atexit
|
||||
|
||||
|
||||
app = Flask(__name__, static_folder='static', template_folder='templates')
|
||||
CORS(app)
|
||||
app.config.from_object(Config)
|
||||
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///rss.db'
|
||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
||||
|
||||
db.init_app(app)
|
||||
|
||||
with app.app_context():
|
||||
db.create_all()
|
||||
print("Database initialized and tables created.")
|
||||
|
||||
@app.route('/update')
|
||||
def update_data():
|
||||
has_new_data = update_rss_feeds()
|
||||
if has_new_data:
|
||||
fetch_html_and_update_raw_data()
|
||||
return jsonify({'message': 'RSS feeds updated successfully.'})
|
||||
|
||||
@app.route('/generate_summaries')
|
||||
def generate_summaries():
|
||||
generate_summaries_and_save()
|
||||
return jsonify({'message': 'Summaries generated and saved successfully. Existing summaries have been overwritten.'})
|
||||
|
||||
# 获取所有 SummaryData 数据,仅后端返回json
|
||||
@app.route('/api/summarydata', methods=['GET'])
|
||||
def get_summarydata():
|
||||
summarydata = SummaryData.query.all()
|
||||
return jsonify([summarydatum.to_dict() for summarydatum in summarydata])
|
||||
|
||||
@app.route('/index')
|
||||
def index():
|
||||
summarydata = SummaryData.query.all()
|
||||
summary_list = [summary.to_dict() for summary in summarydata]
|
||||
return render_template('index.html', summary_list=summary_list)
|
||||
|
||||
|
||||
def shutdown_scheduler():
|
||||
print("Scheduler is not running.")
|
||||
|
||||
atexit.register(shutdown_scheduler)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("Starting Flask application.")
|
||||
app.run(port=5000)
|
||||
44
models.py
|
|
@ -1,44 +0,0 @@
|
|||
from flask_sqlalchemy import SQLAlchemy
|
||||
|
||||
db = SQLAlchemy()
|
||||
|
||||
class RSSFeed(db.Model):
|
||||
"""RSS 订阅信息模型"""
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
url = db.Column(db.String, nullable=False)
|
||||
title = db.Column(db.String)
|
||||
pub_date = db.Column(db.TEXT)
|
||||
link = db.Column(db.String, unique=True, nullable=False)
|
||||
|
||||
class RawData(db.Model):
|
||||
"""原始数据模型"""
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
url = db.Column(db.String, nullable=False)
|
||||
title = db.Column(db.String)
|
||||
pub_date = db.Column(db.TEXT)
|
||||
link = db.Column(db.String, unique=True, nullable=False)
|
||||
raw_html = db.Column(db.String) # 存储获取到的 HTML 内容
|
||||
|
||||
class SummaryData(db.Model):
|
||||
"""摘要数据模型"""
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
title = db.Column(db.String)
|
||||
link = db.Column(db.String, unique=True, nullable=False)
|
||||
pub_date = db.Column(db.TEXT)
|
||||
bj_pub_date = db.Column(db.DateTime)
|
||||
summary_title = db.Column(db.String)
|
||||
summary_content = db.Column(db.String)
|
||||
summary_image = db.Column(db.String, nullable=True)
|
||||
def to_dict(self):
|
||||
return {
|
||||
'id': self.id,
|
||||
'title': self.title,
|
||||
'link': self.link,
|
||||
'bj_pub_date': self.bj_pub_date,
|
||||
'pub_date': self.pub_date,
|
||||
'summary_title': self.summary_title,
|
||||
'summary_content': self.summary_content,
|
||||
'summary_image': self.summary_image
|
||||
}
|
||||
|
||||
|
||||
BIN
news_report.jpg
|
Before Width: | Height: | Size: 108 KiB |
|
|
@ -1,62 +0,0 @@
|
|||
import requests
|
||||
from config import Config
|
||||
import json
|
||||
|
||||
openai_key = Config.OPENAI_API_KEY
|
||||
openai_url = Config.OPENAI_URL
|
||||
MODEL = Config.OPENAI_MODEL
|
||||
|
||||
def generate_summary(jina_data):
|
||||
#print(f"Generating summary for HTML content.")
|
||||
prompt = '''你的任务是作为一个高级翻译和编辑,理解发给你的内容,从中生产加工输出以下信息:标题、正文、图片。确保你的响应符合以下JSON结构,准确反映提取的数据,不做修改:```json
|
||||
{
|
||||
"title": "文章标题",
|
||||
"content": "文章摘要",
|
||||
"image": "文章包含的图片链接,保留url,如果没有留空"
|
||||
}
|
||||
```重要的是你的输出严格遵守这种格式。
|
||||
-严格确保统一翻译为中文
|
||||
-不翻译公司名称、人名 '''
|
||||
siliconflow_url = openai_url
|
||||
siliconflow_payload = {
|
||||
"model": MODEL,
|
||||
"messages": [
|
||||
{
|
||||
"role": "assistant",
|
||||
"content": f"{prompt}{jina_data}" # 将 jina_data 添加到 SiliconFlow 的 messages
|
||||
}
|
||||
]
|
||||
}
|
||||
siliconflow_headers = {
|
||||
"accept": "application/json",
|
||||
"content-type": "application/json",
|
||||
"authorization": f"Bearer {openai_key}"
|
||||
}
|
||||
|
||||
try:
|
||||
# 使用 requests 发送请求到 SiliconFlow,设置超时时间为 15 秒
|
||||
siliconflow_response = requests.post(siliconflow_url, json=siliconflow_payload, headers=siliconflow_headers, timeout=15)
|
||||
siliconflow_response.raise_for_status() # 检查 HTTP 状态码,如果发生错误,则抛出异常
|
||||
|
||||
# 解析 SiliconFlow 的响应
|
||||
response = siliconflow_response.json()
|
||||
result_content = response['choices'][0]['message']['content']
|
||||
|
||||
# 处理 SiliconFlow 的响应
|
||||
print("Generated summary successfully.")
|
||||
# 解析 result_content 中的 JSON 数据
|
||||
try:
|
||||
# 去掉 JSON 字符串前后的 ```json 标记
|
||||
json_str = result_content.strip().lstrip('```json').rstrip('```').strip()
|
||||
parsed_json = json.loads(json_str)
|
||||
return parsed_json
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"Failed to parse JSON response: {e}")
|
||||
return None
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"SiliconFlow 请求错误:{e}")
|
||||
return None
|
||||
except json.decoder.JSONDecodeError as e:
|
||||
print(f"Failed to parse JSON response: {e}")
|
||||
return None
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Datasource local storage ignored files
|
||||
/../../../../../../:\PycharmSpace\ForkProjects\Time-Forecasting\Informer2020-main\.idea/dataSources/
|
||||
/dataSources.local.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.7 (torchENV)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
<component name="PyDocumentationSettings">
|
||||
<option name="format" value="PLAIN" />
|
||||
<option name="myDocStringFormat" value="Plain" />
|
||||
</component>
|
||||
</module>
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CsvFileAttributes">
|
||||
<option name="attributeMap">
|
||||
<map>
|
||||
<entry key="\exp\exp_informer.py">
|
||||
<value>
|
||||
<Attribute>
|
||||
<option name="separator" value="," />
|
||||
</Attribute>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="\main_informer_stock.py">
|
||||
<value>
|
||||
<Attribute>
|
||||
<option name="separator" value="," />
|
||||
</Attribute>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="\run.ipynb">
|
||||
<value>
|
||||
<Attribute>
|
||||
<option name="separator" value="," />
|
||||
</Attribute>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="\show_results.py">
|
||||
<value>
|
||||
<Attribute>
|
||||
<option name="separator" value=":" />
|
||||
</Attribute>
|
||||
</value>
|
||||
</entry>
|
||||
</map>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ignoredPackages">
|
||||
<value>
|
||||
<list size="24">
|
||||
<item index="0" class="java.lang.String" itemvalue="scipy" />
|
||||
<item index="1" class="java.lang.String" itemvalue="six" />
|
||||
<item index="2" class="java.lang.String" itemvalue="scikit-learn" />
|
||||
<item index="3" class="java.lang.String" itemvalue="python-dateutil" />
|
||||
<item index="4" class="java.lang.String" itemvalue="sklearn" />
|
||||
<item index="5" class="java.lang.String" itemvalue="kiwisolver" />
|
||||
<item index="6" class="java.lang.String" itemvalue="numpy" />
|
||||
<item index="7" class="java.lang.String" itemvalue="requests" />
|
||||
<item index="8" class="java.lang.String" itemvalue="svm" />
|
||||
<item index="9" class="java.lang.String" itemvalue="pandas" />
|
||||
<item index="10" class="java.lang.String" itemvalue="colorama" />
|
||||
<item index="11" class="java.lang.String" itemvalue="certifi" />
|
||||
<item index="12" class="java.lang.String" itemvalue="matplotlib" />
|
||||
<item index="13" class="java.lang.String" itemvalue="pytz" />
|
||||
<item index="14" class="java.lang.String" itemvalue="urllib3" />
|
||||
<item index="15" class="java.lang.String" itemvalue="pyparsing" />
|
||||
<item index="16" class="java.lang.String" itemvalue="tensorflow" />
|
||||
<item index="17" class="java.lang.String" itemvalue="unittest" />
|
||||
<item index="18" class="java.lang.String" itemvalue="scikit_learn" />
|
||||
<item index="19" class="java.lang.String" itemvalue="torch" />
|
||||
<item index="20" class="java.lang.String" itemvalue="dgl" />
|
||||
<item index="21" class="java.lang.String" itemvalue="SciencePlots" />
|
||||
<item index="22" class="java.lang.String" itemvalue="tensorboard" />
|
||||
<item index="23" class="java.lang.String" itemvalue="torchvision" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
||||
<option name="ignoredErrors">
|
||||
<list>
|
||||
<option value="N802" />
|
||||
</list>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (torchENV)" project-jdk-type="Python SDK" />
|
||||
</project>
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/Informer2020-main.iml" filepath="$PROJECT_DIR$/.idea/Informer2020-main.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
FROM continuumio/miniconda3:4.7.12
|
||||
|
||||
ADD ./environment.yml ./environment.yml
|
||||
|
||||
RUN conda install -n base -c conda-forge mamba && \
|
||||
mamba env update -n base -f ./environment.yml && \
|
||||
conda clean -afy
|
||||
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
IMAGE := informer
|
||||
ROOT := $(shell dirname $(realpath $(firstword ${MAKEFILE_LIST})))
|
||||
PARENT_ROOT := $(shell dirname ${ROOT})
|
||||
PORT := 8888
|
||||
|
||||
DOCKER_PARAMETERS := \
|
||||
--user $(shell id -u) \
|
||||
-v ${ROOT}:/app \
|
||||
-w /app \
|
||||
-e HOME=/tmp
|
||||
|
||||
init:
|
||||
docker build -t ${IMAGE} .
|
||||
|
||||
dataset:
|
||||
mkdir -p data/ETT && \
|
||||
wget -O data/ETT/ETTh1.csv https://raw.githubusercontent.com/zhouhaoyi/ETDataset/main/ETT-small/ETTh1.csv && \
|
||||
wget -O data/ETT/ETTh2.csv https://raw.githubusercontent.com/zhouhaoyi/ETDataset/main/ETT-small/ETTh2.csv && \
|
||||
wget -O data/ETT/ETTm1.csv https://raw.githubusercontent.com/zhouhaoyi/ETDataset/main/ETT-small/ETTm1.csv && \
|
||||
wget -O data/ETT/ETTm2.csv https://raw.githubusercontent.com/zhouhaoyi/ETDataset/main/ETT-small/ETTm2.csv && \
|
||||
wget -O data/ETT/ECL.csv "https://drive.google.com/uc?export=download&id=1rUPdR7R2iWFW-LMoDdHoO2g4KgnkpFzP" && \
|
||||
wget -O data/ETT/WTH.csv "https://drive.google.com/uc?export=download&id=1UBRz-aM_57i_KCC-iaSWoKDPTGGv6EaG"
|
||||
|
||||
jupyter:
|
||||
docker run -d --rm ${DOCKER_PARAMETERS} -e HOME=/tmp -p ${PORT}:8888 ${IMAGE} \
|
||||
bash -c "jupyter lab --ip=0.0.0.0 --no-browser --NotebookApp.token=''"
|
||||
|
||||
run_module: .require-module
|
||||
docker run -i --rm ${DOCKER_PARAMETERS} \
|
||||
${IMAGE} ${module}
|
||||
|
||||
bash_docker:
|
||||
docker run -it --rm ${DOCKER_PARAMETERS} ${IMAGE}
|
||||
|
||||
.require-module:
|
||||
ifndef module
|
||||
$(error module is required)
|
||||
endif
|
||||
|
|
@ -1 +0,0 @@
|
|||
|
||||
|
|
@ -1,252 +0,0 @@
|
|||
import os
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from mindspore import Dataset
|
||||
from utils.tools import StandardScaler
|
||||
from utils.timefeatures import time_features
|
||||
|
||||
import warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
|
||||
class Dataset_ETT_hour(Dataset):
|
||||
def __init__(self, root_path, flag='train', size=None,
|
||||
features='S', data_path='ETTh1.csv',
|
||||
target='OT', scale=True, inverse=False, timeenc=0, freq='h', cols=None):
|
||||
if size is None:
|
||||
self.seq_len = 24 * 4 * 4
|
||||
self.label_len = 24 * 4
|
||||
self.pred_len = 24 * 4
|
||||
else:
|
||||
self.seq_len, self.label_len, self.pred_len = size
|
||||
|
||||
assert flag in ['train', 'test', 'val']
|
||||
type_map = {'train': 0, 'val': 1, 'test': 2}
|
||||
self.set_type = type_map[flag]
|
||||
|
||||
self.features = features
|
||||
self.target = target
|
||||
self.scale = scale
|
||||
self.inverse = inverse
|
||||
self.timeenc = timeenc
|
||||
self.freq = freq
|
||||
|
||||
self.root_path = root_path
|
||||
self.data_path = data_path
|
||||
self.__read_data__()
|
||||
|
||||
def __read_data__(self):
|
||||
self.scaler = StandardScaler()
|
||||
df_raw = pd.read_csv(os.path.join(self.root_path, self.data_path))
|
||||
|
||||
border1s = [0, 12 * 30 * 24 - self.seq_len, 12 * 30 * 24 + 4 * 30 * 24 - self.seq_len]
|
||||
border2s = [12 * 30 * 24, 12 * 30 * 24 + 4 * 30 * 24, 12 * 30 * 24 + 8 * 30 * 24]
|
||||
border1 = border1s[self.set_type]
|
||||
border2 = border2s[self.set_type]
|
||||
|
||||
if self.features in ['M', 'MS']:
|
||||
cols_data = df_raw.columns[1:]
|
||||
df_data = df_raw[cols_data]
|
||||
elif self.features == 'S':
|
||||
df_data = df_raw[[self.target]]
|
||||
|
||||
if self.scale:
|
||||
train_data = df_data[border1s[0]:border2s[0]]
|
||||
self.scaler.fit(train_data.values)
|
||||
data = self.scaler.transform(df_data.values)
|
||||
else:
|
||||
data = df_data.values
|
||||
|
||||
df_stamp = df_raw[['date']][border1:border2]
|
||||
df_stamp['date'] = pd.to_datetime(df_stamp.date)
|
||||
data_stamp = time_features(df_stamp, timeenc=self.timeenc, freq=self.freq)
|
||||
|
||||
self.data_x = data[border1:border2]
|
||||
self.data_y = df_data.values[border1:border2] if self.inverse else data[border1:border2]
|
||||
self.data_stamp = data_stamp
|
||||
|
||||
def __getitem__(self, index):
|
||||
s_begin = index
|
||||
s_end = s_begin + self.seq_len
|
||||
r_begin = s_end - self.label_len
|
||||
r_end = r_begin + self.label_len + self.pred_len
|
||||
|
||||
seq_x = self.data_x[s_begin:s_end]
|
||||
seq_y = np.concatenate([self.data_x[r_begin:r_begin+self.label_len], self.data_y[r_begin+self.label_len:r_end]], 0) if self.inverse else self.data_y[r_begin:r_end]
|
||||
seq_x_mark = self.data_stamp[s_begin:s_end]
|
||||
seq_y_mark = self.data_stamp[r_begin:r_end]
|
||||
|
||||
return seq_x, seq_y, seq_x_mark, seq_y_mark
|
||||
|
||||
def __len__(self):
|
||||
return len(self.data_x) - self.seq_len - self.pred_len + 1
|
||||
|
||||
def inverse_transform(self, data):
|
||||
return self.scaler.inverse_transform(data)
|
||||
|
||||
# 对 Dataset_ETT_minute 和 Dataset_Custom 进行相似的转换
|
||||
class Dataset_ETT_minute(Dataset_ETT_hour):
|
||||
def __init__(self, root_path, flag='train', size=None,
|
||||
features='S', data_path='ETTm1.csv',
|
||||
target='OT', scale=True, inverse=False, timeenc=0, freq='t', cols=None):
|
||||
super().__init__(root_path, flag, size, features, data_path, target, scale, inverse, timeenc, freq, cols)
|
||||
|
||||
def __read_data__(self):
|
||||
self.scaler = StandardScaler()
|
||||
df_raw = pd.read_csv(os.path.join(self.root_path, self.data_path))
|
||||
|
||||
border1s = [0, 12 * 30 * 24 * 4 - self.seq_len, 12 * 30 * 24 * 4 + 4 * 30 * 24 * 4 - self.seq_len]
|
||||
border2s = [12 * 30 * 24 * 4, 12 * 30 * 24 * 4 + 4 * 30 * 24 * 4, 12 * 30 * 24 * 4 + 8 * 30 * 24 * 4]
|
||||
border1 = border1s[self.set_type]
|
||||
border2 = border2s[self.set_type]
|
||||
|
||||
if self.features in ['M', 'MS']:
|
||||
cols_data = df_raw.columns[1:]
|
||||
df_data = df_raw[cols_data]
|
||||
elif self.features == 'S':
|
||||
df_data = df_raw[[self.target]]
|
||||
|
||||
if self.scale:
|
||||
train_data = df_data[border1s[0]:border2s[0]]
|
||||
self.scaler.fit(train_data.values)
|
||||
data = self.scaler.transform(df_data.values)
|
||||
else:
|
||||
data = df_data.values
|
||||
|
||||
df_stamp = df_raw[['date']][border1:border2]
|
||||
df_stamp['date'] = pd.to_datetime(df_stamp.date)
|
||||
data_stamp = time_features(df_stamp, timeenc=self.timeenc, freq=self.freq)
|
||||
|
||||
self.data_x = data[border1:border2]
|
||||
self.data_y = df_data.values[border1:border2] if self.inverse else data[border1:border2]
|
||||
self.data_stamp = data_stamp
|
||||
|
||||
class Dataset_Custom(Dataset_ETT_hour):
|
||||
def __init__(self, root_path, flag='train', size=None,
|
||||
features='S', data_path='ETTh1.csv',
|
||||
target='OT', scale=True, inverse=False, timeenc=0, freq='h', cols=None):
|
||||
super().__init__(root_path, flag, size, features, data_path, target, scale, inverse, timeenc, freq, cols)
|
||||
|
||||
def __read_data__(self):
|
||||
self.scaler = StandardScaler()
|
||||
df_raw = pd.read_csv(os.path.join(self.root_path, self.data_path))
|
||||
|
||||
if self.cols:
|
||||
cols = self.cols.copy()
|
||||
cols.remove(self.target)
|
||||
else:
|
||||
cols = list(df_raw.columns)
|
||||
cols.remove(self.target)
|
||||
cols.remove('date')
|
||||
df_raw = df_raw[['date'] + cols + [self.target]]
|
||||
|
||||
num_train = int(len(df_raw) * 0.7)
|
||||
num_test = int(len(df_raw) * 0.2)
|
||||
num_vali = len(df_raw) - num_train - num_test
|
||||
border1s = [0, num_train - self.seq_len, len(df_raw) - num_test - self.seq_len]
|
||||
border2s = [num_train, num_train + num_vali, len(df_raw)]
|
||||
border1 = border1s[self.set_type]
|
||||
border2 = border2s[self.set_type]
|
||||
|
||||
if self.features in ['M', 'MS']:
|
||||
cols_data = df_raw.columns[1:]
|
||||
df_data = df_raw[cols_data]
|
||||
elif self.features == 'S':
|
||||
df_data = df_raw[[self.target]]
|
||||
|
||||
if self.scale:
|
||||
train_data = df_data[border1s[0]:border2s[0]]
|
||||
self.scaler.fit(train_data.values)
|
||||
data = self.scaler.transform(df_data.values)
|
||||
else:
|
||||
data = df_data.values
|
||||
|
||||
df_stamp = df_raw[['date']][border1:border2]
|
||||
df_stamp['date'] = pd.to_datetime(df_stamp.date)
|
||||
data_stamp = time_features(df_stamp, timeenc=self.timeenc, freq=self.freq)
|
||||
|
||||
self.data_x = data[border1:border2]
|
||||
self.data_y = df_data.values[border1:border2] if self.inverse else data[border1:border2]
|
||||
self.data_stamp = data_stamp
|
||||
|
||||
class Dataset_Pred(Dataset):
|
||||
def __init__(self, root_path, flag='pred', size=None,
|
||||
features='S', data_path='ETTh1.csv',
|
||||
target='OT', scale=True, inverse=False, timeenc=0, freq='15min', cols=None):
|
||||
if size is None:
|
||||
self.seq_len = 24 * 4 * 4
|
||||
self.label_len = 24 * 4
|
||||
self.pred_len = 24 * 4
|
||||
else:
|
||||
self.seq_len, self.label_len, self.pred_len = size
|
||||
|
||||
assert flag == 'pred'
|
||||
|
||||
self.features = features
|
||||
self.target = target
|
||||
self.scale = scale
|
||||
self.inverse = inverse
|
||||
self.timeenc = timeenc
|
||||
self.freq = freq
|
||||
self.cols = cols
|
||||
self.root_path = root_path
|
||||
self.data_path = data_path
|
||||
self.__read_data__()
|
||||
|
||||
def __read_data__(self):
|
||||
self.scaler = StandardScaler()
|
||||
df_raw = pd.read_csv(os.path.join(self.root_path, self.data_path))
|
||||
|
||||
if self.cols:
|
||||
cols = self.cols.copy()
|
||||
cols.remove(self.target)
|
||||
else:
|
||||
cols = list(df_raw.columns)
|
||||
cols.remove(self.target)
|
||||
cols.remove('date')
|
||||
df_raw = df_raw[['date'] + cols + [self.target]]
|
||||
|
||||
border1 = len(df_raw) - self.seq_len
|
||||
border2 = len(df_raw)
|
||||
|
||||
if self.features in ['M', 'MS']:
|
||||
cols_data = df_raw.columns[1:]
|
||||
df_data = df_raw[cols_data]
|
||||
elif self.features == 'S':
|
||||
df_data = df_raw[[self.target]]
|
||||
|
||||
if self.scale:
|
||||
self.scaler.fit(df_data.values)
|
||||
data = self.scaler.transform(df_data.values)
|
||||
else:
|
||||
data = df_data.values
|
||||
|
||||
tmp_stamp = df_raw[['date']][border1:border2]
|
||||
tmp_stamp['date'] = pd.to_datetime(tmp_stamp.date)
|
||||
pred_dates = pd.date_range(tmp_stamp.date.values[-1], periods=self.pred_len + 1, freq=self.freq)
|
||||
|
||||
df_stamp = pd.DataFrame(columns=['date'])
|
||||
df_stamp.date = list(tmp_stamp.date.values) + list(pred_dates[1:])
|
||||
data_stamp = time_features(df_stamp, timeenc=self.timeenc, freq=self.freq[-1:])
|
||||
|
||||
self.data_x = data[border1:border2]
|
||||
self.data_y = df_data.values[border1:border2] if self.inverse else data[border1:border2]
|
||||
self.data_stamp = data_stamp
|
||||
|
||||
def __getitem__(self, index):
|
||||
s_begin = index
|
||||
s_end = s_begin + self.seq_len
|
||||
r_begin = s_end - self.label_len
|
||||
r_end = r_begin + self.label_len + self.pred_len
|
||||
|
||||
seq_x = self.data_x[s_begin:s_end]
|
||||
seq_y = self.data_x[r_begin:r_begin + self.label_len] if self.inverse else self.data_y[r_begin:r_begin + self.label_len]
|
||||
seq_x_mark = self.data_stamp[s_begin:s_end]
|
||||
seq_y_mark = self.data_stamp[r_begin:r_end]
|
||||
|
||||
return seq_x, seq_y, seq_x_mark, seq_y_mark
|
||||
|
||||
def __len__(self):
|
||||
return len(self.data_x) - self.seq_len + 1
|
||||
|
||||
def inverse_transform(self, data):
|
||||
return self.scaler.inverse_transform(data)
|
||||
|
|
@ -1,978 +0,0 @@
|
|||
date,Close,High,Low,Open,Vol
|
||||
2014/1/2,2109.387,2113.11,2101.016,2112.126,68485486
|
||||
2014/1/3,2083.136,2102.167,2075.899,2101.542,84497241
|
||||
2014/1/6,2045.709,2078.684,2034.006,2078.684,89587608
|
||||
2014/1/7,2047.317,2052.279,2029.246,2034.224,63402938
|
||||
2014/1/8,2044.34,2062.952,2037.11,2047.256,71647364
|
||||
2014/1/9,2027.622,2057.196,2026.446,2041.773,75941883
|
||||
2014/1/10,2013.298,2029.297,2008.007,2023.535,75616121
|
||||
2014/1/13,2009.564,2027.181,2000.404,2014.978,66544776
|
||||
2014/1/14,2026.842,2027.428,2001.135,2007.156,70366614
|
||||
2014/1/15,2023.348,2027.409,2010.204,2024.228,67436222
|
||||
2014/1/16,2023.701,2034.707,2014.407,2022.538,72755719
|
||||
2014/1/17,2004.949,2017.868,2001.33,2017.522,67305720
|
||||
2014/1/20,1991.253,2005.938,1984.824,2001.894,56271247
|
||||
2014/1/21,2008.313,2014.152,1992.015,1992.015,59844911
|
||||
2014/1/22,2051.749,2052.339,2008.93,2009.969,98892856
|
||||
2014/1/23,2042.18,2052.528,2039.052,2048.331,84210585
|
||||
2014/1/24,2054.392,2060.986,2034.453,2037.667,92947921
|
||||
2014/1/27,2033.3,2044.846,2029.626,2044.272,88815426
|
||||
2014/1/28,2038.513,2047.129,2026.987,2036.402,72529043
|
||||
2014/1/29,2049.914,2051.583,2039.771,2042.176,73865462
|
||||
2014/1/30,2033.083,2045.931,2031.466,2045.931,62615184
|
||||
2014/2/7,2044.497,2044.73,2014.698,2022.323,73598755
|
||||
2014/2/10,2086.067,2087.975,2049.984,2049.984,124331833
|
||||
2014/2/11,2103.671,2111.061,2082.522,2086.177,142211324
|
||||
2014/2/12,2109.955,2110.904,2096.509,2103.828,126333186
|
||||
2014/2/13,2098.401,2122.826,2096.966,2106.934,146532634
|
||||
2014/2/14,2115.848,2116.186,2095.09,2097.32,111517950
|
||||
2014/2/17,2135.415,2136.447,2117.689,2124.88,140244443
|
||||
2014/2/18,2119.066,2134.143,2113.128,2134.143,142869308
|
||||
2014/2/19,2142.554,2152.961,2111.168,2116.919,151261246
|
||||
2014/2/20,2138.782,2177.978,2136.481,2152.891,157052276
|
||||
2014/2/21,2113.693,2132.703,2098.328,2131.592,117662651
|
||||
2014/2/24,2076.686,2099.717,2058.791,2099.717,123555308
|
||||
2014/2/25,2034.219,2087.616,2026.543,2077.285,140132978
|
||||
2014/2/26,2041.254,2041.627,2014.381,2026.61,110112687
|
||||
2014/2/27,2047.354,2068.314,2036.391,2045.096,132163852
|
||||
2014/2/28,2056.302,2058.489,2020.935,2040.624,111637907
|
||||
2014/3/3,2075.235,2078.333,2047.067,2052.075,127460891
|
||||
2014/3/4,2071.473,2074.025,2050.125,2068.107,115925792
|
||||
2014/3/5,2053.084,2074.815,2050.175,2073.295,107733082
|
||||
2014/3/6,2059.578,2065.79,2030.946,2050.032,109290133
|
||||
2014/3/7,2057.908,2079.49,2050.47,2058.375,103709540
|
||||
2014/3/10,1999.065,2042.634,1995.549,2042.352,115696666
|
||||
2014/3/11,2001.157,2008.071,1985.599,1994.415,92705265
|
||||
2014/3/12,1997.692,2011.06,1974.382,1996.239,101361719
|
||||
2014/3/13,2019.111,2029.12,1996.529,2000.695,100978116
|
||||
2014/3/14,2004.339,2017.913,1990.98,2008.825,87775111
|
||||
2014/3/17,2023.673,2024.372,1999.249,2009.882,86250374
|
||||
2014/3/18,2025.196,2034.917,2020.41,2026.224,96777193
|
||||
2014/3/19,2021.734,2022.181,2002.441,2019.98,95180797
|
||||
2014/3/20,1993.479,2030.847,1993.002,2017.22,110333048
|
||||
2014/3/21,2047.619,2052.472,1986.071,1987.679,144477656
|
||||
2014/3/24,2066.279,2074.056,2043.33,2050.827,147700085
|
||||
2014/3/25,2067.311,2079.551,2057.491,2063.323,131822232
|
||||
2014/3/26,2063.67,2074.572,2057.648,2070.574,102611116
|
||||
2014/3/27,2046.588,2073.982,2042.713,2060.812,119149374
|
||||
2014/3/28,2041.712,2060.134,2035.243,2046.851,121681965
|
||||
2014/3/31,2033.306,2048.134,2024.185,2043.045,94356536
|
||||
2014/4/1,2047.46,2050.681,2028.096,2031.005,83286576
|
||||
2014/4/2,2058.988,2060.778,2046.742,2049.423,102658525
|
||||
2014/4/3,2043.702,2066.007,2037.447,2063.497,108618421
|
||||
2014/4/4,2058.831,2060.104,2035.221,2037.552,83189056
|
||||
2014/4/8,2098.284,2102.452,2052.9,2054.53,133370983
|
||||
2014/4/9,2105.237,2108.75,2095.64,2100.651,105340471
|
||||
2014/4/10,2134.3,2146.67,2098.079,2105.876,156789609
|
||||
2014/4/11,2130.542,2138.651,2120.179,2130.368,131768359
|
||||
2014/4/14,2131.539,2134.434,2116.61,2127.409,102077853
|
||||
2014/4/15,2101.601,2125.902,2098.15,2125.902,107531151
|
||||
2014/4/16,2105.122,2112.05,2092.157,2097.213,89361657
|
||||
2014/4/17,2098.885,2110.716,2095.714,2108.947,89896325
|
||||
2014/4/18,2097.748,2099.637,2081.185,2091.48,88155695
|
||||
2014/4/21,2065.826,2103.078,2065.234,2085.98,96378369
|
||||
2014/4/22,2072.831,2073.663,2047.332,2062.787,98719882
|
||||
2014/4/23,2067.382,2076.349,2059.109,2068.084,78531521
|
||||
2014/4/24,2057.033,2075.757,2056.193,2064.156,78185955
|
||||
2014/4/25,2036.519,2065.643,2035.566,2060.538,93042333
|
||||
2014/4/28,2003.487,2035.99,2000.137,2033.337,89795262
|
||||
2014/4/29,2020.341,2021.68,1997.64,2001.896,76221275
|
||||
2014/4/30,2026.358,2029.538,2016.577,2020.438,74528578
|
||||
2014/5/5,2027.353,2028.957,2007.351,2022.178,79933395
|
||||
2014/5/6,2028.038,2038.705,2021.485,2024.256,74609411
|
||||
2014/5/7,2010.083,2024.631,2008.451,2023.152,74360192
|
||||
2014/5/8,2015.274,2036.941,2005.685,2006.853,77865393
|
||||
2014/5/9,2011.135,2020.454,2001.3,2016.501,76224244
|
||||
2014/5/12,2052.871,2055.506,2016.638,2022.932,115742077
|
||||
2014/5/13,2050.728,2061.06,2043.547,2055.079,97223388
|
||||
2014/5/14,2047.91,2056.574,2042.744,2049.27,72011125
|
||||
2014/5/15,2024.974,2047.316,2022.861,2044.377,75845154
|
||||
2014/5/16,2026.504,2027.756,2012.694,2023.596,66353660
|
||||
2014/5/19,2005.183,2023.267,1996.015,2023.014,65329438
|
||||
2014/5/20,2008.119,2018.156,2002.759,2011.846,61345382
|
||||
2014/5/21,2024.951,2025.194,1991.055,2001.306,61811547
|
||||
2014/5/22,2021.285,2041.96,2018.877,2023.148,74728474
|
||||
2014/5/23,2034.569,2034.569,2017.739,2020.115,63488065
|
||||
2014/5/26,2041.476,2045.381,2035.094,2042.028,70281220
|
||||
2014/5/27,2034.565,2044.148,2032.839,2039.791,67577889
|
||||
2014/5/28,2050.228,2052.656,2029.336,2034.561,81338642
|
||||
2014/5/29,2040.595,2057.077,2039.238,2051.84,81242921
|
||||
2014/5/30,2039.212,2046.96,2031.373,2040.394,75148898
|
||||
2014/6/3,2038.305,2049.576,2037.3,2039.196,71584124
|
||||
2014/6/4,2024.834,2038.481,2012.913,2037.989,72412771
|
||||
2014/6/5,2040.878,2041.701,2016.175,2019.442,67949536
|
||||
2014/6/6,2029.956,2041.573,2022.158,2040.864,66021744
|
||||
2014/6/9,2030.502,2045.255,2023.198,2024.942,64788317
|
||||
2014/6/10,2052.532,2052.765,2026.389,2033.207,79623717
|
||||
2014/6/11,2054.948,2056.631,2045.407,2049.128,74444354
|
||||
2014/6/12,2051.713,2057.105,2045.962,2051.582,81711186
|
||||
2014/6/13,2070.715,2073.596,2048.618,2049.206,97174806
|
||||
2014/6/16,2085.983,2087.322,2069.441,2070.699,95939770
|
||||
2014/6/17,2066.698,2080.482,2064.666,2080.482,87800481
|
||||
2014/6/18,2055.519,2066.913,2051.746,2064.383,87245350
|
||||
2014/6/19,2023.735,2059.255,2017.653,2054.62,92914274
|
||||
2014/6/20,2026.674,2027.148,2010.53,2013.414,67167246
|
||||
2014/6/23,2024.365,2033.32,2022.917,2026.226,70485162
|
||||
2014/6/24,2033.931,2034.707,2021.75,2023.699,71214634
|
||||
2014/6/25,2025.502,2030.616,2018.36,2030.433,67539610
|
||||
2014/6/26,2038.677,2040.754,2025.314,2025.662,80955778
|
||||
2014/6/27,2036.51,2043.982,2025.073,2031.907,97592017
|
||||
2014/6/30,2048.327,2052.342,2038.527,2038.613,96666598
|
||||
2014/7/1,2050.381,2052.635,2041.937,2051.225,98457409
|
||||
2014/7/2,2059.418,2060.595,2044.035,2049.485,109553911
|
||||
2014/7/3,2063.229,2066.641,2048.081,2051.632,122926582
|
||||
2014/7/4,2059.375,2065.078,2054.217,2062.358,105008792
|
||||
2014/7/7,2059.927,2064.043,2050.887,2058.128,97168754
|
||||
2014/7/8,2064.021,2064.433,2047.204,2058.134,95053393
|
||||
2014/7/9,2038.612,2062.474,2037.601,2061.635,113305841
|
||||
2014/7/10,2038.342,2045.527,2034.956,2036.54,97943819
|
||||
2014/7/11,2046.961,2051.737,2033.004,2033.869,105088083
|
||||
2014/7/14,2066.646,2067.342,2044.901,2047.744,115119740
|
||||
2014/7/15,2070.357,2070.358,2059.679,2065.9,124488768
|
||||
2014/7/16,2067.276,2075.493,2061.572,2068.343,137128020
|
||||
2014/7/17,2055.591,2062.888,2046.189,2062.888,104491812
|
||||
2014/7/18,2059.067,2067.233,2045.996,2047.498,106641094
|
||||
2014/7/21,2054.479,2061.823,2049.175,2057.767,93857870
|
||||
2014/7/22,2075.481,2078.085,2049.815,2050.5,123191868
|
||||
2014/7/23,2078.489,2088.192,2072.229,2074.195,137292211
|
||||
2014/7/24,2105.062,2107.946,2079.632,2079.632,165676996
|
||||
2014/7/25,2126.614,2127.217,2106.714,2108.714,142495826
|
||||
2014/7/28,2177.948,2181.496,2135.249,2135.249,236185752
|
||||
2014/7/29,2183.192,2193.523,2172.102,2179.826,200264257
|
||||
2014/7/30,2181.243,2194.572,2177.244,2178.179,184922187
|
||||
2014/7/31,2201.562,2202.126,2173.9,2179.543,164691654
|
||||
2014/8/1,2185.303,2218.789,2184.641,2194.17,191475042
|
||||
2014/8/4,2223.331,2224.068,2186.917,2190.036,174097403
|
||||
2014/8/5,2219.945,2226.838,2206.85,2224.632,175386987
|
||||
2014/8/6,2217.465,2223.893,2192.993,2212.003,177711707
|
||||
2014/8/7,2187.669,2220.568,2185.763,2216.659,175233274
|
||||
2014/8/8,2194.425,2199.578,2180.597,2188.709,135181443
|
||||
2014/8/11,2224.654,2225.961,2198.314,2199.433,150583421
|
||||
2014/8/12,2221.595,2222.979,2210,2222.696,154799046
|
||||
2014/8/13,2222.877,2230.991,2202.443,2223.051,178062806
|
||||
2014/8/14,2206.466,2230.894,2204.384,2221.541,170149123
|
||||
2014/8/15,2226.734,2230.872,2203.242,2207.226,149978691
|
||||
2014/8/18,2239.466,2242.035,2228.134,2229.804,163928626
|
||||
2014/8/19,2245.33,2246.016,2227.925,2242.34,177744592
|
||||
2014/8/20,2240.211,2248.939,2233.892,2241.664,167658383
|
||||
2014/8/21,2230.458,2240.077,2211.63,2239.568,165733498
|
||||
2014/8/22,2240.812,2243.303,2225.267,2228.974,160111672
|
||||
2014/8/25,2229.274,2241.553,2222.009,2241.1,162119578
|
||||
2014/8/26,2207.106,2232.785,2200.618,2225.291,163507424
|
||||
2014/8/27,2209.465,2216.67,2204.048,2207.03,120885885
|
||||
2014/8/28,2195.818,2219.473,2194.861,2210.484,124229014
|
||||
2014/8/29,2217.2,2218.696,2193.263,2198.946,105202496
|
||||
2014/9/1,2235.511,2236.286,2217.685,2220.129,129166583
|
||||
2014/9/2,2266.046,2267.509,2234.378,2239.684,192124869
|
||||
2014/9/3,2288.627,2290.547,2268.1,2268.395,212478998
|
||||
2014/9/4,2306.862,2307.701,2283.277,2290.029,199489978
|
||||
2014/9/5,2326.432,2327.557,2307.447,2311.305,213181917
|
||||
2014/9/9,2326.527,2331.917,2315.894,2328.426,196990318
|
||||
2014/9/10,2318.305,2321.908,2306.421,2318.496,189828991
|
||||
2014/9/11,2311.679,2343.595,2304.602,2315.732,222221798
|
||||
2014/9/12,2331.95,2331.95,2302.775,2308.346,193471540
|
||||
2014/9/15,2339.14,2340.449,2321.593,2330.187,215112414
|
||||
2014/9/16,2296.555,2347.935,2293.869,2341.027,302694111
|
||||
2014/9/17,2307.893,2309.048,2282.795,2298.982,210842453
|
||||
2014/9/18,2315.928,2319.875,2297.931,2303.85,189089045
|
||||
2014/9/19,2329.451,2331.561,2305.517,2312.984,174648487
|
||||
2014/9/22,2289.866,2323.554,2284.378,2323.554,175842354
|
||||
2014/9/23,2309.718,2311.525,2289.024,2289.091,156855169
|
||||
2014/9/24,2343.575,2345.747,2297.876,2302.231,222525725
|
||||
2014/9/25,2345.103,2365.154,2336.805,2352.865,225688323
|
||||
2014/9/26,2347.718,2350.109,2329.955,2339.288,174748285
|
||||
2014/9/29,2357.711,2363.059,2346.579,2353.708,200111021
|
||||
2014/9/30,2363.87,2365.491,2354.268,2361.318,193918690
|
||||
2014/10/8,2382.794,2382.794,2354.29,2368.576,204397326
|
||||
2014/10/9,2389.371,2391.348,2367.111,2383.859,235920010
|
||||
2014/10/10,2374.54,2386.277,2365.075,2380.755,224671126
|
||||
2014/10/13,2366.009,2366.862,2341.124,2366.426,200899314
|
||||
2014/10/14,2359.475,2380.515,2349.194,2362.802,196831418
|
||||
2014/10/15,2373.67,2374.808,2344.373,2358.233,202804915
|
||||
2014/10/16,2356.499,2389.675,2353.406,2361.13,248201168
|
||||
2014/10/17,2341.184,2360.597,2312.826,2352.784,212300962
|
||||
2014/10/20,2356.728,2357.509,2340.459,2346.052,160022305
|
||||
2014/10/21,2339.657,2361.653,2337.551,2355.033,168828288
|
||||
2014/10/22,2326.553,2352.124,2324.59,2339.223,152698425
|
||||
2014/10/23,2302.418,2329.927,2297.33,2322.316,162636308
|
||||
2014/10/24,2302.28,2314.875,2296.657,2303.08,132225281
|
||||
2014/10/27,2290.437,2293.644,2279.836,2293.573,130261568
|
||||
2014/10/28,2337.871,2338.278,2294.012,2294.012,178590357
|
||||
2014/10/29,2373.03,2381.643,2339.712,2343.72,265588687
|
||||
2014/10/30,2391.076,2397.256,2365.919,2371.891,294645943
|
||||
2014/10/31,2420.178,2423.596,2384.483,2393.178,325763522
|
||||
2014/11/3,2430.032,2436.785,2418.167,2425.225,298821235
|
||||
2014/11/4,2430.677,2435.223,2417.221,2428.271,309013039
|
||||
2014/11/5,2419.254,2434.363,2415.502,2432.169,263606654
|
||||
2014/11/6,2425.864,2426.89,2401.75,2419.617,222005088
|
||||
2014/11/7,2418.171,2454.423,2407.442,2427.898,291172245
|
||||
2014/11/10,2473.673,2474.156,2428.185,2436.628,300628203
|
||||
2014/11/11,2469.673,2508.623,2445.96,2483.648,411904065
|
||||
2014/11/12,2494.476,2494.917,2444.814,2454.602,252933852
|
||||
2014/11/13,2485.606,2507.743,2471.407,2494.998,295037058
|
||||
2014/11/14,2478.824,2481.025,2457.045,2477.966,220607619
|
||||
2014/11/17,2474.009,2508.767,2472.446,2506.864,215687800
|
||||
2014/11/18,2456.366,2477.052,2449.813,2474.182,201062570
|
||||
2014/11/19,2450.986,2461.491,2442.71,2452.15,186235771
|
||||
2014/11/20,2452.66,2458.319,2437.476,2443.276,165495213
|
||||
2014/11/21,2486.791,2488.201,2446.646,2452.635,212239774
|
||||
2014/11/24,2532.879,2546.746,2495.521,2505.532,363485835
|
||||
2014/11/25,2567.597,2568.381,2527.077,2531.998,314315572
|
||||
2014/11/26,2604.345,2605.07,2570.404,2572.649,337127249
|
||||
2014/11/27,2630.486,2631.399,2599.108,2615.367,364075719
|
||||
2014/11/28,2682.835,2683.18,2622.061,2629.626,465880035
|
||||
2014/12/1,2680.155,2720.743,2668.841,2691.725,446791741
|
||||
2014/12/2,2763.545,2777.372,2665.686,2667.82,437733381
|
||||
2014/12/3,2779.525,2824.179,2733.868,2768.678,562120281
|
||||
2014/12/4,2899.456,2900.508,2772.432,2783.469,532687718
|
||||
2014/12/5,2937.647,2978.029,2813.052,2926.573,640500296
|
||||
2014/12/8,3020.258,3041.657,2879.847,2907.815,587570890
|
||||
2014/12/9,2856.269,3091.324,2834.592,2992.49,771998379
|
||||
2014/12/10,2940.006,2946.707,2807.678,2855.94,512886913
|
||||
2014/12/11,2925.743,2965.675,2892.611,2912.346,482632733
|
||||
2014/12/12,2938.173,2962.51,2914.956,2929.36,409480811
|
||||
2014/12/15,2953.421,2960.227,2890.904,2921.446,400371695
|
||||
2014/12/16,3021.518,3021.897,2943.912,2953.811,453842723
|
||||
2014/12/17,3061.02,3076.599,2993.333,3031.952,542503179
|
||||
2014/12/18,3057.521,3089.791,3030.319,3062.801,435904952
|
||||
2014/12/19,3108.596,3117.527,3018.421,3053.075,521073511
|
||||
2014/12/22,3127.445,3189.867,3090.509,3129.267,679371915
|
||||
2014/12/23,3032.612,3136.838,3025.667,3085.08,437762400
|
||||
2014/12/24,2972.532,3050.507,2934.911,3039.206,376805246
|
||||
2014/12/25,3072.536,3073.345,2969.874,2992.462,376947776
|
||||
2014/12/26,3157.603,3164.155,3064.176,3078.005,460700932
|
||||
2014/12/29,3168.016,3223.86,3126.944,3212.559,510111439
|
||||
2014/12/30,3165.815,3190.299,3130.353,3160.801,397725320
|
||||
2014/12/31,3234.677,3239.357,3157.259,3172.597,405998521
|
||||
2015/1/5,3350.519,3369.281,3253.883,3258.627,531352391
|
||||
2015/1/6,3351.446,3394.224,3303.184,3330.799,501661695
|
||||
2015/1/7,3373.954,3374.896,3312.211,3326.649,391918880
|
||||
2015/1/8,3293.456,3381.566,3285.095,3371.957,371131170
|
||||
2015/1/9,3285.412,3404.834,3267.509,3276.965,410240872
|
||||
2015/1/12,3229.316,3275.185,3191.582,3258.213,322064679
|
||||
2015/1/13,3235.301,3259.386,3214.412,3223.542,230725754
|
||||
2015/1/14,3222.437,3268.483,3193.978,3242.337,240190747
|
||||
2015/1/15,3336.455,3337.084,3207.545,3224.07,282546240
|
||||
2015/1/16,3376.495,3400.318,3340.49,3343.603,339876753
|
||||
2015/1/19,3116.351,3262.207,3095.066,3189.727,401098789
|
||||
2015/1/20,3173.052,3190.245,3100.477,3114.56,357080811
|
||||
2015/1/21,3323.611,3337.004,3178.343,3189.085,410956024
|
||||
2015/1/22,3343.344,3352.384,3293.978,3327.319,353382961
|
||||
2015/1/23,3351.764,3406.786,3328.293,3357.096,366249240
|
||||
2015/1/26,3383.182,3384.798,3321.315,3347.257,317541007
|
||||
2015/1/27,3352.96,3390.216,3290.219,3389.853,374517551
|
||||
2015/1/28,3305.738,3354.802,3294.655,3325.722,301927095
|
||||
2015/1/29,3262.305,3286.786,3234.241,3258.997,274658613
|
||||
2015/1/30,3210.363,3288.503,3210.308,3273.747,258312548
|
||||
2015/2/2,3128.3,3175.134,3122.572,3148.136,250861629
|
||||
2015/2/3,3204.907,3207.935,3129.732,3156.086,248192164
|
||||
2015/2/4,3174.126,3238.982,3171.144,3212.822,249098086
|
||||
2015/2/5,3136.531,3251.212,3135.819,3251.212,306139305
|
||||
2015/2/6,3075.907,3129.539,3052.939,3120.09,246749666
|
||||
2015/2/9,3095.124,3119.034,3049.111,3063.51,206108383
|
||||
2015/2/10,3141.593,3142.099,3084.253,3090.49,193817139
|
||||
2015/2/11,3157.704,3166.421,3139.052,3145.765,172840094
|
||||
2015/2/12,3173.416,3181.766,3134.244,3157.959,194592309
|
||||
2015/2/13,3203.827,3237.159,3182.794,3186.808,261290436
|
||||
2015/2/16,3222.363,3228.846,3195.884,3206.137,223797429
|
||||
2015/2/17,3246.906,3255.725,3230.772,3230.884,228332624
|
||||
2015/2/25,3228.843,3257.223,3215.552,3256.479,233348094
|
||||
2015/2/26,3298.359,3300.616,3202.188,3222.151,301263875
|
||||
2015/2/27,3310.303,3324.546,3291.007,3296.831,299163717
|
||||
2015/3/2,3336.285,3336.76,3298.669,3332.721,346445671
|
||||
2015/3/3,3263.052,3317.695,3260.429,3317.695,382044619
|
||||
2015/3/4,3279.533,3286.588,3250.484,3264.182,293639522
|
||||
2015/3/5,3248.476,3266.638,3221.666,3264.085,320663585
|
||||
2015/3/6,3241.187,3266.933,3234.533,3248.036,282915791
|
||||
2015/3/9,3302.408,3307.702,3198.37,3224.314,321495440
|
||||
2015/3/10,3286.068,3309.915,3277.095,3289.085,285817576
|
||||
2015/3/11,3290.9,3325.054,3278.471,3289.594,282985535
|
||||
2015/3/12,3349.323,3360.054,3300.488,3314.813,357295105
|
||||
2015/3/13,3372.911,3391.255,3352.15,3359.488,328410154
|
||||
2015/3/16,3449.305,3449.305,3377.087,3391.158,399132430
|
||||
2015/3/17,3502.847,3504.123,3459.694,3469.603,520939506
|
||||
2015/3/18,3577.301,3577.662,3503.853,3510.501,545217144
|
||||
2015/3/19,3582.271,3600.684,3546.844,3576.019,537346614
|
||||
2015/3/20,3617.318,3632.338,3569.38,3587.084,516661669
|
||||
2015/3/23,3687.728,3688.249,3635.485,3640.104,536062832
|
||||
2015/3/24,3691.41,3715.873,3600.698,3692.569,639554669
|
||||
2015/3/25,3660.727,3693.151,3634.559,3680.953,521886348
|
||||
2015/3/26,3682.095,3707.318,3615.011,3641.942,488647203
|
||||
2015/3/27,3691.096,3710.477,3656.831,3686.134,408945165
|
||||
2015/3/30,3786.568,3795.935,3710.612,3710.612,564702353
|
||||
2015/3/31,3747.899,3835.567,3737.043,3822.987,561676037
|
||||
2015/4/1,3810.294,3817.082,3742.213,3748.34,447458319
|
||||
2015/4/2,3825.784,3835.451,3775.894,3827.689,479299673
|
||||
2015/4/3,3863.929,3864.405,3792.211,3803.383,473033311
|
||||
2015/4/7,3961.378,3961.666,3891.728,3899.42,570447535
|
||||
2015/4/8,3994.811,4000.22,3903.648,3976.532,618085419
|
||||
2015/4/9,3957.534,4016.396,3900.027,4006.13,585176825
|
||||
2015/4/10,4034.31,4040.348,3929.319,3947.492,484283619
|
||||
2015/4/13,4121.715,4128.072,4057.293,4072.723,589814227
|
||||
2015/4/14,4135.565,4168.346,4091.257,4125.782,610683541
|
||||
2015/4/15,4084.163,4175.494,4069.007,4135.648,613005812
|
||||
2015/4/16,4194.823,4195.305,4031.244,4055.916,551242956
|
||||
2015/4/17,4287.296,4317.223,4238.91,4254.723,701706205
|
||||
2015/4/20,4217.077,4356.001,4190.681,4301.352,857132807
|
||||
2015/4/21,4293.623,4294.375,4188.569,4212.185,634470627
|
||||
2015/4/22,4398.494,4400.193,4297.951,4304.597,680305086
|
||||
2015/4/23,4414.508,4444.41,4358.844,4414.485,667344661
|
||||
2015/4/24,4393.686,4416.376,4318.119,4355.951,628554996
|
||||
2015/4/27,4527.396,4529.735,4441.929,4441.929,671088521
|
||||
2015/4/28,4476.215,4572.391,4432.904,4527.635,767676416
|
||||
2015/4/29,4476.62,4499.945,4398.639,4446.119,519834202
|
||||
2015/4/30,4441.655,4507.344,4441.054,4483.013,526727975
|
||||
2015/5/4,4480.464,4487.57,4387.426,4441.343,494173398
|
||||
2015/5/5,4298.706,4488.865,4282.237,4479.848,572858596
|
||||
2015/5/6,4229.266,4376.353,4187.368,4311.641,481732993
|
||||
2015/5/7,4112.214,4213.764,4108.009,4197.896,394566653
|
||||
2015/5/8,4205.917,4206.86,4099.042,4152.984,397428094
|
||||
2015/5/11,4333.584,4334.877,4187.82,4231.271,488750515
|
||||
2015/5/12,4401.219,4402.309,4317.975,4342.37,521866408
|
||||
2015/5/13,4375.76,4415.629,4342.481,4402.378,510490475
|
||||
2015/5/14,4378.311,4397.745,4329.042,4372.816,449077935
|
||||
2015/5/15,4308.691,4366.822,4278.553,4366.822,439706198
|
||||
2015/5/18,4283.491,4324.826,4260.509,4277.895,380057452
|
||||
2015/5/19,4417.552,4418.403,4285.777,4285.777,436735224
|
||||
2015/5/20,4446.288,4520.538,4432.279,4434.979,514106223
|
||||
2015/5/21,4529.422,4530.478,4438.258,4456.435,464996520
|
||||
2015/5/22,4657.596,4658.273,4562.989,4584.984,655591287
|
||||
2015/5/25,4813.798,4814.672,4656.825,4660.075,682461391
|
||||
2015/5/26,4910.897,4911.685,4779.075,4854.85,704892829
|
||||
2015/5/27,4941.714,4958.156,4857.056,4932.846,681165379
|
||||
2015/5/28,4620.266,4986.503,4614.241,4943.742,782964592
|
||||
2015/5/29,4611.744,4698.193,4431.563,4603.465,611262409
|
||||
2015/6/1,4828.738,4829.502,4615.231,4633.098,593389035
|
||||
2015/6/2,4910.527,4911.574,4797.552,4844.704,623748099
|
||||
2015/6/3,4909.978,4942.065,4822.442,4924.381,611453839
|
||||
2015/6/4,4947.102,4947.965,4647.407,4912.945,674952402
|
||||
2015/6/5,5023.096,5051.626,4898.068,5016.088,772240812
|
||||
2015/6/8,5131.881,5146.949,4997.481,5045.694,855035085
|
||||
2015/6/9,5113.534,5147.454,5042.963,5145.978,729893818
|
||||
2015/6/10,5106.036,5164.162,5001.489,5049.197,596969001
|
||||
2015/6/11,5121.593,5122.457,5050.765,5101.44,563990522
|
||||
2015/6/12,5166.35,5178.191,5103.401,5143.343,625627854
|
||||
2015/6/15,5062.993,5176.795,5048.742,5174.418,637803984
|
||||
2015/6/16,4887.432,5029.684,4842.1,5004.412,550801407
|
||||
2015/6/17,4967.898,4983.658,4767.216,4890.551,537101168
|
||||
2015/6/18,4785.356,4966.767,4780.873,4942.52,507440899
|
||||
2015/6/19,4478.364,4744.081,4476.501,4689.929,452689626
|
||||
2015/6/23,4576.492,4577.939,4264.772,4471.613,473526128
|
||||
2015/6/24,4690.15,4691.768,4552.129,4604.579,543003709
|
||||
2015/6/25,4527.779,4720.701,4483.548,4711.763,572797533
|
||||
2015/6/26,4192.873,4456.896,4139.53,4399.933,565217874
|
||||
2015/6/29,4053.03,4297.475,3875.05,4289.771,673786349
|
||||
2015/6/30,4277.222,4279.969,3847.88,4006.754,709176633
|
||||
2015/7/1,4053.7,4317.053,4043.367,4214.15,598769427
|
||||
2015/7/2,3912.767,4080.387,3795.253,4058.624,586015612
|
||||
2015/7/3,3686.915,3927.128,3629.556,3793.712,548163111
|
||||
2015/7/6,3775.912,3975.214,3653.037,3975.214,831139286
|
||||
2015/7/7,3727.125,3750.57,3585.399,3654.778,698818688
|
||||
2015/7/8,3507.192,3599.253,3421.525,3467.399,680356922
|
||||
2015/7/9,3709.33,3748.479,3373.54,3432.454,656914612
|
||||
2015/7/10,3877.803,3959.22,3677.435,3707.458,586364255
|
||||
2015/7/13,3970.388,4030.195,3858.637,3918.99,643489007
|
||||
2015/7/14,3924.487,4035.435,3855.56,3958.373,670558799
|
||||
2015/7/15,3805.703,3914.273,3741.25,3874.968,601301324
|
||||
2015/7/16,3823.176,3877.514,3688.442,3758.505,492256200
|
||||
2015/7/17,3957.352,3994.477,3814.147,3831.421,481726268
|
||||
2015/7/20,3992.11,4021.326,3927.121,3948.421,539106714
|
||||
2015/7/21,4017.675,4041.819,3912.801,3939.898,504288028
|
||||
2015/7/22,4026.045,4042.338,3960.864,3996.427,520732225
|
||||
2015/7/23,4123.923,4132.612,4019.038,4022.268,563585966
|
||||
2015/7/24,4070.908,4184.449,4044.831,4124.755,627424860
|
||||
2015/7/27,3725.558,4051.159,3720.444,3985.57,556003247
|
||||
2015/7/28,3663.002,3762.526,3537.358,3573.143,563330042
|
||||
2015/7/29,3789.168,3792.072,3612.064,3689.825,434352085
|
||||
2015/7/30,3705.766,3844.374,3685.956,3773.788,457943228
|
||||
2015/7/31,3663.726,3729.512,3620.165,3655.667,350955745
|
||||
2015/8/3,3622.905,3648.943,3549.496,3614.99,363968731
|
||||
2015/8/4,3756.545,3757.029,3601.289,3621.855,362901666
|
||||
2015/8/5,3694.573,3782.352,3676.39,3745.646,366422979
|
||||
2015/8/6,3661.539,3710.57,3614.742,3625.504,274074663
|
||||
2015/8/7,3744.205,3756.74,3686.3,3692.614,340757184
|
||||
2015/8/10,3928.415,3943.624,3775.854,3786.033,497304319
|
||||
2015/8/11,3927.908,3970.337,3891.179,3928.808,538923460
|
||||
2015/8/12,3886.32,3937.772,3871.136,3881.228,442688278
|
||||
2015/8/13,3954.556,3955.789,3838.159,3869.911,430073303
|
||||
2015/8/14,3965.335,4000.684,3939.835,3976.405,467988217
|
||||
2015/8/17,3993.668,3994.537,3907.399,3947.844,460432060
|
||||
2015/8/18,3748.164,4006.337,3743.394,3999.134,543770822
|
||||
2015/8/19,3794.109,3811.427,3558.383,3646.803,475396239
|
||||
2015/8/20,3664.291,3788.005,3663.607,3754.567,390063057
|
||||
2015/8/21,3507.744,3652.837,3490.54,3609.959,369920479
|
||||
2015/8/24,3209.905,3388.364,3191.879,3373.478,334671792
|
||||
2015/8/25,2964.967,3123.034,2947.944,3004.126,352325110
|
||||
2015/8/26,2927.288,3092.041,2850.714,2980.794,466699663
|
||||
2015/8/27,3083.591,3085.422,2906.49,2978.03,400308398
|
||||
2015/8/28,3232.35,3235.839,3102.945,3125.264,443136928
|
||||
2015/8/31,3205.986,3207.862,3109.163,3203.559,397431382
|
||||
2015/9/1,3166.624,3180.331,3053.738,3157.832,432432468
|
||||
2015/9/2,3160.167,3194.485,3019.087,3027.678,438170153
|
||||
2015/9/7,3080.42,3217.579,3066.304,3149.38,296468114
|
||||
2015/9/8,3170.452,3174.709,3011.117,3054.444,255415465
|
||||
2015/9/9,3243.089,3256.743,3165.696,3182.552,375327978
|
||||
2015/9/10,3197.893,3243.281,3178.904,3190.553,273261759
|
||||
2015/9/11,3200.234,3223.762,3163.449,3189.479,224557822
|
||||
2015/9/14,3114.798,3229.482,3049.23,3221.165,346631158
|
||||
2015/9/15,3005.172,3081.703,2983.92,3043.805,249194445
|
||||
2015/9/16,3152.263,3182.934,2983.535,2998.036,277524524
|
||||
2015/9/17,3086.061,3204.702,3085.314,3131.982,317602892
|
||||
2015/9/18,3097.917,3122.048,3070.336,3100.28,209175398
|
||||
2015/9/21,3156.54,3159.883,3060.856,3072.094,239897354
|
||||
2015/9/22,3185.619,3213.476,3152.481,3161.318,274786154
|
||||
2015/9/23,3115.888,3164.041,3104.744,3137.723,236322670
|
||||
2015/9/24,3142.687,3151.165,3109.691,3126.491,212887723
|
||||
2015/9/25,3092.347,3149.948,3062.995,3130.851,236263871
|
||||
2015/9/28,3100.756,3103.069,3042.31,3085.567,156727530
|
||||
2015/9/29,3038.137,3068.298,3021.157,3055.218,163222673
|
||||
2015/9/30,3052.781,3073.3,3039.742,3052.841,146642449
|
||||
2015/10/8,3143.357,3172.281,3133.127,3156.075,234276050
|
||||
2015/10/9,3183.152,3192.717,3137.788,3146.644,234851445
|
||||
2015/10/12,3287.662,3318.714,3188.407,3193.54,386294715
|
||||
2015/10/13,3293.23,3298.626,3253.249,3262.156,297153133
|
||||
2015/10/14,3262.441,3307.315,3256.253,3280.02,295077739
|
||||
2015/10/15,3338.073,3338.297,3254.392,3255.032,316283851
|
||||
2015/10/16,3391.352,3393.018,3334.854,3358.297,395460575
|
||||
2015/10/19,3386.7,3423.402,3355.566,3401.627,378112183
|
||||
2015/10/20,3425.33,3425.516,3357.861,3377.547,318973758
|
||||
2015/10/21,3320.676,3447.258,3265.436,3428.561,458455428
|
||||
2015/10/22,3368.739,3373.776,3282.993,3292.291,323739341
|
||||
2015/10/23,3412.434,3422.022,3360.218,3377.548,347372854
|
||||
2015/10/26,3429.581,3457.517,3402,3448.649,365560853
|
||||
2015/10/27,3434.336,3441.565,3332.616,3409.137,328172768
|
||||
2015/10/28,3375.196,3439.758,3367.231,3417.011,293523284
|
||||
2015/10/29,3387.315,3411.714,3362.509,3387.774,235676026
|
||||
2015/10/30,3382.561,3417.201,3346.591,3380.284,243595118
|
||||
2015/11/2,3325.085,3391.064,3322.312,3337.578,230951129
|
||||
2015/11/3,3316.695,3346.275,3302.184,3330.316,192897428
|
||||
2015/11/4,3459.64,3459.646,3325.619,3325.619,339078730
|
||||
2015/11/5,3522.819,3585.657,3455.525,3459.215,553254947
|
||||
2015/11/6,3590.032,3596.382,3508.827,3514.436,429167033
|
||||
2015/11/9,3646.881,3673.76,3588.498,3588.498,503016682
|
||||
2015/11/10,3640.485,3669.533,3607.891,3617.396,429746576
|
||||
2015/11/11,3650.249,3654.877,3605.621,3635.004,360972651
|
||||
2015/11/12,3632.902,3659.315,3603.228,3656.817,361717600
|
||||
2015/11/13,3580.839,3632.556,3564.809,3600.764,345870933
|
||||
2015/11/16,3606.957,3607.612,3519.421,3522.461,276187057
|
||||
2015/11/17,3604.795,3678.273,3598.068,3629.977,383575468
|
||||
2015/11/18,3568.468,3617.069,3558.697,3605.061,297580734
|
||||
2015/11/19,3617.062,3618.213,3561.044,3573.776,247915576
|
||||
2015/11/20,3630.5,3640.529,3607.915,3620.791,310801972
|
||||
2015/11/23,3610.32,3654.754,3598.871,3630.867,315997474
|
||||
2015/11/24,3616.113,3616.484,3563.104,3602.887,248810524
|
||||
2015/11/25,3647.93,3648.367,3607.518,3614.068,273024857
|
||||
2015/11/26,3635.552,3668.376,3629.865,3659.574,306761582
|
||||
2015/11/27,3436.303,3621.897,3412.427,3616.544,354287525
|
||||
2015/11/30,3445.405,3470.371,3327.812,3433.855,304197903
|
||||
2015/12/1,3456.309,3483.414,3417.545,3442.441,252390755
|
||||
2015/12/2,3536.905,3538.847,3427.661,3450.278,301491480
|
||||
2015/12/3,3584.824,3591.73,3517.23,3525.727,281111255
|
||||
2015/12/4,3524.992,3568.97,3510.412,3558.149,251736411
|
||||
2015/12/7,3536.927,3543.945,3506.625,3529.806,208302579
|
||||
2015/12/8,3470.07,3518.648,3466.79,3518.648,224367310
|
||||
2015/12/9,3472.439,3495.702,3454.879,3462.583,195698845
|
||||
2015/12/10,3455.495,3503.654,3446.273,3469.806,200427517
|
||||
2015/12/11,3434.581,3455.548,3410.924,3441.597,182908878
|
||||
2015/12/14,3520.668,3521.779,3399.28,3403.507,215374620
|
||||
2015/12/15,3510.354,3529.961,3496.854,3518.126,200471341
|
||||
2015/12/16,3516.187,3538.689,3506.291,3522.091,193482310
|
||||
2015/12/17,3579.999,3583.408,3533.628,3533.628,283856476
|
||||
2015/12/18,3578.964,3614.698,3568.161,3574.94,273707904
|
||||
2015/12/21,3642.472,3651.056,3565.751,3568.581,299849280
|
||||
2015/12/22,3651.767,3652.635,3616.87,3645.99,261178763
|
||||
2015/12/23,3636.089,3684.567,3633.025,3653.282,298201801
|
||||
2015/12/24,3612.485,3640.221,3572.277,3631.313,227785225
|
||||
2015/12/25,3627.914,3635.256,3601.738,3614.054,198451111
|
||||
2015/12/28,3533.779,3641.588,3533.779,3635.769,269983278
|
||||
2015/12/29,3563.736,3564.171,3515.52,3528.395,182551923
|
||||
2015/12/30,3572.876,3573.684,3538.112,3566.731,187889609
|
||||
2015/12/31,3539.182,3580.602,3538.353,3570.467,176963659
|
||||
2016/1/4,3296.258,3538.689,3295.741,3536.589,184418423
|
||||
2016/1/5,3287.711,3328.139,3189.605,3196.651,266882083
|
||||
2016/1/6,3361.84,3362.974,3288.933,3291.195,238886670
|
||||
2016/1/7,3125.002,3309.657,3115.885,3309.657,70569123
|
||||
2016/1/8,3186.412,3235.451,3056.878,3194.625,286440822
|
||||
2016/1/11,3016.704,3166.215,3016.697,3131.853,271643691
|
||||
2016/1/12,3022.861,3047.664,2978.463,3026.159,207659622
|
||||
2016/1/13,2949.597,3059.015,2949.29,3041.107,194282106
|
||||
2016/1/14,3007.649,3012.293,2867.553,2874.049,212905644
|
||||
2016/1/15,2900.97,3001.708,2883.868,2988.048,198721697
|
||||
2016/1/18,2913.8367,2945.4496,2844.7042,2847.5389,164699694
|
||||
2016/1/19,3007.7393,3012.0684,2906.4038,2914.4078,205279703
|
||||
2016/1/20,2976.6938,3016.2827,2951.9219,2993.0138,216505474
|
||||
2016/1/21,2880.4816,2998.7904,2880.0848,2934.3912,191675668
|
||||
2016/1/22,2916.5624,2931.3587,2851.7325,2911.1123,159810734
|
||||
2016/1/25,2938.5149,2955.7826,2911.8286,2934.0781,153039057
|
||||
2016/1/26,2749.7854,2911.9907,2743.8393,2907.7177,210836054
|
||||
2016/1/27,2735.5578,2768.7719,2638.3016,2756.082,215722046
|
||||
2016/1/28,2655.6609,2740.5358,2647.4931,2711.1582,171120280
|
||||
2016/1/29,2737.5996,2755.3665,2649.7905,2652.8544,186673106
|
||||
2016/2/1,2688.8536,2735.2551,2655.6234,2730.9844,156383744
|
||||
2016/2/2,2749.5703,2755.1591,2687.9817,2687.9817,158078211
|
||||
2016/2/3,2739.2469,2746.072,2696.8835,2719.5737,148397217
|
||||
2016/2/4,2781.0227,2793.2981,2751.3135,2751.4317,170382018
|
||||
2016/2/5,2763.492,2790.061,2762.1597,2783.0761,141186284
|
||||
2016/2/15,2746.1958,2760.359,2682.09,2684.9614,129263932
|
||||
2016/2/16,2836.5705,2840.6224,2758.579,2758.579,195961614
|
||||
2016/2/17,2867.3379,2868.701,2824.3556,2829.7636,216909925
|
||||
2016/2/18,2862.8927,2893.2148,2857.6989,2881.7769,219203873
|
||||
2016/2/19,2860.0208,2872.7236,2840.4876,2854.904,163391413
|
||||
2016/2/22,2927.175,2933.9638,2880.3474,2888.5984,232176042
|
||||
2016/2/23,2903.3313,2928.048,2872.2816,2925.7082,199740663
|
||||
2016/2/24,2928.896,2929.8712,2872.2741,2889.8846,213410384
|
||||
2016/2/25,2741.2454,2922.2372,2729.8506,2922.2372,270284416
|
||||
2016/2/26,2767.2097,2784.7525,2715.8743,2760.0575,191110472
|
||||
2016/2/29,2687.9788,2755.8898,2638.9631,2754.8137,207410709
|
||||
2016/3/1,2733.17,2747.5621,2668.7574,2688.3799,187207443
|
||||
2016/3/2,2849.6811,2852.7001,2732.5388,2733.767,270961783
|
||||
2016/3/3,2859.7582,2878.445,2840.8741,2847.3305,287478210
|
||||
2016/3/4,2874.1468,2880.3719,2808.8493,2848.5384,312495169
|
||||
2016/3/7,2897.3395,2911.8386,2871.3462,2886.6403,217466836
|
||||
2016/3/8,2901.387,2902.6212,2802.5628,2895.6664,233482661
|
||||
2016/3/9,2862.556,2863.0147,2811.7175,2839.4112,183355383
|
||||
2016/3/10,2804.7255,2863.1763,2803.4764,2847.567,138979461
|
||||
2016/3/11,2810.3074,2815.6074,2772.5512,2781.6004,127247554
|
||||
2016/3/14,2859.499,2889.8164,2823.0282,2830.0836,194816030
|
||||
2016/3/15,2864.3684,2865.787,2819.7949,2853.9776,163386667
|
||||
2016/3/16,2870.43,2881.5293,2854.1919,2858.7085,186492535
|
||||
2016/3/17,2904.8319,2921.0002,2857.1913,2875.4108,200290213
|
||||
2016/3/18,2955.1498,2971.5508,2908.7416,2915.5177,313332735
|
||||
2016/3/21,3018.8017,3028.3215,2973.7575,2978.4554,352400438
|
||||
2016/3/22,2999.3628,3019.1008,2988.4256,3001.63,270377322
|
||||
2016/3/23,3009.9604,3012.5596,2980.8554,2991.1685,216977462
|
||||
2016/3/24,2960.9704,2998.1537,2960.5366,2986.801,237006403
|
||||
2016/3/25,2979.4343,2981.4077,2952.1057,2956.1997,175074344
|
||||
2016/3/28,2957.82,3008.1675,2948.5259,2988.0104,202021241
|
||||
2016/3/29,2919.8318,2962.2029,2905.2513,2956.7052,182965345
|
||||
2016/3/30,3000.6449,3001.1055,2941.2177,2941.2177,210371451
|
||||
2016/3/31,3003.9152,3023.4086,2992.9155,3009.3672,220413445
|
||||
2016/4/1,3009.5298,3009.6729,2956.247,2997.0883,206545866
|
||||
2016/4/5,3053.0654,3057.3297,2993.1476,3000.9382,256730344
|
||||
2016/4/6,3050.592,3059.7937,3029.0049,3039.7449,232262051
|
||||
2016/4/7,3008.42,3062.3579,3007.0603,3058.3388,220919506
|
||||
2016/4/8,2984.9582,2996.1706,2960.46,2988.2,187904633
|
||||
2016/4/11,3033.957,3048.9766,3006.909,3006.909,220018324
|
||||
2016/4/12,3023.6464,3036.8249,3001.3151,3031.3013,182718668
|
||||
2016/4/13,3066.6381,3097.1648,3041.3584,3041.3584,310003246
|
||||
2016/4/14,3082.3615,3086.6975,3056.9886,3080.09,208237830
|
||||
2016/4/15,3078.1166,3089.9509,3066.8721,3085.0263,189613051
|
||||
2016/4/18,3033.6604,3058.4629,3022.9701,3058.4629,183304512
|
||||
2016/4/19,3042.8232,3054.5032,3024.8951,3047.1326,156533200
|
||||
2016/4/20,2972.5837,3055.689,2905.0485,3050.3805,283144219
|
||||
2016/4/21,2952.8911,2990.6729,2943.464,2954.3703,189406849
|
||||
2016/4/22,2959.24,2960.2089,2926.7759,2933.0349,137211668
|
||||
2016/4/25,2946.6704,2954.0921,2917.0202,2949.9727,125856243
|
||||
2016/4/26,2964.6997,2965.4291,2933.9707,2944.7156,117711604
|
||||
2016/4/27,2953.6709,2976.0221,2949.4322,2967.1902,130867640
|
||||
2016/4/28,2945.5886,2959.5123,2916.3744,2955.7421,138663274
|
||||
2016/4/29,2938.3235,2950.5761,2930.3565,2935.3756,109310628
|
||||
2016/5/3,2992.6432,2993.5346,2929.8148,2940.3923,168703643
|
||||
2016/5/4,2991.2721,3004.4184,2978.3295,2983.0266,165407106
|
||||
2016/5/5,2997.8416,2999.1181,2977.1998,2987.0224,144831383
|
||||
2016/5/6,2913.2476,3003.5904,2913.0361,2998.4022,206796498
|
||||
2016/5/9,2832.1125,2896.1623,2821.8261,2896.1623,180378330
|
||||
2016/5/10,2832.5912,2845.2376,2820.1642,2822.3273,120829310
|
||||
2016/5/11,2837.0372,2857.2539,2818.6989,2843.5448,135795466
|
||||
2016/5/12,2835.8618,2839.2763,2781.2362,2812.1083,136337655
|
||||
2016/5/13,2827.1087,2850.0929,2814.1146,2828.4615,114319710
|
||||
2016/5/16,2850.8617,2851.229,2804.9907,2816.7754,114653592
|
||||
2016/5/17,2843.6841,2860.3205,2832.4592,2850.9264,123369064
|
||||
2016/5/18,2807.5141,2828.2552,2781.4165,2828.178,140487826
|
||||
2016/5/19,2806.9061,2829.4023,2801.5475,2802.3147,111595071
|
||||
2016/5/20,2825.4831,2825.9517,2785.0795,2792.8883,108700899
|
||||
2016/5/23,2843.645,2848.0713,2826.2562,2826.3123,120470455
|
||||
2016/5/24,2821.6663,2839.695,2807.1878,2839.6823,111452445
|
||||
2016/5/25,2815.0863,2843.165,2807.7488,2835.0293,103527265
|
||||
2016/5/26,2822.4429,2827.0916,2780.7634,2813.5431,114766797
|
||||
2016/5/27,2821.046,2832.7994,2809.7992,2817.9684,109845823
|
||||
2016/5/30,2822.4509,2830.9697,2794.6608,2814.6507,106319589
|
||||
2016/5/31,2916.616,2917.1351,2822.5927,2822.5927,215260341
|
||||
2016/6/1,2913.5077,2929.0759,2909.5121,2917.1541,188386421
|
||||
2016/6/2,2925.2293,2925.6702,2906.5242,2911.2193,159716916
|
||||
2016/6/3,2938.682,2945.5193,2915.185,2929.7881,172021023
|
||||
2016/6/6,2934.0979,2945.9416,2922.2833,2940.9943,141993742
|
||||
2016/6/7,2936.0449,2938.444,2923.502,2936.2821,132987867
|
||||
2016/6/8,2927.159,2937.9863,2908.3666,2932.3761,143046071
|
||||
2016/6/13,2833.0707,2911.1582,2832.5072,2897.2731,169255434
|
||||
2016/6/14,2842.1886,2843.4558,2822.0609,2824.2285,119755274
|
||||
2016/6/15,2887.2101,2894.2639,2811.7808,2814.6931,166671069
|
||||
2016/6/16,2872.8166,2887.7426,2865.3878,2878.4023,173882767
|
||||
2016/6/17,2885.105,2900.2993,2872.1845,2873.0089,171472517
|
||||
2016/6/20,2888.8091,2891.6583,2864.0199,2887.6358,136571051
|
||||
2016/6/21,2878.5575,2919.302,2869.1759,2898.3837,164359089
|
||||
2016/6/22,2905.5495,2905.978,2869.5133,2872.7337,130590424
|
||||
2016/6/23,2891.9602,2904.1115,2878.661,2902.3979,136137375
|
||||
2016/6/24,2854.2864,2899.5689,2807.5976,2883.759,190842609
|
||||
2016/6/27,2895.7033,2895.731,2840.2765,2840.5585,156697472
|
||||
2016/6/28,2912.5574,2913.5817,2878.8243,2885.0112,173871047
|
||||
2016/6/29,2931.5923,2933.9974,2915.0618,2918.5337,193215586
|
||||
2016/6/30,2929.6057,2938.1374,2922.3124,2931.4805,154464930
|
||||
2016/7/1,2932.4758,2944.9894,2925.8101,2931.8016,141246227
|
||||
2016/7/4,2988.604,2992.4978,2922.5196,2924.293,222017132
|
||||
2016/7/5,3006.3919,3010.275,2990.6416,2991.7524,235204450
|
||||
2016/7/6,3017.2924,3017.6523,2984.8278,2998.5207,212370920
|
||||
2016/7/7,3016.8467,3024.1087,2994.6426,3009.3533,222681667
|
||||
2016/7/8,2988.0939,3001.5506,2983.881,3000.3263,168986859
|
||||
2016/7/11,2994.9167,3022.9439,2990.9071,2993.7489,224338224
|
||||
2016/7/12,3049.381,3049.6814,2984.4205,2992.5195,259486295
|
||||
2016/7/13,3060.6893,3069.0469,3048.1991,3049.5128,253659384
|
||||
2016/7/14,3054.0182,3057.0458,3036.5234,3054.9748,180194804
|
||||
2016/7/15,3054.296,3062.6832,3044.5375,3056.6817,172866398
|
||||
2016/7/18,3043.5643,3058.3214,3031.6388,3047.6373,177496562
|
||||
2016/7/19,3036.5979,3043.5999,3014.2889,3040.2257,155361466
|
||||
2016/7/20,3027.8995,3042.997,3022.6309,3034.7139,138242815
|
||||
2016/7/21,3039.0091,3053.3336,3027.3676,3027.6042,163767370
|
||||
2016/7/22,3012.8157,3039.27,3007.4567,3038.1182,162010181
|
||||
2016/7/25,3015.8278,3027.1228,3003.2921,3008.0937,144206582
|
||||
2016/7/26,3050.1661,3050.6145,3013.8021,3014.0397,156694506
|
||||
2016/7/27,2991.9991,3057.4237,2939.2273,3050.3675,280160915
|
||||
2016/7/28,2994.3234,3003.3631,2968.182,2980.5012,190564950
|
||||
2016/7/29,2979.3388,3000.0546,2972.9166,2992.5355,150101534
|
||||
2016/8/1,2953.3854,2972.8751,2931.9633,2971.9491,147407763
|
||||
2016/8/2,2971.2787,2971.2787,2946.6365,2950.0796,115468900
|
||||
2016/8/3,2978.4608,2981.1555,2956.7856,2963.2145,141141332
|
||||
2016/8/4,2982.4261,2982.8601,2958.9332,2976.4096,133933301
|
||||
2016/8/5,2976.6962,2991.6767,2971.5638,2978.7776,141857101
|
||||
2016/8/8,3004.2767,3004.7182,2959.0477,2972.6248,155729833
|
||||
2016/8/9,3025.6805,3025.9108,2998.6766,3001.3063,169995446
|
||||
2016/8/10,3018.7459,3033.1964,3017.0903,3023.4724,164675165
|
||||
2016/8/11,3002.6376,3038.0478,3001.1681,3013.6776,161879481
|
||||
2016/8/12,3050.6674,3051.0541,2999.039,3000.2731,168173657
|
||||
2016/8/15,3125.1952,3137.4763,3053.8705,3056.4835,297616506
|
||||
2016/8/16,3110.0369,3140.4408,3102.0653,3130.5333,278328934
|
||||
2016/8/17,3109.5549,3114.2545,3090.2811,3106.9911,213839637
|
||||
2016/8/18,3104.1138,3125.5812,3093.3171,3107.7527,229359081
|
||||
2016/8/19,3108.102,3113.3438,3082.771,3100.3912,194347453
|
||||
2016/8/22,3084.8051,3112.7395,3083.5932,3107.3812,185387927
|
||||
2016/8/23,3089.7055,3101.1095,3073.5292,3081.5717,161368965
|
||||
2016/8/24,3085.8804,3097.1483,3079.5478,3092.0197,145707440
|
||||
2016/8/25,3068.3294,3073.4441,3041.5053,3073.4441,174032980
|
||||
2016/8/26,3070.3088,3087.6522,3063.894,3069.8504,149663901
|
||||
2016/8/29,3070.0273,3074.9433,3058.7853,3068.4602,144500007
|
||||
2016/8/30,3074.6768,3082.9879,3065.9713,3071.4404,140434811
|
||||
2016/8/31,3085.491,3087.6977,3063.3963,3072.9164,141368609
|
||||
2016/9/1,3063.3054,3088.7043,3062.8763,3083.9606,155191093
|
||||
2016/9/2,3067.352,3072.5258,3050.4924,3057.4945,150446920
|
||||
2016/9/5,3072.0953,3085.4853,3065.329,3070.707,144963317
|
||||
2016/9/6,3090.7127,3095.5092,3053.1868,3071.0554,172908524
|
||||
2016/9/7,3091.9281,3105.6775,3087.8794,3091.3287,186956763
|
||||
2016/9/8,3095.9543,3096.7832,3083.9015,3089.9529,145883771
|
||||
2016/9/9,3078.8548,3101.7922,3078.2183,3095.4269,160692924
|
||||
2016/9/12,3021.9771,3040.9522,2999.9288,3037.5073,206012086
|
||||
2016/9/13,3023.5095,3029.7208,3008.7405,3025.0345,135387580
|
||||
2016/9/14,3002.8486,3017.9447,2995.4156,3008.9044,133413401
|
||||
2016/9/19,3026.0513,3026.6512,3005.3228,3005.3228,119225027
|
||||
2016/9/20,3022.9995,3027.8165,3015.8804,3027.1717,118924117
|
||||
2016/9/21,3025.8736,3032.4503,3017.5408,3021.5762,115721213
|
||||
2016/9/22,3042.3132,3054.4351,3035.0703,3038.422,139309554
|
||||
2016/9/23,3033.8956,3046.8047,3032.8023,3044.7858,125590976
|
||||
2016/9/26,2980.4295,3028.2428,2980.1169,3028.2428,144330286
|
||||
2016/9/27,2998.1723,2998.2333,2969.1321,2974.593,121701450
|
||||
2016/9/28,2987.8576,3000.6954,2984.3206,3000.6954,104625697
|
||||
2016/9/29,2998.4827,3009.1984,2991.9088,2992.1683,113213919
|
||||
2016/9/30,3004.703,3009.1953,2993.0617,2994.2507,101333562
|
||||
2016/10/10,3048.1428,3048.2358,3014.6198,3020.4566,160051104
|
||||
2016/10/11,3065.2497,3066.104,3048.0175,3051.6216,167273496
|
||||
2016/10/12,3058.4981,3060.5142,3048.8881,3057.3163,142493577
|
||||
2016/10/13,3061.3458,3064.9989,3052.6403,3057.9724,154756725
|
||||
2016/10/14,3063.8086,3064.7895,3043.1841,3056.9927,155373705
|
||||
2016/10/17,3041.1663,3068.812,3033.7532,3064.691,163733265
|
||||
2016/10/18,3083.8751,3084.1867,3037.4036,3037.4036,182042460
|
||||
2016/10/19,3084.7189,3096.2228,3076.7705,3085.749,182470143
|
||||
2016/10/20,3084.4577,3089.682,3076.2949,3084.9076,160691364
|
||||
2016/10/21,3090.9412,3101.8486,3069.2669,3081.3891,187388072
|
||||
2016/10/24,3128.2467,3137.0335,3090.7864,3092.0466,240522349
|
||||
2016/10/25,3131.9385,3132.5046,3121.0499,3127.9684,203380898
|
||||
2016/10/26,3116.3119,3129.8382,3110.3874,3129.8382,191663263
|
||||
2016/10/27,3112.3498,3114.7587,3100.3918,3112.6028,158008789
|
||||
2016/10/28,3104.2703,3128.6427,3101.2371,3111.7035,181774123
|
||||
2016/10/31,3100.492,3102.3015,3081.0722,3097.1881,151506764
|
||||
2016/11/1,3122.4356,3122.6147,3097.0423,3101.6639,160232032
|
||||
2016/11/2,3102.7326,3118.9773,3099.8196,3115.7291,182722067
|
||||
2016/11/3,3128.9356,3140.9298,3094.1025,3096.765,222986260
|
||||
2016/11/4,3125.3167,3141.3337,3119.5354,3126.3489,197683197
|
||||
2016/11/7,3133.3326,3139.2017,3117.0961,3124.892,179418490
|
||||
2016/11/8,3147.8875,3156.8812,3134.9547,3140.9435,190846979
|
||||
2016/11/9,3128.3702,3146.9497,3096.9466,3146.0775,241114958
|
||||
2016/11/10,3171.282,3172.3085,3148.544,3148.544,244192602
|
||||
2016/11/11,3196.0436,3202.7401,3166.0696,3169.4007,310854579
|
||||
2016/11/14,3210.371,3221.4584,3186.7956,3187.7093,329608313
|
||||
2016/11/15,3206.9858,3214.292,3195.0353,3209.9546,240886350
|
||||
2016/11/16,3205.0572,3210.8927,3195.4105,3208.4973,221766993
|
||||
2016/11/17,3208.4525,3211.0527,3187.2056,3198.4985,214206240
|
||||
2016/11/18,3192.8559,3212.394,3187.4963,3207.1933,209826639
|
||||
2016/11/21,3218.1477,3229.7568,3188.2799,3188.4964,230652844
|
||||
2016/11/22,3248.3517,3249.6765,3220.9825,3220.9825,261631547
|
||||
2016/11/23,3241.1366,3262.8788,3231.5863,3247.9448,249959592
|
||||
2016/11/24,3241.7359,3257.8574,3232.869,3237.428,232324527
|
||||
2016/11/25,3261.9378,3262.4379,3209.5979,3241.2433,233921601
|
||||
2016/11/28,3276.9996,3288.3372,3267.6736,3270.0471,281551253
|
||||
2016/11/29,3282.9238,3301.2133,3263.3973,3269.2339,320836287
|
||||
2016/11/30,3250.0344,3277.2694,3239.5206,3272.1422,243576053
|
||||
2016/12/1,3273.3093,3279.6707,3256.2555,3257.0268,237759864
|
||||
2016/12/2,3243.8432,3279.7137,3235.277,3270.1205,259567205
|
||||
2016/12/5,3204.7092,3219.5181,3194.8785,3203.7844,223010394
|
||||
2016/12/6,3199.6473,3215.3114,3196.5248,3202.0293,157572693
|
||||
2016/12/7,3222.2415,3222.428,3189.485,3198.4748,169072847
|
||||
2016/12/8,3215.3658,3228.122,3211.4712,3225.5499,170710173
|
||||
2016/12/9,3232.8834,3244.8013,3207.0433,3209.3395,204023956
|
||||
2016/12/12,3152.9704,3245.0946,3149.8955,3233.6661,274708461
|
||||
2016/12/13,3155.0374,3162.496,3118.7121,3138.9881,185164495
|
||||
2016/12/14,3140.5308,3170.0208,3136.348,3149.3774,201358887
|
||||
2016/12/15,3117.677,3138.7793,3100.9128,3125.7568,189990626
|
||||
2016/12/16,3122.9815,3128.8735,3106.3464,3111.5145,164988699
|
||||
2016/12/19,3118.0846,3125.284,3110.0817,3120.6963,154169716
|
||||
2016/12/20,3102.8759,3117.0145,3084.7997,3115.8984,157426759
|
||||
2016/12/21,3137.4297,3140.2512,3107.2396,3107.2396,186706607
|
||||
2016/12/22,3139.558,3143.1685,3126.8872,3132.1558,167804990
|
||||
2016/12/23,3110.1544,3138.404,3103.7476,3134.9292,166176769
|
||||
2016/12/26,3122.569,3122.8812,3068.415,3095.5787,152571881
|
||||
2016/12/27,3114.664,3127.8828,3113.7451,3117.3868,141528939
|
||||
2016/12/28,3102.2357,3118.7818,3094.5488,3113.7671,135727087
|
||||
2016/12/29,3096.0968,3111.7994,3087.344,3095.8447,132623292
|
||||
2016/12/30,3103.6373,3108.8393,3089.9894,3097.3454,133267130
|
||||
2017/1/3,3135.9208,3136.4558,3105.3085,3105.3085,141567187
|
||||
2017/1/4,3158.794,3160.1029,3130.1145,3133.7873,167860850
|
||||
2017/1/5,3165.4109,3168.5021,3154.281,3157.9063,174727645
|
||||
2017/1/6,3154.321,3172.0347,3153.0253,3163.7761,183708966
|
||||
2017/1/9,3171.2362,3173.136,3147.7351,3148.5317,171714075
|
||||
2017/1/10,3161.6713,3174.5781,3157.3322,3167.5701,179759216
|
||||
2017/1/11,3136.7535,3167.0288,3136.2667,3156.6856,178362221
|
||||
2017/1/12,3119.2886,3144.9699,3115.9787,3133.6015,148889240
|
||||
2017/1/13,3112.7644,3130.5146,3102.1628,3116.0827,156274214
|
||||
2017/1/16,3103.428,3105.1423,3044.2912,3104.4924,257885996
|
||||
2017/1/17,3108.7746,3108.9072,3072.3384,3087.0295,136157861
|
||||
2017/1/18,3113.0123,3123.7203,3098.5864,3104.7664,131780128
|
||||
2017/1/19,3101.2992,3115.7778,3094.0055,3104.9715,123851420
|
||||
2017/1/20,3123.1389,3125.6599,3095.2147,3095.8185,122366777
|
||||
2017/1/23,3136.7748,3145.8411,3125.4209,3125.4209,132660392
|
||||
2017/1/24,3142.5533,3149.5312,3131.2181,3134.5921,125973881
|
||||
2017/1/25,3149.5547,3151.4723,3133.1911,3137.6462,112073827
|
||||
2017/1/26,3159.166,3163.1041,3148.9083,3149.2167,113876772
|
||||
2017/2/3,3140.17,3162.6771,3136.013,3160.0816,92224736
|
||||
2017/2/6,3156.9838,3158.8433,3135.3869,3143.0931,127198283
|
||||
2017/2/7,3153.0878,3159.544,3140.0356,3154.4046,128337442
|
||||
2017/2/8,3166.9818,3167.4465,3132.0333,3148.086,144920187
|
||||
2017/2/9,3183.1794,3186.838,3162.5744,3164.6875,191640327
|
||||
2017/2/10,3196.699,3205.049,3182.8021,3183.0069,239348913
|
||||
2017/2/13,3216.8394,3219.4072,3198.9946,3198.9946,220191508
|
||||
2017/2/14,3217.928,3219.4047,3205.2853,3216.137,188798088
|
||||
2017/2/15,3212.9857,3235.9977,3206.5606,3215.4639,241507706
|
||||
2017/2/16,3229.6184,3230.2754,3207.7852,3210.3567,216955942
|
||||
2017/2/17,3202.0756,3238.3959,3199.4248,3227.7073,226228177
|
||||
2017/2/20,3239.9613,3241.458,3198.9633,3198.9633,232152096
|
||||
2017/2/21,3253.3257,3254.3355,3239.8775,3242.2226,211673066
|
||||
2017/2/22,3261.2184,3261.3808,3243.8398,3252.6898,207453776
|
||||
2017/2/23,3251.375,3264.0819,3236.3549,3258.8319,209179800
|
||||
2017/2/24,3253.4327,3253.9556,3233.5348,3246.8603,186406362
|
||||
2017/2/27,3228.6602,3251.6543,3224.0884,3249.1945,182581071
|
||||
2017/2/28,3241.7331,3242.679,3225.9689,3225.9689,151244318
|
||||
2017/3/1,3246.9335,3259.9781,3237.8714,3240.0726,190677550
|
||||
2017/3/2,3230.0281,3256.8074,3228.6647,3250.5183,181215076
|
||||
2017/3/3,3218.3118,3221.1553,3206.6127,3219.2019,157082368
|
||||
2017/3/6,3233.8657,3234.6626,3215.067,3217.3345,156092158
|
||||
2017/3/7,3242.4063,3242.6591,3226.8219,3233.0939,164064235
|
||||
2017/3/8,3240.6646,3245.3043,3230.6083,3240.5323,160731388
|
||||
2017/3/9,3216.7457,3233.8749,3205.2794,3233.7007,167371108
|
||||
2017/3/10,3212.7601,3222.3189,3208.4472,3213.7294,136672743
|
||||
2017/3/13,3237.0244,3237.1212,3193.1565,3209.4492,163673760
|
||||
2017/3/14,3239.3278,3246.3285,3231.5209,3235.2515,146946022
|
||||
2017/3/15,3241.7597,3243.713,3227.7377,3235.403,144055682
|
||||
2017/3/16,3268.9354,3269.77,3247.1628,3247.1628,189416002
|
||||
2017/3/17,3237.4471,3274.1903,3232.2806,3271.8665,200583223
|
||||
2017/3/20,3250.8082,3251.1271,3228.1177,3241.1101,170548430
|
||||
2017/3/21,3261.6108,3262.2209,3246.6959,3250.2473,162719306
|
||||
2017/3/22,3245.2198,3255.7779,3229.1283,3246.2233,189731649
|
||||
2017/3/23,3248.5495,3262.0914,3221.9344,3245.8078,193029144
|
||||
2017/3/24,3269.4451,3275.2066,3241.1233,3247.3495,219777914
|
||||
2017/3/27,3266.9552,3283.2393,3262.1184,3268.924,201852675
|
||||
2017/3/28,3252.9479,3265.6344,3246.0861,3265.6344,161710013
|
||||
2017/3/29,3241.3144,3262.0976,3233.2795,3252.8653,216105575
|
||||
2017/3/30,3210.2369,3240.0174,3195.8524,3235.1369,247135479
|
||||
2017/3/31,3222.5142,3226.2483,3205.5365,3206.2529,196442922
|
||||
2017/4/5,3270.3054,3270.6453,3233.2367,3235.6603,248320202
|
||||
2017/4/6,3281.0047,3286.6739,3265.7645,3272.1926,245287999
|
||||
2017/4/7,3286.616,3295.187,3275.0507,3280.6239,236108942
|
||||
2017/4/10,3269.3926,3285.4594,3265.0121,3285.4594,232694616
|
||||
2017/4/11,3288.9657,3290.3887,3244.4047,3266.2219,281281248
|
||||
2017/4/12,3273.8301,3284.9338,3262.2773,3283.8369,269381790
|
||||
2017/4/13,3275.9603,3281.1369,3261.4901,3265.2181,207346875
|
||||
2017/4/14,3246.0668,3276.7112,3238.8959,3276.1381,214508558
|
||||
2017/4/17,3222.1673,3229.9491,3199.9121,3229.9491,212737189
|
||||
2017/4/18,3196.7133,3225.0546,3196.4884,3215.3963,188661353
|
||||
2017/4/19,3170.6867,3189.4368,3147.0655,3184.666,213238075
|
||||
2017/4/20,3172.1003,3178.1826,3148.1844,3165.665,190873985
|
||||
2017/4/21,3173.1512,3180.7944,3158.6286,3170.2899,164761740
|
||||
2017/4/24,3129.5312,3164.2479,3111.2145,3164.2479,186277434
|
||||
2017/4/25,3134.5674,3145.2672,3117.4488,3123.8943,153418307
|
||||
2017/4/26,3140.8471,3152.9534,3131.418,3132.9181,169878107
|
||||
2017/4/27,3152.1869,3155.0033,3097.3334,3131.3496,211793073
|
||||
2017/4/28,3154.6584,3154.7266,3136.5781,3144.0219,162889899
|
||||
2017/5/2,3143.7121,3154.7812,3136.5391,3147.2275,154222962
|
||||
2017/5/3,3135.346,3148.2857,3123.7509,3138.3068,163763924
|
||||
2017/5/4,3127.3687,3143.8179,3111.3912,3127.1058,177967485
|
||||
2017/5/5,3103.0378,3117.6141,3092.0918,3114.7735,176213641
|
||||
2017/5/8,3078.6129,3093.4516,3067.6943,3090.0652,180526904
|
||||
2017/5/9,3080.5269,3084.2077,3056.558,3064.8484,135066674
|
||||
2017/5/10,3052.785,3090.8191,3051.5896,3078.1728,160794452
|
||||
2017/5/11,3061.5003,3063.5637,3016.5305,3036.7891,191341901
|
||||
2017/5/12,3083.5132,3090.4914,3051.8713,3054.1123,159684099
|
||||
2017/5/15,3090.2289,3098.9125,3085.9319,3085.9319,135660728
|
||||
2017/5/16,3112.9642,3113.5116,3060.5344,3082.8717,173775564
|
||||
2017/5/17,3104.4415,3119.5816,3101.2953,3107.802,168674158
|
||||
2017/5/18,3090.139,3103.4413,3077.9631,3082.3288,148620035
|
||||
2017/5/19,3090.6309,3095.4826,3081.278,3086.7054,129635230
|
||||
2017/5/22,3075.6756,3103.9375,3063.1529,3087.1705,153683730
|
||||
2017/5/23,3061.947,3084.2352,3050.8423,3069.3935,178310599
|
||||
2017/5/24,3064.0759,3064.8127,3022.3026,3047.5681,139813353
|
||||
2017/5/25,3107.8311,3114.6578,3052.8309,3055.3425,191391841
|
||||
2017/5/26,3110.0587,3120.6627,3100.3877,3101.2864,155923486
|
||||
2017/5/31,3117.1778,3143.2787,3111.5563,3125.3252,152950430
|
||||
2017/6/1,3102.6232,3113.5212,3097.6794,3108.4214,163015719
|
||||
2017/6/2,3105.54,3110.3891,3081.8485,3094.2253,142504925
|
||||
2017/6/5,3091.6561,3105.5056,3084.8301,3102.1095,132570300
|
||||
2017/6/6,3102.126,3102.8633,3078.7872,3084.5401,113439963
|
||||
2017/6/7,3140.3249,3140.7743,3098.9508,3101.7608,173229014
|
||||
2017/6/8,3150.3336,3153.2635,3132.8278,3136.4705,152277659
|
||||
2017/6/9,3158.4004,3165.9197,3146.1075,3147.4533,160136334
|
||||
2017/6/12,3139.8766,3164.9502,3135.314,3149.5266,146729425
|
||||
2017/6/13,3153.7429,3155.9895,3131.0431,3134.0089,128318279
|
||||
2017/6/14,3130.674,3149.1731,3125.3546,3146.748,138347042
|
||||
2017/6/15,3132.4863,3137.5854,3117.084,3125.5865,146954245
|
||||
2017/6/16,3123.1662,3134.2511,3117.8567,3126.3728,129652758
|
||||
2017/6/19,3144.3739,3146.7703,3121.7787,3122.1578,134891758
|
||||
2017/6/20,3140.0136,3150.4646,3134.6106,3148.0187,141191802
|
||||
2017/6/21,3156.2118,3157.0275,3132.6173,3148.9861,136688268
|
||||
2017/6/22,3147.4532,3186.9823,3146.6432,3152.2424,191344006
|
||||
2017/6/23,3157.873,3158.0474,3118.0946,3138.4441,154843648
|
||||
2017/6/26,3185.4439,3187.8891,3156.9767,3157.0022,173579211
|
||||
2017/6/27,3191.1969,3193.4613,3172.463,3183.4198,148201198
|
||||
2017/6/28,3173.2014,3193.4397,3170.7859,3183.6334,146516720
|
||||
2017/6/29,3188.0625,3188.7741,3174.2835,3174.9811,128755470
|
||||
2017/6/30,3192.4269,3193.2411,3171.5703,3176.9481,121464543
|
||||
2017/7/3,3195.9116,3196.2861,3177.0244,3191.9982,140305717
|
||||
2017/7/4,3182.8039,3193.0644,3174.314,3192.8885,141114967
|
||||
2017/7/5,3207.1342,3207.3095,3174.7081,3179.2169,148296483
|
||||
2017/7/6,3212.444,3215.95,3188.7733,3203.8631,175809287
|
||||
2017/7/7,3217.9567,3219.5232,3195.2905,3203.8225,176715416
|
||||
2017/7/10,3212.6319,3223.3402,3203.2089,3208.4627,198928010
|
||||
2017/7/11,3203.0375,3226.908,3199.2235,3201.5169,187837262
|
||||
2017/7/12,3197.5439,3215.1962,3177.9346,3201.9292,186900880
|
||||
2017/7/13,3218.1632,3219.2683,3190.3393,3192.3615,195303611
|
||||
2017/7/14,3222.4168,3222.9784,3204.8529,3212.0316,160126773
|
||||
2017/7/17,3176.4648,3230.354,3139.5035,3219.7914,266205274
|
||||
2017/7/18,3187.5672,3187.671,3150.1284,3159.7318,190623060
|
||||
2017/7/19,3230.9762,3232.9408,3179.73,3181.4015,272420726
|
||||
2017/7/20,3244.8647,3246.236,3225.4328,3227.5056,232108392
|
||||
2017/7/21,3237.9817,3247.7122,3231.9556,3236.5881,206003251
|
||||
2017/7/24,3250.5989,3261.1046,3230.0705,3230.898,233056399
|
||||
2017/7/25,3243.6894,3261.6454,3233.1376,3249.1376,205573873
|
||||
2017/7/26,3247.6748,3264.8483,3228.0389,3244.4608,213542005
|
||||
2017/7/27,3249.7814,3251.9261,3220.6366,3243.765,228485945
|
||||
2017/7/28,3253.2404,3256.3706,3232.9634,3240.1728,182226880
|
||||
2017/7/31,3273.0283,3276.9461,3251.1941,3252.7519,246039440
|
||||
2017/8/1,3292.6383,3292.6383,3273.5038,3274.3685,237194594
|
||||
2017/8/2,3285.0568,3305.4313,3282.0377,3288.5183,266730628
|
||||
2017/8/3,3272.9286,3293.3686,3262.1554,3279.9864,233277004
|
||||
2017/8/4,3262.0809,3287.1929,3261.3066,3269.3182,275906340
|
||||
2017/8/7,3279.4566,3280.1035,3243.7153,3257.67,231173379
|
||||
2017/8/8,3281.8728,3285.4833,3269.6582,3277.1887,252043537
|
||||
2017/8/9,3275.573,3277.9433,3263.8468,3277.8083,235597907
|
||||
2017/8/10,3261.7494,3282.519,3236.1829,3269.7347,240684622
|
||||
2017/8/11,3208.5413,3245.1163,3200.7481,3237.9222,262962995
|
||||
2017/8/14,3237.3602,3240.0517,3206.0436,3206.0436,190346796
|
||||
2017/8/15,3251.2617,3263.5892,3235.1013,3235.2298,182297997
|
||||
2017/8/16,3246.4512,3248.785,3228.8705,3247.8525,176852051
|
||||
2017/8/17,3268.4298,3269.1389,3251.4593,3253.8455,203622551
|
||||
2017/8/18,3268.7243,3275.0763,3248.0833,3253.2434,191122483
|
||||
2017/8/21,3286.9055,3287.5186,3270.4753,3274.5805,186122483
|
||||
2017/8/22,3290.2257,3293.476,3274.941,3287.6147,186537991
|
||||
2017/8/23,3287.7049,3299.4572,3274.4404,3283.7966,179832208
|
||||
2017/8/24,3271.5117,3297.9886,3266.3589,3287.9594,163468937
|
||||
2017/8/25,3331.5221,3331.9146,3271.4608,3271.4608,205839482
|
||||
2017/8/28,3362.6514,3375.0339,3336.1264,3336.1264,257461438
|
||||
2017/8/29,3365.2261,3374.5947,3354.4627,3362.0604,219504535
|
||||
2017/8/30,3363.6266,3376.6481,3357.0803,3361.8207,246863312
|
||||
2017/8/31,3360.8103,3367.3581,3340.6865,3361.4621,234419781
|
||||
2017/9/1,3367.1194,3381.9252,3358.4724,3365.9913,282497584
|
||||
2017/9/4,3379.583,3381.4027,3359.1309,3369.7185,267427849
|
||||
2017/9/5,3384.317,3390.8233,3371.5706,3377.1968,216552946
|
||||
2017/9/6,3385.3888,3391.0105,3364.7645,3372.4277,229090785
|
||||
2017/9/7,3365.4974,3387.7956,3363.1765,3383.6281,221118685
|
||||
2017/9/8,3365.2426,3380.8898,3353.6876,3364.4275,198405184
|
||||
2017/9/11,3376.4188,3384.81,3360.0462,3365.3506,219011019
|
||||
2017/9/12,3379.488,3391.0694,3370.8519,3381.487,272910319
|
||||
2017/9/13,3384.147,3387.1397,3366.5412,3374.7185,194550715
|
||||
2017/9/14,3371.4256,3391.6435,3361.3335,3383.47,221306487
|
||||
2017/9/15,3353.6192,3365.5277,3345.3283,3365.1454,219765816
|
||||
2017/9/18,3362.8587,3371.7486,3352.5134,3352.5134,190319676
|
||||
2017/9/19,3356.8446,3370.4009,3344.7054,3365.5315,191129691
|
||||
2017/9/20,3365.9959,3370.0978,3346.5356,3352.1848,192196661
|
||||
2017/9/21,3357.8123,3377.8844,3356.8754,3364.6977,197448695
|
||||
2017/9/22,3352.5294,3356.4514,3334.9846,3347.1569,179234007
|
||||
2017/9/25,3341.5487,3350.9612,3334.9438,3344.5886,169621293
|
||||
2017/9/26,3343.5826,3347.1629,3332.5985,3336.3497,132628595
|
||||
2017/9/27,3345.2717,3349.6949,3340.2989,3340.8219,143086945
|
||||
2017/9/28,3339.6421,3344.6005,3336.1784,3343.8446,149444300
|
||||
2017/9/29,3348.9431,3357.0154,3340.3109,3340.3109,144862443
|
||||
2017/10/9,3374.3781,3410.1704,3366.965,3403.2458,191736057
|
||||
2017/10/10,3382.9879,3384.0262,3358.7953,3373.3446,179423841
|
||||
2017/10/11,3388.2838,3395.7794,3379.1634,3381.488,181476704
|
||||
2017/10/12,3386.1,3390.2036,3372.5331,3385.5329,161809380
|
||||
2017/10/13,3390.5233,3395.7484,3383.2392,3384.4883,139954764
|
||||
2017/10/16,3378.4704,3400.5113,3374.7687,3393.2055,174330620
|
||||
2017/10/17,3372.0407,3382.4072,3365.5646,3373.2342,125381725
|
||||
2017/10/18,3381.7937,3383.2323,3371.9249,3373.5281,157228791
|
||||
2017/10/19,3370.1721,3378.7359,3359.6284,3374.6444,158476495
|
||||
2017/10/20,3378.6481,3379.7652,3360.1001,3363.5138,127172851
|
||||
2017/10/23,3380.699,3385.2853,3374.705,3382.28,130846289
|
||||
2017/10/24,3388.2477,3388.6886,3374.1246,3376.5989,139897511
|
||||
2017/10/25,3396.8975,3398.3041,3382.0338,3384.8579,123131222
|
||||
2017/10/26,3407.5671,3414.2415,3391.4549,3397.519,183768625
|
||||
2017/10/27,3416.8124,3421.1026,3402.1141,3404.4978,170257173
|
||||
2017/10/30,3390.3371,3419.7315,3357.2762,3413.8679,208349286
|
||||
2017/10/31,3393.3417,3397.0988,3376.1238,3380.999,153498206
|
||||
2017/11/1,3395.9125,3410.3519,3388.5978,3393.9678,180566127
|
||||
2017/11/2,3383.3095,3391.652,3372.2131,3391.652,166864267
|
||||
2017/11/3,3371.7441,3380.57,3347.3603,3377.7356,172714790
|
||||
2017/11/6,3388.1742,3389.3826,3356.5337,3369.685,154636468
|
||||
2017/11/7,3413.5748,3415.1482,3387.9459,3389.4721,190571746
|
||||
2017/11/8,3415.4602,3434.4918,3404.8811,3409.1474,185436470
|
||||
2017/11/9,3427.7946,3428.7704,3408.6186,3410.6723,158650426
|
||||
2017/11/10,3432.6731,3438.7924,3414.3286,3423.1846,189276503
|
||||
2017/11/13,3447.8358,3449.1638,3435.0849,3435.1839,205389054
|
||||
2017/11/14,3429.5482,3450.4949,3419.6919,3446.5453,196472674
|
||||
2017/11/15,3402.5245,3423.7495,3396.381,3416.2112,168792076
|
||||
2017/11/16,3399.2503,3409.6532,3390.5888,3393.1937,156684332
|
||||
2017/11/17,3382.9075,3403.2855,3373.2956,3392.6834,249458153
|
||||
2017/11/20,3392.3988,3393.1063,3337.116,3361.3563,176524683
|
||||
2017/11/21,3410.4977,3419.802,3377.5989,3382.3595,196871803
|
||||
2017/11/22,3430.4643,3442.1777,3404.2865,3417.3313,213567093
|
||||
2017/11/23,3351.9182,3429.4237,3342.3324,3425.0093,215265393
|
||||
2017/11/24,3353.8207,3360.7459,3328.3339,3340.3842,159569663
|
||||
2017/11/27,3322.2298,3347.0506,3315.2642,3346.6567,166439170
|
||||
2017/11/28,3333.657,3333.7998,3300.7808,3311.2322,138247799
|
||||
2017/11/29,3337.862,3343.0624,3305.5721,3335.5671,183805932
|
||||
2017/11/30,3317.1884,3340.9201,3306.2832,3328.6427,156595851
|
||||
2017/12/1,3317.6174,3324.5161,3302.4398,3315.1051,139198300
|
||||
2017/12/4,3309.6183,3323.9961,3304.1034,3310.3814,148053288
|
||||
2017/12/5,3303.6751,3315.7373,3300.5117,3301.6906,208278862
|
||||
2017/12/6,3293.9648,3296.2013,3254.6108,3291.3128,151604452
|
||||
2017/12/7,3272.0542,3291.2817,3259.1637,3283.2791,132105900
|
||||
2017/12/8,3289.9924,3297.1304,3258.7593,3264.4776,133209314
|
||||
2017/12/11,3322.1956,3322.6736,3288.2949,3290.4881,131965984
|
||||
2017/12/12,3280.8136,3320.3103,3280.3291,3320.3103,124604827
|
||||
2017/12/13,3303.0373,3304.0101,3273.3248,3278.3968,111998647
|
||||
2017/12/14,3292.4385,3309.5295,3282.5732,3302.9322,120544235
|
||||
2017/12/15,3266.1371,3287.5292,3259.3883,3287.5292,130940618
|
||||
2017/12/18,3267.9224,3280.5438,3254.1775,3268.0335,120700389
|
||||
2017/12/19,3296.5384,3296.9398,3266.0191,3266.0191,115140134
|
||||
2017/12/20,3287.6057,3300.2124,3276.1201,3296.7403,137745118
|
||||
2017/12/21,3300.0593,3309.2233,3267.4042,3281.1179,142127927
|
||||
2017/12/22,3297.063,3307.3276,3293.4415,3297.6852,124047326
|
||||
2017/12/25,3280.461,3312.2998,3270.4407,3296.2106,146893635
|
||||
2017/12/26,3306.1246,3307.2994,3274.3274,3277.8372,142434501
|
||||
2017/12/27,3275.7828,3307.0798,3270.349,3302.4612,162674890
|
||||
2017/12/28,3296.3847,3304.0962,3263.7282,3272.2913,175371670
|
||||
2017/12/29,3307.1721,3308.2249,3292.7699,3295.2461,141586836
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
name: regional_pmm
|
||||
channels:
|
||||
- conda-forge
|
||||
- defaults
|
||||
dependencies:
|
||||
- python=3.6
|
||||
- pip
|
||||
- matplotlib==3.1.1
|
||||
- numpy==1.19.4
|
||||
- pandas==0.25.1
|
||||
- scikit-learn==0.21.3
|
||||
- pytorch==1.8.0
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
import os
|
||||
import mindspore as ms
|
||||
import numpy as np
|
||||
|
||||
class Exp_Basic(object):
|
||||
def __init__(self, args):
|
||||
self.args = args
|
||||
self.device = self._acquire_device()
|
||||
self.model = self._build_model()
|
||||
|
||||
def _build_model(self):
|
||||
raise NotImplementedError("This method should be overridden in subclasses.")
|
||||
return None
|
||||
|
||||
def _acquire_device(self):
|
||||
if self.args.use_gpu:
|
||||
os.environ["DEVICE_ID"] = str(self.args.gpu) if not self.args.use_multi_gpu else self.args.devices
|
||||
device = ms.context.PYNATIVE_MODE # MindSpore uses context for device management
|
||||
print('Use GPU: {}'.format(self.args.gpu))
|
||||
else:
|
||||
ms.context.set_context(mode=ms.context.PYNATIVE_MODE, device_target="CPU")
|
||||
device = "CPU"
|
||||
print('Use CPU')
|
||||
return device
|
||||
|
||||
def _get_data(self):
|
||||
pass
|
||||
|
||||
def vali(self):
|
||||
pass
|
||||
|
||||
def train(self):
|
||||
pass
|
||||
|
||||
def test(self):
|
||||
pass
|
||||
|
|
@ -1,243 +0,0 @@
|
|||
import os
|
||||
import time
|
||||
import numpy as np
|
||||
import mindspore as ms
|
||||
from mindspore import nn
|
||||
from mindspore import ops
|
||||
|
||||
from data.data_loader import Dataset_ETT_hour, Dataset_ETT_minute, Dataset_Custom, Dataset_Pred
|
||||
from exp.exp_basic import Exp_Basic
|
||||
from models.model import Informer, InformerStack
|
||||
|
||||
from utils.tools import EarlyStopping, adjust_learning_rate
|
||||
from utils.metrics import metric
|
||||
|
||||
class Exp_Informer(Exp_Basic):
|
||||
def __init__(self, args):
|
||||
super(Exp_Informer, self).__init__(args)
|
||||
|
||||
def _build_model(self):
|
||||
model_dict = {
|
||||
'informer': Informer,
|
||||
'informerstack': InformerStack,
|
||||
}
|
||||
if self.args.model in model_dict:
|
||||
e_layers = self.args.e_layers if self.args.model == 'informer' else self.args.s_layers
|
||||
model = model_dict[self.args.model](
|
||||
self.args.enc_in,
|
||||
self.args.dec_in,
|
||||
self.args.c_out,
|
||||
self.args.seq_len,
|
||||
self.args.label_len,
|
||||
self.args.pred_len,
|
||||
self.args.factor,
|
||||
self.args.d_model,
|
||||
self.args.n_heads,
|
||||
e_layers,
|
||||
self.args.d_layers,
|
||||
self.args.d_ff,
|
||||
self.args.dropout,
|
||||
self.args.attn,
|
||||
self.args.embed,
|
||||
self.args.freq,
|
||||
self.args.activation,
|
||||
self.args.output_attention,
|
||||
self.args.distil,
|
||||
self.args.mix
|
||||
)
|
||||
if self.args.use_multi_gpu and self.args.use_gpu:
|
||||
model = nn.DataParallel(model, device_ids=self.args.device_ids)
|
||||
return model
|
||||
else:
|
||||
raise ValueError("Model type not supported.")
|
||||
|
||||
def _get_data(self, flag):
|
||||
data_dict = {
|
||||
'ETTh1': Dataset_ETT_hour,
|
||||
'ETTh2': Dataset_ETT_hour,
|
||||
'ETTm1': Dataset_ETT_minute,
|
||||
'ETTm2': Dataset_ETT_minute,
|
||||
'WTH': Dataset_Custom,
|
||||
'ECL': Dataset_Custom,
|
||||
'Solar': Dataset_Custom,
|
||||
'custom': Dataset_Custom,
|
||||
}
|
||||
Data = data_dict[self.args.data]
|
||||
timeenc = 0 if self.args.embed != 'timeF' else 1
|
||||
|
||||
if flag == 'test':
|
||||
shuffle_flag, drop_last, batch_size = False, True, self.args.batch_size
|
||||
elif flag == 'pred':
|
||||
shuffle_flag, drop_last, batch_size = False, False, 1
|
||||
Data = Dataset_Pred
|
||||
else:
|
||||
shuffle_flag, drop_last, batch_size = True, True, self.args.batch_size
|
||||
|
||||
data_set = Data(
|
||||
root_path=self.args.root_path,
|
||||
data_path=self.args.data_path,
|
||||
flag=flag,
|
||||
size=[self.args.seq_len, self.args.label_len, self.args.pred_len],
|
||||
features=self.args.features,
|
||||
target=self.args.target,
|
||||
inverse=self.args.inverse,
|
||||
timeenc=timeenc,
|
||||
freq=self.args.freq,
|
||||
cols=self.args.cols
|
||||
)
|
||||
print(f"{flag} dataset length: {len(data_set)}")
|
||||
|
||||
data_loader = ms.dataset.GeneratorDataset(data_set, batch_size=batch_size, shuffle=shuffle_flag)
|
||||
return data_set, data_loader
|
||||
|
||||
def _select_optimizer(self):
|
||||
return nn.Adam(self.model.trainable_params(), learning_rate=self.args.learning_rate)
|
||||
|
||||
def _select_criterion(self):
|
||||
return nn.MSELoss()
|
||||
|
||||
def vali(self, vali_data, vali_loader, criterion):
|
||||
self.model.set_train(False)
|
||||
total_loss = []
|
||||
|
||||
for batch in vali_loader:
|
||||
batch_x, batch_y, batch_x_mark, batch_y_mark = batch
|
||||
pred, true = self._process_one_batch(vali_data, batch_x, batch_y, batch_x_mark, batch_y_mark)
|
||||
loss = criterion(pred, true)
|
||||
total_loss.append(loss.asnumpy())
|
||||
|
||||
total_loss = np.mean(total_loss)
|
||||
self.model.set_train(True)
|
||||
return total_loss
|
||||
|
||||
def train(self, setting):
|
||||
train_data, train_loader = self._get_data(flag='train')
|
||||
vali_data, vali_loader = self._get_data(flag='val')
|
||||
test_data, test_loader = self._get_data(flag='test')
|
||||
|
||||
path = os.path.join(self.args.checkpoints, setting)
|
||||
os.makedirs(path, exist_ok=True)
|
||||
|
||||
time_now = time.time()
|
||||
train_steps = len(train_loader)
|
||||
early_stopping = EarlyStopping(patience=self.args.patience, verbose=True)
|
||||
|
||||
model_optim = self._select_optimizer()
|
||||
criterion = self._select_criterion()
|
||||
|
||||
for epoch in range(self.args.train_epochs):
|
||||
train_loss = []
|
||||
self.model.set_train(True)
|
||||
epoch_time = time.time()
|
||||
|
||||
for i, batch in enumerate(train_loader):
|
||||
batch_x, batch_y, batch_x_mark, batch_y_mark = batch
|
||||
model_optim.zero_grad()
|
||||
|
||||
pred, true = self._process_one_batch(train_data, batch_x, batch_y, batch_x_mark, batch_y_mark)
|
||||
loss = criterion(pred, true)
|
||||
train_loss.append(loss.asnumpy())
|
||||
|
||||
loss.backward()
|
||||
model_optim.step()
|
||||
|
||||
if (i + 1) % 100 == 0:
|
||||
print(f"\titers: {i + 1}, epoch: {epoch + 1} | loss: {loss.asnumpy():.7f}")
|
||||
speed = (time.time() - time_now) / (i + 1)
|
||||
left_time = speed * ((self.args.train_epochs - epoch) * train_steps - i)
|
||||
print(f'\tspeed: {speed:.4f}s/iter; left time: {left_time:.4f}s')
|
||||
|
||||
print(f"Epoch: {epoch + 1} cost time: {time.time() - epoch_time}")
|
||||
train_loss = np.mean(train_loss)
|
||||
vali_loss = self.vali(vali_data, vali_loader, criterion)
|
||||
test_loss = self.vali(test_data, test_loader, criterion)
|
||||
|
||||
print(f"Epoch: {epoch + 1}, Steps: {train_steps} | Train Loss: {train_loss:.7f} Vali Loss: {vali_loss:.7f} Test Loss: {test_loss:.7f}")
|
||||
early_stopping(vali_loss, self.model, path)
|
||||
|
||||
if early_stopping.early_stop:
|
||||
print("Early stopping")
|
||||
break
|
||||
|
||||
adjust_learning_rate(model_optim, epoch + 1, self.args)
|
||||
|
||||
best_model_path = os.path.join(path, 'checkpoint.ckpt')
|
||||
ms.load_checkpoint(best_model_path, self.model)
|
||||
|
||||
return self.model
|
||||
|
||||
def test(self, setting):
|
||||
test_data, test_loader = self._get_data(flag='test')
|
||||
|
||||
self.model.set_train(False)
|
||||
preds, trues = [], []
|
||||
|
||||
for batch in test_loader:
|
||||
batch_x, batch_y, batch_x_mark, batch_y_mark = batch
|
||||
pred, true = self._process_one_batch(test_data, batch_x, batch_y, batch_x_mark, batch_y_mark)
|
||||
preds.append(pred.asnumpy())
|
||||
trues.append(true.asnumpy())
|
||||
|
||||
preds = np.array(preds)
|
||||
trues = np.array(trues)
|
||||
preds = preds.reshape(-1, preds.shape[-2], preds.shape[-1])
|
||||
trues = trues.reshape(-1, trues.shape[-2], trues.shape[-1])
|
||||
|
||||
folder_path = f'./results/{setting}/'
|
||||
os.makedirs(folder_path, exist_ok=True)
|
||||
|
||||
mae, mse, rmse, mape, mspe = metric(preds, trues)
|
||||
print(f'mse: {mse}, mae: {mae}')
|
||||
|
||||
np.save(os.path.join(folder_path, 'metrics.npy'), np.array([mae, mse, rmse, mape, mspe]))
|
||||
np.save(os.path.join(folder_path, 'pred.npy'), preds)
|
||||
np.save(os.path.join(folder_path, 'true.npy'), trues)
|
||||
|
||||
def predict(self, setting, load=False):
|
||||
pred_data, pred_loader = self._get_data(flag='pred')
|
||||
|
||||
if load:
|
||||
path = os.path.join(self.args.checkpoints, setting)
|
||||
best_model_path = os.path.join(path, 'checkpoint.ckpt')
|
||||
ms.load_checkpoint(best_model_path, self.model)
|
||||
|
||||
self.model.set_train(False)
|
||||
preds = []
|
||||
|
||||
for batch in pred_loader:
|
||||
batch_x, batch_y, batch_x_mark, batch_y_mark = batch
|
||||
pred, _ = self._process_one_batch(pred_data, batch_x, batch_y, batch_x_mark, batch_y_mark)
|
||||
preds.append(pred.asnumpy())
|
||||
|
||||
preds = np.array(preds)
|
||||
preds = preds.reshape(-1, preds.shape[-2], preds.shape[-1])
|
||||
|
||||
folder_path = f'./results/{setting}/'
|
||||
os.makedirs(folder_path, exist_ok=True)
|
||||
|
||||
np.save(os.path.join(folder_path, 'real_prediction.npy'), preds)
|
||||
|
||||
def _process_one_batch(self, dataset_object, batch_x, batch_y, batch_x_mark, batch_y_mark):
|
||||
batch_x = batch_x.astype(ms.float32)
|
||||
batch_y = batch_y.astype(ms.float32)
|
||||
|
||||
batch_x_mark = batch_x_mark.astype(ms.float32)
|
||||
batch_y_mark = batch_y_mark.astype(ms.float32)
|
||||
|
||||
# Decoder input
|
||||
dec_inp_shape = (batch_y.shape[0], self.args.pred_len, batch_y.shape[-1])
|
||||
dec_inp = ms.Tensor(np.zeros(dec_inp_shape), ms.float32) if self.args.padding == 0 else ms.Tensor(np.ones(dec_inp_shape), ms.float32)
|
||||
dec_inp = ops.Concat(1)([batch_y[:, :self.args.label_len, :], dec_inp])
|
||||
|
||||
if self.args.output_attention:
|
||||
outputs, _ = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)
|
||||
else:
|
||||
outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)
|
||||
|
||||
if self.args.inverse:
|
||||
outputs = dataset_object.inverse_transform(outputs)
|
||||
|
||||
f_dim = -1 if self.args.features == 'MS' else 0
|
||||
batch_y = batch_y[:, -self.args.pred_len:, f_dim:]
|
||||
|
||||
return outputs, batch_y
|
||||
|
Before Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 339 KiB |
|
Before Width: | Height: | Size: 296 KiB |
|
Before Width: | Height: | Size: 381 KiB |
|
|
@ -1,113 +0,0 @@
|
|||
import argparse
|
||||
import os
|
||||
import torch
|
||||
|
||||
from exp.exp_informer import Exp_Informer
|
||||
|
||||
parser = argparse.ArgumentParser(description='[Informer] Long Sequences Forecasting')
|
||||
|
||||
parser.add_argument('--model', type=str, required=True, default='informer',help='model of experiment, options: [informer, informerstack, informerlight(TBD)]')
|
||||
|
||||
parser.add_argument('--data', type=str, required=True, default='ETTh1', help='data')
|
||||
parser.add_argument('--root_path', type=str, default='./data/ETT/', help='root path of the data file')
|
||||
parser.add_argument('--data_path', type=str, default='ETTh1.csv', help='data file')
|
||||
parser.add_argument('--features', type=str, default='M', help='forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate')
|
||||
parser.add_argument('--target', type=str, default='OT', help='target feature in S or MS task')
|
||||
parser.add_argument('--freq', type=str, default='h', help='freq for time features encoding, options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h')
|
||||
parser.add_argument('--checkpoints', type=str, default='./checkpoints/', help='location of model checkpoints')
|
||||
|
||||
parser.add_argument('--seq_len', type=int, default=96, help='input sequence length of Informer encoder')
|
||||
parser.add_argument('--label_len', type=int, default=48, help='start token length of Informer decoder')
|
||||
parser.add_argument('--pred_len', type=int, default=24, help='prediction sequence length')
|
||||
# Informer decoder input: concat[start token series(label_len), zero padding series(pred_len)]
|
||||
|
||||
parser.add_argument('--enc_in', type=int, default=7, help='encoder input size')
|
||||
parser.add_argument('--dec_in', type=int, default=7, help='decoder input size')
|
||||
parser.add_argument('--c_out', type=int, default=7, help='output size')
|
||||
parser.add_argument('--d_model', type=int, default=512, help='dimension of model')
|
||||
parser.add_argument('--n_heads', type=int, default=8, help='num of heads')
|
||||
parser.add_argument('--e_layers', type=int, default=2, help='num of encoder layers')
|
||||
parser.add_argument('--d_layers', type=int, default=1, help='num of decoder layers')
|
||||
parser.add_argument('--s_layers', type=str, default='3,2,1', help='num of stack encoder layers')
|
||||
parser.add_argument('--d_ff', type=int, default=2048, help='dimension of fcn')
|
||||
parser.add_argument('--factor', type=int, default=5, help='probsparse attn factor')
|
||||
parser.add_argument('--padding', type=int, default=0, help='padding type')
|
||||
parser.add_argument('--distil', action='store_false', help='whether to use distilling in encoder, using this argument means not using distilling', default=True)
|
||||
parser.add_argument('--dropout', type=float, default=0.05, help='dropout')
|
||||
parser.add_argument('--attn', type=str, default='prob', help='attention used in encoder, options:[prob, full]')
|
||||
parser.add_argument('--embed', type=str, default='timeF', help='time features encoding, options:[timeF, fixed, learned]')
|
||||
parser.add_argument('--activation', type=str, default='gelu',help='activation')
|
||||
parser.add_argument('--output_attention', action='store_true', help='whether to output attention in ecoder')
|
||||
parser.add_argument('--do_predict', action='store_true', help='whether to predict unseen future data')
|
||||
parser.add_argument('--mix', action='store_false', help='use mix attention in generative decoder', default=True)
|
||||
parser.add_argument('--cols', type=str, nargs='+', help='certain cols from the data files as the input features')
|
||||
parser.add_argument('--num_workers', type=int, default=0, help='data loader num workers')
|
||||
parser.add_argument('--itr', type=int, default=2, help='experiments times')
|
||||
parser.add_argument('--train_epochs', type=int, default=6, help='train epochs')
|
||||
parser.add_argument('--batch_size', type=int, default=32, help='batch size of train input data')
|
||||
parser.add_argument('--patience', type=int, default=3, help='early stopping patience')
|
||||
parser.add_argument('--learning_rate', type=float, default=0.0001, help='optimizer learning rate')
|
||||
parser.add_argument('--des', type=str, default='test',help='exp description')
|
||||
parser.add_argument('--loss', type=str, default='mse',help='loss function')
|
||||
parser.add_argument('--lradj', type=str, default='type1',help='adjust learning rate')
|
||||
parser.add_argument('--use_amp', action='store_true', help='use automatic mixed precision training', default=False)
|
||||
parser.add_argument('--inverse', action='store_true', help='inverse output data', default=False)
|
||||
|
||||
parser.add_argument('--use_gpu', type=bool, default=True, help='use gpu')
|
||||
parser.add_argument('--gpu', type=int, default=0, help='gpu')
|
||||
parser.add_argument('--use_multi_gpu', action='store_true', help='use multiple gpus', default=False)
|
||||
parser.add_argument('--devices', type=str, default='0,1,2,3',help='device ids of multile gpus')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
args.use_gpu = True if torch.cuda.is_available() and args.use_gpu else False
|
||||
|
||||
if args.use_gpu and args.use_multi_gpu:
|
||||
args.devices = args.devices.replace(' ','')
|
||||
device_ids = args.devices.split(',')
|
||||
args.device_ids = [int(id_) for id_ in device_ids]
|
||||
args.gpu = args.device_ids[0]
|
||||
|
||||
data_parser = {
|
||||
'ETTh1':{'data':'ETTh1.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
|
||||
'ETTh2':{'data':'ETTh2.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
|
||||
'ETTm1':{'data':'ETTm1.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
|
||||
'ETTm2':{'data':'ETTm2.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
|
||||
'WTH':{'data':'WTH.csv','T':'WetBulbCelsius','M':[12,12,12],'S':[1,1,1],'MS':[12,12,1]},
|
||||
'ECL':{'data':'ECL.csv','T':'MT_320','M':[321,321,321],'S':[1,1,1],'MS':[321,321,1]},
|
||||
'Solar':{'data':'solar_AL.csv','T':'POWER_136','M':[137,137,137],'S':[1,1,1],'MS':[137,137,1]},
|
||||
}
|
||||
if args.data in data_parser.keys():
|
||||
data_info = data_parser[args.data]
|
||||
args.data_path = data_info['data']
|
||||
args.target = data_info['T']
|
||||
args.enc_in, args.dec_in, args.c_out = data_info[args.features]
|
||||
|
||||
args.s_layers = [int(s_l) for s_l in args.s_layers.replace(' ','').split(',')]
|
||||
args.detail_freq = args.freq
|
||||
args.freq = args.freq[-1:]
|
||||
|
||||
print('Args in experiment:')
|
||||
print(args)
|
||||
|
||||
Exp = Exp_Informer
|
||||
|
||||
for ii in range(args.itr):
|
||||
# setting record of experiments
|
||||
setting = '{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_at{}_fc{}_eb{}_dt{}_mx{}_{}_{}'.format(args.model, args.data, args.features,
|
||||
args.seq_len, args.label_len, args.pred_len,
|
||||
args.d_model, args.n_heads, args.e_layers, args.d_layers, args.d_ff, args.attn, args.factor,
|
||||
args.embed, args.distil, args.mix, args.des, ii)
|
||||
|
||||
exp = Exp(args) # set experiments
|
||||
print('>>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting))
|
||||
exp.train(setting)
|
||||
|
||||
print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))
|
||||
exp.test(setting)
|
||||
|
||||
if args.do_predict:
|
||||
print('>>>>>>>predicting : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))
|
||||
exp.predict(setting, True)
|
||||
|
||||
torch.cuda.empty_cache()
|
||||
|
|
@ -1,306 +0,0 @@
|
|||
import mindspore as ms
|
||||
import mindspore.nn as nn
|
||||
import mindspore.ops as ops
|
||||
import numpy as np
|
||||
from math import sqrt
|
||||
from utils.masking import TriangularCausalMask, ProbMask
|
||||
|
||||
class FullAttention(nn.Cell):
|
||||
def __init__(self, mask_flag=True, factor=5, scale=None, attention_dropout=0.1, output_attention=False):
|
||||
super(FullAttention, self).__init__()
|
||||
self.scale = scale
|
||||
self.mask_flag = mask_flag
|
||||
self.output_attention = output_attention
|
||||
self.dropout = nn.Dropout(attention_dropout)
|
||||
|
||||
def construct(self, queries, keys, values, attn_mask):
|
||||
B, L, H, E = queries.shape
|
||||
_, S, _, D = values.shape
|
||||
scale = self.scale or 1. / sqrt(E)
|
||||
|
||||
scores = ops.einsum("blhe,bshe->bhls", queries, keys)
|
||||
if self.mask_flag:
|
||||
if attn_mask is None:
|
||||
attn_mask = TriangularCausalMask(B, L)
|
||||
|
||||
scores = ops.masked_fill(scores, attn_mask.mask, -np.inf)
|
||||
|
||||
A = self.dropout(ops.softmax(scale * scores, axis=-1))
|
||||
V = ops.einsum("bhls,bshd->blhd", A, values)
|
||||
|
||||
if self.output_attention:
|
||||
return (V, A)
|
||||
else:
|
||||
return (V, None)
|
||||
|
||||
class ProbAttention(nn.Cell):
|
||||
def __init__(self, mask_flag=True, factor=5, scale=None, attention_dropout=0.1, output_attention=False):
|
||||
super(ProbAttention, self).__init__()
|
||||
self.factor = factor
|
||||
self.scale = scale
|
||||
self.mask_flag = mask_flag
|
||||
self.output_attention = output_attention
|
||||
self.dropout = nn.Dropout(attention_dropout)
|
||||
|
||||
def _prob_QK(self, Q, K, sample_k, n_top):
|
||||
B, H, L_K, E = K.shape
|
||||
_, _, L_Q, _ = Q.shape
|
||||
|
||||
K_expand = K.expand_dims(-3).repeat(1, 1, L_Q, 1)
|
||||
index_sample = ms.Tensor(np.random.randint(0, L_K, (L_Q, sample_k)), ms.int32)
|
||||
K_sample = K_expand[:, :, ms.Tensor(np.arange(L_Q)).expand_dims(1), index_sample, :]
|
||||
Q_K_sample = ops.matmul(Q.expand_dims(-2), K_sample.transpose(0, 1, 3, 2)).squeeze(-2)
|
||||
|
||||
M = Q_K_sample.max(-1)[0] - ops.reduce_sum(Q_K_sample, -1) / L_K
|
||||
M_top = M.topk(n_top)[1]
|
||||
|
||||
Q_reduce = Q[ms.Tensor(np.arange(B))[:, None, None],
|
||||
ms.Tensor(np.arange(H))[None, :, None],
|
||||
M_top, :]
|
||||
Q_K = ops.matmul(Q_reduce, K.transpose(0, 1, 3, 2))
|
||||
|
||||
return Q_K, M_top
|
||||
|
||||
def _get_initial_context(self, V, L_Q):
|
||||
B, H, L_V, D = V.shape
|
||||
if not self.mask_flag:
|
||||
V_sum = ops.reduce_mean(V, axis=-2)
|
||||
context = V_sum.expand_dims(-2).repeat(1, 1, L_Q, 1)
|
||||
else:
|
||||
assert(L_Q == L_V)
|
||||
context = ops.cumsum(V, axis=-2)
|
||||
return context
|
||||
|
||||
def _update_context(self, context_in, V, scores, index, L_Q, attn_mask):
|
||||
B, H, L_V, D = V.shape
|
||||
|
||||
if self.mask_flag:
|
||||
attn_mask = ProbMask(B, H, L_Q, index, scores)
|
||||
scores = ops.masked_fill(scores, attn_mask.mask, -np.inf)
|
||||
|
||||
attn = ops.softmax(scores, axis=-1)
|
||||
|
||||
context_in[ms.Tensor(np.arange(B))[:, None, None],
|
||||
ms.Tensor(np.arange(H))[None, :, None],
|
||||
index, :] = ops.matmul(attn, V).astype(context_in.dtype)
|
||||
|
||||
if self.output_attention:
|
||||
attns = (ms.Tensor(np.ones([B, H, L_V, L_V]) / L_V, dtype=context_in.dtype))
|
||||
attns[ms.Tensor(np.arange(B))[:, None, None], ms.Tensor(np.arange(H))[None, :, None], index, :] = attn
|
||||
return (context_in, attns)
|
||||
else:
|
||||
return (context_in, None)
|
||||
|
||||
def construct(self, queries, keys, values, attn_mask):
|
||||
B, L_Q, H, D = queries.shape
|
||||
_, L_K, _, _ = keys.shape
|
||||
|
||||
queries = ops.transpose(queries, (0, 2, 1, 3))
|
||||
keys = ops.transpose(keys, (0, 2, 1, 3))
|
||||
values = ops.transpose(values, (0, 2, 1, 3))
|
||||
|
||||
U_part = self.factor * int(np.ceil(np.log(L_K))) # c*ln(L_k)
|
||||
u = self.factor * int(np.ceil(np.log(L_Q))) # c*ln(L_q)
|
||||
|
||||
U_part = min(U_part, L_K)
|
||||
u = min(u, L_Q)
|
||||
|
||||
scores_top, index = self._prob_QK(queries, keys, sample_k=U_part, n_top=u)
|
||||
|
||||
scale = self.scale or 1. / sqrt(D)
|
||||
if scale is not None:
|
||||
scores_top = scores_top * scale
|
||||
|
||||
context = self._get_initial_context(values, L_Q)
|
||||
context, attn = self._update_context(context, values, scores_top, index, L_Q, attn_mask)
|
||||
|
||||
return ops.transpose(context, (0, 2, 1, 3)), attn
|
||||
|
||||
class AttentionLayer(nn.Cell):
|
||||
def __init__(self, attention, d_model, n_heads, d_keys=None, d_values=None, mix=False):
|
||||
super(AttentionLayer, self).__init__()
|
||||
|
||||
d_keys = d_keys or (d_model // n_heads)
|
||||
d_values = d_values or (d_model // n_heads)
|
||||
|
||||
self.inner_attention = attention
|
||||
self.query_projection = nn.Dense(d_model, d_keys * n_heads)
|
||||
self.key_projection = nn.Dense(d_model, d_keys * n_heads)
|
||||
self.value_projection = nn.Dense(d_model, d_values * n_heads)
|
||||
self.out_projection = nn.Dense(d_values * n_heads, d_model)
|
||||
self.n_heads = n_heads
|
||||
self.mix = mix
|
||||
|
||||
def construct(self, queries, keys, values, attn_mask):
|
||||
B, L, _ = queries.shape
|
||||
_, S, _ = keys.shape
|
||||
H = self.n_heads
|
||||
|
||||
queries = self.query_projection(queries).view(B, L, H, -1)
|
||||
keys = self.key_projection(keys).view(B, S, H, -1)
|
||||
values = self.value_projection(values).view(B, S, H, -1)
|
||||
|
||||
out, attn = self.inner_attention(
|
||||
queries,
|
||||
keys,
|
||||
values,
|
||||
attn_mask
|
||||
)
|
||||
if self.mix:
|
||||
out = ops.transpose(out, (0, 2, 1, 3)).contiguous()
|
||||
out = out.view(B, L, -1)
|
||||
|
||||
return self.out_projection(out), attn
|
||||
import mindspore as ms
|
||||
import mindspore.nn as nn
|
||||
import mindspore.ops as ops
|
||||
import numpy as np
|
||||
from math import sqrt
|
||||
from utils.masking import TriangularCausalMask, ProbMask
|
||||
|
||||
class FullAttention(nn.Cell):
|
||||
def __init__(self, mask_flag=True, factor=5, scale=None, attention_dropout=0.1, output_attention=False):
|
||||
super(FullAttention, self).__init__()
|
||||
self.scale = scale
|
||||
self.mask_flag = mask_flag
|
||||
self.output_attention = output_attention
|
||||
self.dropout = nn.Dropout(attention_dropout)
|
||||
|
||||
def construct(self, queries, keys, values, attn_mask):
|
||||
B, L, H, E = queries.shape
|
||||
_, S, _, D = values.shape
|
||||
scale = self.scale or 1. / sqrt(E)
|
||||
|
||||
scores = ops.einsum("blhe,bshe->bhls", queries, keys)
|
||||
if self.mask_flag:
|
||||
if attn_mask is None:
|
||||
attn_mask = TriangularCausalMask(B, L)
|
||||
|
||||
scores = ops.masked_fill(scores, attn_mask.mask, -np.inf)
|
||||
|
||||
A = self.dropout(ops.softmax(scale * scores, axis=-1))
|
||||
V = ops.einsum("bhls,bshd->blhd", A, values)
|
||||
|
||||
if self.output_attention:
|
||||
return (V, A)
|
||||
else:
|
||||
return (V, None)
|
||||
|
||||
class ProbAttention(nn.Cell):
|
||||
def __init__(self, mask_flag=True, factor=5, scale=None, attention_dropout=0.1, output_attention=False):
|
||||
super(ProbAttention, self).__init__()
|
||||
self.factor = factor
|
||||
self.scale = scale
|
||||
self.mask_flag = mask_flag
|
||||
self.output_attention = output_attention
|
||||
self.dropout = nn.Dropout(attention_dropout)
|
||||
|
||||
def _prob_QK(self, Q, K, sample_k, n_top):
|
||||
B, H, L_K, E = K.shape
|
||||
_, _, L_Q, _ = Q.shape
|
||||
|
||||
K_expand = K.expand_dims(-3).repeat(1, 1, L_Q, 1)
|
||||
index_sample = ms.Tensor(np.random.randint(0, L_K, (L_Q, sample_k)), ms.int32)
|
||||
K_sample = K_expand[:, :, ms.Tensor(np.arange(L_Q)).expand_dims(1), index_sample, :]
|
||||
Q_K_sample = ops.matmul(Q.expand_dims(-2), K_sample.transpose(0, 1, 3, 2)).squeeze(-2)
|
||||
|
||||
M = Q_K_sample.max(-1)[0] - ops.reduce_sum(Q_K_sample, -1) / L_K
|
||||
M_top = M.topk(n_top)[1]
|
||||
|
||||
Q_reduce = Q[ms.Tensor(np.arange(B))[:, None, None],
|
||||
ms.Tensor(np.arange(H))[None, :, None],
|
||||
M_top, :]
|
||||
Q_K = ops.matmul(Q_reduce, K.transpose(0, 1, 3, 2))
|
||||
|
||||
return Q_K, M_top
|
||||
|
||||
def _get_initial_context(self, V, L_Q):
|
||||
B, H, L_V, D = V.shape
|
||||
if not self.mask_flag:
|
||||
V_sum = ops.reduce_mean(V, axis=-2)
|
||||
context = V_sum.expand_dims(-2).repeat(1, 1, L_Q, 1)
|
||||
else:
|
||||
assert(L_Q == L_V)
|
||||
context = ops.cumsum(V, axis=-2)
|
||||
return context
|
||||
|
||||
def _update_context(self, context_in, V, scores, index, L_Q, attn_mask):
|
||||
B, H, L_V, D = V.shape
|
||||
|
||||
if self.mask_flag:
|
||||
attn_mask = ProbMask(B, H, L_Q, index, scores)
|
||||
scores = ops.masked_fill(scores, attn_mask.mask, -np.inf)
|
||||
|
||||
attn = ops.softmax(scores, axis=-1)
|
||||
|
||||
context_in[ms.Tensor(np.arange(B))[:, None, None],
|
||||
ms.Tensor(np.arange(H))[None, :, None],
|
||||
index, :] = ops.matmul(attn, V).astype(context_in.dtype)
|
||||
|
||||
if self.output_attention:
|
||||
attns = (ms.Tensor(np.ones([B, H, L_V, L_V]) / L_V, dtype=context_in.dtype))
|
||||
attns[ms.Tensor(np.arange(B))[:, None, None], ms.Tensor(np.arange(H))[None, :, None], index, :] = attn
|
||||
return (context_in, attns)
|
||||
else:
|
||||
return (context_in, None)
|
||||
|
||||
def construct(self, queries, keys, values, attn_mask):
|
||||
B, L_Q, H, D = queries.shape
|
||||
_, L_K, _, _ = keys.shape
|
||||
|
||||
queries = ops.transpose(queries, (0, 2, 1, 3))
|
||||
keys = ops.transpose(keys, (0, 2, 1, 3))
|
||||
values = ops.transpose(values, (0, 2, 1, 3))
|
||||
|
||||
U_part = self.factor * int(np.ceil(np.log(L_K))) # c*ln(L_k)
|
||||
u = self.factor * int(np.ceil(np.log(L_Q))) # c*ln(L_q)
|
||||
|
||||
U_part = min(U_part, L_K)
|
||||
u = min(u, L_Q)
|
||||
|
||||
scores_top, index = self._prob_QK(queries, keys, sample_k=U_part, n_top=u)
|
||||
|
||||
scale = self.scale or 1. / sqrt(D)
|
||||
if scale is not None:
|
||||
scores_top = scores_top * scale
|
||||
|
||||
context = self._get_initial_context(values, L_Q)
|
||||
context, attn = self._update_context(context, values, scores_top, index, L_Q, attn_mask)
|
||||
|
||||
return ops.transpose(context, (0, 2, 1, 3)), attn
|
||||
|
||||
class AttentionLayer(nn.Cell):
|
||||
def __init__(self, attention, d_model, n_heads, d_keys=None, d_values=None, mix=False):
|
||||
super(AttentionLayer, self).__init__()
|
||||
|
||||
d_keys = d_keys or (d_model // n_heads)
|
||||
d_values = d_values or (d_model // n_heads)
|
||||
|
||||
self.inner_attention = attention
|
||||
self.query_projection = nn.Dense(d_model, d_keys * n_heads)
|
||||
self.key_projection = nn.Dense(d_model, d_keys * n_heads)
|
||||
self.value_projection = nn.Dense(d_model, d_values * n_heads)
|
||||
self.out_projection = nn.Dense(d_values * n_heads, d_model)
|
||||
self.n_heads = n_heads
|
||||
self.mix = mix
|
||||
|
||||
def construct(self, queries, keys, values, attn_mask):
|
||||
B, L, _ = queries.shape
|
||||
_, S, _ = keys.shape
|
||||
H = self.n_heads
|
||||
|
||||
queries = self.query_projection(queries).view(B, L, H, -1)
|
||||
keys = self.key_projection(keys).view(B, S, H, -1)
|
||||
values = self.value_projection(values).view(B, S, H, -1)
|
||||
|
||||
out, attn = self.inner_attention(
|
||||
queries,
|
||||
keys,
|
||||
values,
|
||||
attn_mask
|
||||
)
|
||||
if self.mix:
|
||||
out = ops.transpose(out, (0, 2, 1, 3)).contiguous()
|
||||
out = out.view(B, L, -1)
|
||||
|
||||
return self.out_projection(out), attn
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
import mindspore as ms
|
||||
import mindspore.nn as nn
|
||||
import mindspore.ops as ops
|
||||
|
||||
class DecoderLayer(nn.Cell):
|
||||
def __init__(self, self_attention, cross_attention, d_model, d_ff=None,
|
||||
dropout=0.1, activation="relu"):
|
||||
super(DecoderLayer, self).__init__()
|
||||
d_ff = d_ff or 4 * d_model
|
||||
self.self_attention = self_attention
|
||||
self.cross_attention = cross_attention
|
||||
self.conv1 = nn.Conv1d(in_channels=d_model, out_channels=d_ff, kernel_size=1)
|
||||
self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_model, kernel_size=1)
|
||||
self.norm1 = nn.LayerNorm([d_model])
|
||||
self.norm2 = nn.LayerNorm([d_model])
|
||||
self.norm3 = nn.LayerNorm([d_model])
|
||||
self.dropout = nn.Dropout(dropout)
|
||||
self.activation = ops.relu if activation == "relu" else ops.relu # Change to GELU if needed
|
||||
|
||||
def construct(self, x, cross, x_mask=None, cross_mask=None):
|
||||
# Self-attention
|
||||
attn_out = self.self_attention(x, x, x, attn_mask=x_mask)[0]
|
||||
x = x + self.dropout(attn_out)
|
||||
x = self.norm1(x)
|
||||
|
||||
# Cross-attention
|
||||
attn_out = self.cross_attention(x, cross, cross, attn_mask=cross_mask)[0]
|
||||
x = x + self.dropout(attn_out)
|
||||
|
||||
# Feedforward
|
||||
y = self.norm2(x)
|
||||
y = self.dropout(self.activation(self.conv1(y.transpose(0, 2, 1))))
|
||||
y = self.dropout(self.conv2(y).transpose(0, 2, 1))
|
||||
|
||||
return self.norm3(x + y)
|
||||
|
||||
class Decoder(nn.Cell):
|
||||
def __init__(self, layers, norm_layer=None):
|
||||
super(Decoder, self).__init__()
|
||||
self.layers = nn.CellList(layers)
|
||||
self.norm = norm_layer
|
||||
|
||||
def construct(self, x, cross, x_mask=None, cross_mask=None):
|
||||
for layer in self.layers:
|
||||
x = layer(x, cross, x_mask=x_mask, cross_mask=cross_mask)
|
||||
|
||||
if self.norm is not None:
|
||||
x = self.norm(x)
|
||||
|
||||
return x
|
||||
|
|
@ -1,107 +0,0 @@
|
|||
import mindspore as ms
|
||||
import mindspore.nn as nn
|
||||
import mindspore.ops as ops
|
||||
import math
|
||||
|
||||
class PositionalEmbedding(nn.Cell):
|
||||
def __init__(self, d_model, max_len=5000):
|
||||
super(PositionalEmbedding, self).__init__()
|
||||
pe = ms.Tensor(np.zeros((max_len, d_model)), ms.float32)
|
||||
|
||||
position = ms.Tensor(np.arange(0, max_len)).astype(ms.float32).unsqueeze(1)
|
||||
div_term = (ms.Tensor(np.arange(0, d_model, 2)).astype(ms.float32) *
|
||||
-(math.log(10000.0) / d_model)).exp()
|
||||
|
||||
pe[:, 0::2] = ops.sin(position * div_term)
|
||||
pe[:, 1::2] = ops.cos(position * div_term)
|
||||
|
||||
self.register_buffer('pe', pe.unsqueeze(0))
|
||||
|
||||
def construct(self, x):
|
||||
return self.pe[:, :x.shape[1]]
|
||||
|
||||
class TokenEmbedding(nn.Cell):
|
||||
def __init__(self, c_in, d_model):
|
||||
super(TokenEmbedding, self).__init__()
|
||||
padding = 1 # MindSpore does not have padding_mode='circular'
|
||||
self.tokenConv = nn.Conv1d(in_channels=c_in, out_channels=d_model,
|
||||
kernel_size=3, pad_mode='pad', padding=padding)
|
||||
|
||||
# Weight initialization
|
||||
for m in self.modules():
|
||||
if isinstance(m, nn.Conv1d):
|
||||
nn.initializer.KaimingNormal(m.weight, mode='fan_in', nonlinearity='leaky_relu')
|
||||
|
||||
def construct(self, x):
|
||||
x = self.tokenConv(x.transpose(0, 2, 1)) # Change to (B, D, L)
|
||||
return x.transpose(0, 2, 1) # Change back to (B, L, D)
|
||||
|
||||
class FixedEmbedding(nn.Cell):
|
||||
def __init__(self, c_in, d_model):
|
||||
super(FixedEmbedding, self).__init__()
|
||||
|
||||
w = ms.Tensor(np.zeros((c_in, d_model)), ms.float32)
|
||||
|
||||
position = ms.Tensor(np.arange(0, c_in)).astype(ms.float32).unsqueeze(1)
|
||||
div_term = (ms.Tensor(np.arange(0, d_model, 2)).astype(ms.float32) *
|
||||
-(math.log(10000.0) / d_model)).exp()
|
||||
|
||||
w[:, 0::2] = ops.sin(position * div_term)
|
||||
w[:, 1::2] = ops.cos(position * div_term)
|
||||
|
||||
self.emb = nn.Embedding(c_in, d_model)
|
||||
self.emb.weight.set_data(w)
|
||||
|
||||
def construct(self, x):
|
||||
return self.emb(x).detach()
|
||||
|
||||
class TemporalEmbedding(nn.Cell):
|
||||
def __init__(self, d_model, embed_type='fixed', freq='h'):
|
||||
super(TemporalEmbedding, self).__init__()
|
||||
|
||||
minute_size = 4; hour_size = 24
|
||||
weekday_size = 7; day_size = 32; month_size = 13
|
||||
|
||||
Embed = FixedEmbedding if embed_type == 'fixed' else nn.Embedding
|
||||
if freq == 't':
|
||||
self.minute_embed = Embed(minute_size, d_model)
|
||||
self.hour_embed = Embed(hour_size, d_model)
|
||||
self.weekday_embed = Embed(weekday_size, d_model)
|
||||
self.day_embed = Embed(day_size, d_model)
|
||||
self.month_embed = Embed(month_size, d_model)
|
||||
|
||||
def construct(self, x):
|
||||
x = x.astype(ms.int32)
|
||||
|
||||
minute_x = self.minute_embed(x[:, :, 4]) if hasattr(self, 'minute_embed') else 0.
|
||||
hour_x = self.hour_embed(x[:, :, 3])
|
||||
weekday_x = self.weekday_embed(x[:, :, 2])
|
||||
day_x = self.day_embed(x[:, :, 1])
|
||||
month_x = self.month_embed(x[:, :, 0])
|
||||
|
||||
return hour_x + weekday_x + day_x + month_x + minute_x
|
||||
|
||||
class TimeFeatureEmbedding(nn.Cell):
|
||||
def __init__(self, d_model, embed_type='timeF', freq='h'):
|
||||
super(TimeFeatureEmbedding, self).__init__()
|
||||
|
||||
freq_map = {'h': 4, 't': 5, 's': 6, 'm': 1, 'a': 1, 'w': 2, 'd': 3, 'b': 3}
|
||||
d_inp = freq_map[freq]
|
||||
self.embed = nn.Dense(d_inp, d_model)
|
||||
|
||||
def construct(self, x):
|
||||
return self.embed(x)
|
||||
|
||||
class DataEmbedding(nn.Cell):
|
||||
def __init__(self, c_in, d_model, embed_type='fixed', freq='h', dropout=0.1):
|
||||
super(DataEmbedding, self).__init__()
|
||||
|
||||
self.value_embedding = TokenEmbedding(c_in=c_in, d_model=d_model)
|
||||
self.position_embedding = PositionalEmbedding(d_model=d_model)
|
||||
self.temporal_embedding = TemporalEmbedding(d_model=d_model, embed_type=embed_type, freq=freq) if embed_type != 'timeF' else TimeFeatureEmbedding(d_model=d_model, embed_type=embed_type, freq=freq)
|
||||
|
||||
self.dropout = nn.Dropout(1 - dropout)
|
||||
|
||||
def construct(self, x, x_mark):
|
||||
x = self.value_embedding(x) + self.position_embedding(x) + self.temporal_embedding(x_mark)
|
||||
return self.dropout(x)
|
||||
|
|
@ -1,86 +0,0 @@
|
|||
import mindspore as ms
|
||||
import mindspore.nn as nn
|
||||
import mindspore.ops as ops
|
||||
|
||||
class ConvLayer(nn.Cell):
|
||||
def __init__(self, c_in):
|
||||
super(ConvLayer, self).__init__()
|
||||
self.downConv = nn.Conv1d(in_channels=c_in,
|
||||
out_channels=c_in,
|
||||
kernel_size=3,
|
||||
pad_mode='pad', padding=1) # MindSpore不支持padding_mode='circular'
|
||||
self.norm = nn.BatchNorm1d(c_in)
|
||||
self.activation = nn.ELU()
|
||||
self.maxPool = nn.MaxPool1d(kernel_size=3, stride=2, padding=1)
|
||||
|
||||
def construct(self, x):
|
||||
x = self.downConv(x.transpose(0, 2, 1)) # Change to (B, D, L)
|
||||
x = self.norm(x)
|
||||
x = self.activation(x)
|
||||
x = self.maxPool(x)
|
||||
return x.transpose(1, 2, 0) # Change back to (B, L, D)
|
||||
|
||||
class EncoderLayer(nn.Cell):
|
||||
def __init__(self, attention, d_model, d_ff=None, dropout=0.1, activation="relu"):
|
||||
super(EncoderLayer, self).__init__()
|
||||
d_ff = d_ff or 4 * d_model
|
||||
self.attention = attention
|
||||
self.conv1 = nn.Conv1d(in_channels=d_model, out_channels=d_ff, kernel_size=1)
|
||||
self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_model, kernel_size=1)
|
||||
self.norm1 = nn.LayerNorm([d_model])
|
||||
self.norm2 = nn.LayerNorm([d_model])
|
||||
self.dropout = nn.Dropout(1 - dropout)
|
||||
self.activation = ops.relu if activation == "relu" else ops.ReLU() # Change to GELU if needed
|
||||
|
||||
def construct(self, x, attn_mask=None):
|
||||
new_x, attn = self.attention(x, x, x, attn_mask=attn_mask)
|
||||
x = x + self.dropout(new_x)
|
||||
|
||||
y = self.norm1(x)
|
||||
y = self.dropout(self.activation(self.conv1(y.transpose(0, 2, 1)))) # Change to (B, D, L)
|
||||
y = self.dropout(self.conv2(y).transpose(0, 2, 1)) # Change back to (B, L, D)
|
||||
|
||||
return self.norm2(x + y), attn
|
||||
|
||||
class Encoder(nn.Cell):
|
||||
def __init__(self, attn_layers, conv_layers=None, norm_layer=None):
|
||||
super(Encoder, self).__init__()
|
||||
self.attn_layers = nn.CellList(attn_layers)
|
||||
self.conv_layers = nn.CellList(conv_layers) if conv_layers is not None else None
|
||||
self.norm = norm_layer
|
||||
|
||||
def construct(self, x, attn_mask=None):
|
||||
attns = []
|
||||
if self.conv_layers is not None:
|
||||
for attn_layer, conv_layer in zip(self.attn_layers, self.conv_layers):
|
||||
x, attn = attn_layer(x, attn_mask=attn_mask)
|
||||
x = conv_layer(x)
|
||||
attns.append(attn)
|
||||
x, attn = self.attn_layers[-1](x, attn_mask=attn_mask)
|
||||
attns.append(attn)
|
||||
else:
|
||||
for attn_layer in self.attn_layers:
|
||||
x, attn = attn_layer(x, attn_mask=attn_mask)
|
||||
attns.append(attn)
|
||||
|
||||
if self.norm is not None:
|
||||
x = self.norm(x)
|
||||
|
||||
return x, attns
|
||||
|
||||
class EncoderStack(nn.Cell):
|
||||
def __init__(self, encoders, inp_lens):
|
||||
super(EncoderStack, self).__init__()
|
||||
self.encoders = nn.CellList(encoders)
|
||||
self.inp_lens = inp_lens
|
||||
|
||||
def construct(self, x, attn_mask=None):
|
||||
x_stack = []
|
||||
attns = []
|
||||
for i_len, encoder in zip(self.inp_lens, self.encoders):
|
||||
inp_len = x.shape[1] // (2 ** i_len)
|
||||
x_s, attn = encoder(x[:, -inp_len:, :])
|
||||
x_stack.append(x_s)
|
||||
attns.append(attn)
|
||||
|
||||
return ops.Concat(axis=1)(x_stack), attns # 合并沿着第二个维度
|
||||
|
|
@ -1,149 +0,0 @@
|
|||
import mindspore as ms
|
||||
import mindspore.nn as nn
|
||||
import mindspore.ops as ops
|
||||
|
||||
from models.encoder import Encoder, EncoderLayer, ConvLayer, EncoderStack
|
||||
from models.decoder import Decoder, DecoderLayer
|
||||
from models.attn import FullAttention, ProbAttention, AttentionLayer
|
||||
from models.embed import DataEmbedding
|
||||
|
||||
class Informer(nn.Cell):
|
||||
def __init__(self, enc_in, dec_in, c_out, seq_len, label_len, out_len,
|
||||
factor=5, d_model=512, n_heads=8, e_layers=3, d_layers=2, d_ff=512,
|
||||
dropout=0.0, attn='prob', embed='fixed', freq='h', activation='gelu',
|
||||
output_attention=False, distil=True, mix=True):
|
||||
super(Informer, self).__init__()
|
||||
self.pred_len = out_len
|
||||
self.attn = attn
|
||||
self.output_attention = output_attention
|
||||
|
||||
# Encoding
|
||||
self.enc_embedding = DataEmbedding(enc_in, d_model, embed, freq, dropout)
|
||||
self.dec_embedding = DataEmbedding(dec_in, d_model, embed, freq, dropout)
|
||||
|
||||
# Attention
|
||||
Attn = ProbAttention if attn == 'prob' else FullAttention
|
||||
|
||||
# Encoder
|
||||
self.encoder = Encoder(
|
||||
[
|
||||
EncoderLayer(
|
||||
AttentionLayer(Attn(False, factor, attention_dropout=dropout, output_attention=output_attention),
|
||||
d_model, n_heads, mix=False),
|
||||
d_model,
|
||||
d_ff,
|
||||
dropout=dropout,
|
||||
activation=activation
|
||||
) for _ in range(e_layers)
|
||||
],
|
||||
[
|
||||
ConvLayer(d_model) for _ in range(e_layers - 1)
|
||||
] if distil else None,
|
||||
norm_layer=nn.LayerNorm(d_model)
|
||||
)
|
||||
|
||||
# Decoder
|
||||
self.decoder = Decoder(
|
||||
[
|
||||
DecoderLayer(
|
||||
AttentionLayer(Attn(True, factor, attention_dropout=dropout, output_attention=False),
|
||||
d_model, n_heads, mix=mix),
|
||||
AttentionLayer(FullAttention(False, factor, attention_dropout=dropout, output_attention=False),
|
||||
d_model, n_heads, mix=False),
|
||||
d_model,
|
||||
d_ff,
|
||||
dropout=dropout,
|
||||
activation=activation,
|
||||
) for _ in range(d_layers)
|
||||
],
|
||||
norm_layer=nn.LayerNorm(d_model)
|
||||
)
|
||||
|
||||
self.projection = nn.Dense(d_model, c_out, has_bias=True)
|
||||
|
||||
def construct(self, x_enc, x_mark_enc, x_dec, x_mark_dec,
|
||||
enc_self_mask=None, dec_self_mask=None, dec_enc_mask=None):
|
||||
enc_out = self.enc_embedding(x_enc, x_mark_enc)
|
||||
enc_out, attns = self.encoder(enc_out, attn_mask=enc_self_mask)
|
||||
|
||||
dec_out = self.dec_embedding(x_dec, x_mark_dec)
|
||||
dec_out, _ = self.decoder(dec_out, enc_out, x_mask=dec_self_mask, cross_mask=dec_enc_mask)
|
||||
dec_out = self.projection(dec_out)
|
||||
|
||||
if self.output_attention:
|
||||
return dec_out[:, -self.pred_len:, :], attns
|
||||
else:
|
||||
return dec_out[:, -self.pred_len:, :] # [B, L, D]
|
||||
|
||||
class InformerStack(nn.Cell):
|
||||
def __init__(self, enc_in, dec_in, c_out, seq_len, label_len, out_len,
|
||||
factor=5, d_model=512, n_heads=8, e_layers=[3, 2, 1], d_layers=2, d_ff=512,
|
||||
dropout=0.0, attn='prob', embed='fixed', freq='h', activation='gelu',
|
||||
output_attention=False, distil=True, mix=True):
|
||||
super(InformerStack, self).__init__()
|
||||
self.pred_len = out_len
|
||||
self.attn = attn
|
||||
self.output_attention = output_attention
|
||||
|
||||
# Encoding
|
||||
self.enc_embedding = DataEmbedding(enc_in, d_model, embed, freq, dropout)
|
||||
self.dec_embedding = DataEmbedding(dec_in, d_model, embed, freq, dropout)
|
||||
|
||||
# Attention
|
||||
Attn = ProbAttention if attn == 'prob' else FullAttention
|
||||
|
||||
# Encoder
|
||||
inp_lens = list(range(len(e_layers))) # [0, 1, 2,...]
|
||||
encoders = [
|
||||
Encoder(
|
||||
[
|
||||
EncoderLayer(
|
||||
AttentionLayer(Attn(False, factor, attention_dropout=dropout, output_attention=output_attention),
|
||||
d_model, n_heads, mix=False),
|
||||
d_model,
|
||||
d_ff,
|
||||
dropout=dropout,
|
||||
activation=activation
|
||||
) for _ in range(el)
|
||||
],
|
||||
[
|
||||
ConvLayer(d_model) for _ in range(el - 1)
|
||||
] if distil else None,
|
||||
norm_layer=nn.LayerNorm(d_model)
|
||||
) for el in e_layers
|
||||
]
|
||||
|
||||
self.encoder = EncoderStack(encoders, inp_lens)
|
||||
|
||||
# Decoder
|
||||
self.decoder = Decoder(
|
||||
[
|
||||
DecoderLayer(
|
||||
AttentionLayer(Attn(True, factor, attention_dropout=dropout, output_attention=False),
|
||||
d_model, n_heads, mix=mix),
|
||||
AttentionLayer(FullAttention(False, factor, attention_dropout=dropout, output_attention=False),
|
||||
d_model, n_heads, mix=False),
|
||||
d_model,
|
||||
d_ff,
|
||||
dropout=dropout,
|
||||
activation=activation,
|
||||
) for _ in range(d_layers)
|
||||
],
|
||||
norm_layer=nn.LayerNorm(d_model)
|
||||
)
|
||||
|
||||
self.projection = nn.Dense(d_model, c_out, has_bias=True)
|
||||
|
||||
def construct(self, x_enc, x_mark_enc, x_dec, x_mark_dec,
|
||||
enc_self_mask=None, dec_self_mask=None, dec_enc_mask=None):
|
||||
enc_out = self.enc_embedding(x_enc, x_mark_enc)
|
||||
enc_out, attns = self.encoder(enc_out, attn_mask=enc_self_mask)
|
||||
|
||||
dec_out = self.dec_embedding(x_dec, x_mark_dec)
|
||||
dec_out, _ = self.decoder(dec_out, enc_out, x_mask=dec_self_mask, cross_mask=dec_enc_mask)
|
||||
dec_out = self.projection(dec_out)
|
||||
|
||||
if self.output_attention:
|
||||
return dec_out[:, -self.pred_len:, :], attns
|
||||
else:
|
||||
return dec_out[:, -self.pred_len:, :] # [B, L, D]
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
matplotlib == 3.1.1
|
||||
numpy == 1.19.4
|
||||
pandas == 0.25.1
|
||||
scikit_learn == 0.21.3
|
||||
torch == 1.8.0
|
||||
505
predict/run.py
|
|
@ -1,23 +0,0 @@
|
|||
### M
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh1 --features M --seq_len 48 --label_len 48 --pred_len 24 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5 --factor 3
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh1 --features M --seq_len 96 --label_len 48 --pred_len 48 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh1 --features M --seq_len 168 --label_len 168 --pred_len 168 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh1 --features M --seq_len 168 --label_len 168 --pred_len 336 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh1 --features M --seq_len 336 --label_len 336 --pred_len 720 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
### S
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh1 --features S --seq_len 720 --label_len 168 --pred_len 24 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh1 --features S --seq_len 720 --label_len 168 --pred_len 48 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh1 --features S --seq_len 720 --label_len 336 --pred_len 168 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh1 --features S --seq_len 720 --label_len 336 --pred_len 336 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh1 --features S --seq_len 720 --label_len 336 --pred_len 720 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
### M
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh2 --features M --seq_len 48 --label_len 48 --pred_len 24 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh2 --features M --seq_len 96 --label_len 96 --pred_len 48 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh2 --features M --seq_len 336 --label_len 336 --pred_len 168 --e_layers 3 --d_layers 2 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh2 --features M --seq_len 336 --label_len 168 --pred_len 336 --e_layers 3 --d_layers 2 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh2 --features M --seq_len 720 --label_len 336 --pred_len 720 --e_layers 3 --d_layers 2 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
### S
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh2 --features S --seq_len 48 --label_len 48 --pred_len 24 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5 --factor 3
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh2 --features S --seq_len 96 --label_len 96 --pred_len 48 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh2 --features S --seq_len 336 --label_len 336 --pred_len 168 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh2 --features S --seq_len 336 --label_len 168 --pred_len 336 --e_layers 3 --d_layers 2 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTh2 --features S --seq_len 336 --label_len 336 --pred_len 720 --e_layers 3 --d_layers 2 --attn prob --des 'Exp' --itr 5
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
### M
|
||||
|
||||
python -u main_informer.py --model informer --data ETTm1 --features M --seq_len 672 --label_len 96 --pred_len 24 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTm1 --features M --seq_len 96 --label_len 48 --pred_len 48 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTm1 --features M --seq_len 384 --label_len 384 --pred_len 96 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTm1 --features M --seq_len 672 --label_len 288 --pred_len 288 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTm1 --features M --seq_len 672 --label_len 384 --pred_len 672 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
### S
|
||||
|
||||
python -u main_informer.py --model informer --data ETTm1 --features S --seq_len 96 --label_len 48 --pred_len 24 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTm1 --features S --seq_len 96 --label_len 48 --pred_len 48 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTm1 --features S --seq_len 384 --label_len 384 --pred_len 96 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTm1 --features S --seq_len 384 --label_len 384 --pred_len 288 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
||||
python -u main_informer.py --model informer --data ETTm1 --features S --seq_len 384 --label_len 384 --pred_len 672 --e_layers 2 --d_layers 1 --attn prob --des 'Exp' --itr 5
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
### M
|
||||
python -u main_informer.py --model informer --data WTH --features M --attn prob --d_layers 2 --e_layers 3 --itr 3 --label_len 168 --pred_len 24 --seq_len 168 --des 'Exp'
|
||||
|
||||
python -u main_informer.py --model informer --data WTH --features M --attn prob --d_layers 1 --e_layers 2 --itr 3 --label_len 96 --pred_len 48 --seq_len 96 --des 'Exp'
|
||||
|
||||
python -u main_informer.py --model informer --data WTH --features M --attn prob --d_layers 2 --e_layers 3 --itr 3 --label_len 168 --pred_len 168 --seq_len 336 --des 'Exp'
|
||||
|
||||
python -u main_informer.py --model informer --data WTH --features M --attn prob --d_layers 2 --e_layers 3 --itr 3 --label_len 168 --pred_len 336 --seq_len 720 --des 'Exp'
|
||||
|
||||
python -u main_informer.py --model informer --data WTH --features M --attn prob --d_layers 2 --e_layers 3 --itr 3 --label_len 336 --pred_len 720 --seq_len 720 --des 'Exp'
|
||||
|
||||
### S
|
||||
python -u main_informer.py --model informer --data WTH --features S --attn prob --d_layers 1 --e_layers 2 --itr 3 --label_len 168 --pred_len 24 --seq_len 720 --des 'Exp'
|
||||
|
||||
python -u main_informer.py --model informer --data WTH --features S --attn prob --d_layers 1 --e_layers 2 --itr 3 --label_len 168 --pred_len 48 --seq_len 720 --des 'Exp'
|
||||
|
||||
python -u main_informer.py --model informer --data WTH --features S --attn prob --d_layers 2 --e_layers 3 --itr 3 --label_len 168 --pred_len 168 --seq_len 168 --des 'Exp'
|
||||
|
||||
python -u main_informer.py --model informer --data WTH --features S --attn prob --d_layers 2 --e_layers 3 --itr 3 --label_len 336 --pred_len 336 --seq_len 336 --des 'Exp'
|
||||
|
||||
python -u main_informer.py --model informer --data WTH --features S --attn prob --d_layers 2 --e_layers 3 --itr 3 --label_len 336 --pred_len 720 --seq_len 720 --des 'Exp'
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
import mindspore as ms
|
||||
import mindspore.ops as ops
|
||||
|
||||
class TriangularCausalMask:
|
||||
def __init__(self, B, L, device="cpu"):
|
||||
mask_shape = (B, 1, L, L)
|
||||
self._mask = ms.Tensor(ops.triu(ops.ones(mask_shape, ms.bool_), diagonal=1), ms.bool_).to(device)
|
||||
|
||||
@property
|
||||
def mask(self):
|
||||
return self._mask
|
||||
|
||||
class ProbMask:
|
||||
def __init__(self, B, H, L, index, scores, device="cpu"):
|
||||
_mask = ops.triu(ops.ones((L, scores.shape[-1]), ms.bool_), diagonal=1).to(device)
|
||||
_mask_ex = _mask[None, None, :].expand((B, H, L, scores.shape[-1]))
|
||||
|
||||
# Using advanced indexing to create the mask
|
||||
indicator = _mask_ex[ms.Tensor(np.arange(B)[:, None, None]),
|
||||
ms.Tensor(np.arange(H)[None, :, None]),
|
||||
index, :].to(device)
|
||||
|
||||
self._mask = indicator.view(scores.shape).to(device)
|
||||
|
||||
@property
|
||||
def mask(self):
|
||||
return self._mask
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
import numpy as np
|
||||
|
||||
def RSE(pred, true):
|
||||
return np.sqrt(np.sum((true-pred)**2)) / np.sqrt(np.sum((true-true.mean())**2))
|
||||
|
||||
def CORR(pred, true):
|
||||
u = ((true-true.mean(0))*(pred-pred.mean(0))).sum(0)
|
||||
d = np.sqrt(((true-true.mean(0))**2*(pred-pred.mean(0))**2).sum(0))
|
||||
return (u/d).mean(-1)
|
||||
|
||||
def MAE(pred, true):
|
||||
return np.mean(np.abs(pred-true))
|
||||
|
||||
def MSE(pred, true):
|
||||
return np.mean((pred-true)**2)
|
||||
|
||||
def RMSE(pred, true):
|
||||
return np.sqrt(MSE(pred, true))
|
||||
|
||||
def MAPE(pred, true):
|
||||
return np.mean(np.abs((pred - true) / true))
|
||||
|
||||
def MSPE(pred, true):
|
||||
return np.mean(np.square((pred - true) / true))
|
||||
|
||||
def metric(pred, true):
|
||||
mae = MAE(pred, true)
|
||||
mse = MSE(pred, true)
|
||||
rmse = RMSE(pred, true)
|
||||
mape = MAPE(pred, true)
|
||||
mspe = MSPE(pred, true)
|
||||
|
||||
return mae,mse,rmse,mape,mspe
|
||||
|
|
@ -1,133 +0,0 @@
|
|||
import numpy as np
|
||||
import pandas as pd
|
||||
from pandas.tseries import offsets
|
||||
from pandas.tseries.frequencies import to_offset
|
||||
import mindspore as ms
|
||||
|
||||
class TimeFeature:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def __call__(self, index: pd.DatetimeIndex) -> ms.Tensor:
|
||||
pass
|
||||
|
||||
def __repr__(self):
|
||||
return self.__class__.__name__ + "()"
|
||||
|
||||
class SecondOfMinute(TimeFeature):
|
||||
"""Second of minute encoded as value between [-0.5, 0.5]"""
|
||||
def __call__(self, index: pd.DatetimeIndex) -> ms.Tensor:
|
||||
return ms.Tensor(index.second / 59.0 - 0.5)
|
||||
|
||||
class MinuteOfHour(TimeFeature):
|
||||
"""Minute of hour encoded as value between [-0.5, 0.5]"""
|
||||
def __call__(self, index: pd.DatetimeIndex) -> ms.Tensor:
|
||||
return ms.Tensor(index.minute / 59.0 - 0.5)
|
||||
|
||||
class HourOfDay(TimeFeature):
|
||||
"""Hour of day encoded as value between [-0.5, 0.5]"""
|
||||
def __call__(self, index: pd.DatetimeIndex) -> ms.Tensor:
|
||||
return ms.Tensor(index.hour / 23.0 - 0.5)
|
||||
|
||||
class DayOfWeek(TimeFeature):
|
||||
"""Day of week encoded as value between [-0.5, 0.5]"""
|
||||
def __call__(self, index: pd.DatetimeIndex) -> ms.Tensor:
|
||||
return ms.Tensor(index.dayofweek / 6.0 - 0.5)
|
||||
|
||||
class DayOfMonth(TimeFeature):
|
||||
"""Day of month encoded as value between [-0.5, 0.5]"""
|
||||
def __call__(self, index: pd.DatetimeIndex) -> ms.Tensor:
|
||||
return ms.Tensor((index.day - 1) / 30.0 - 0.5)
|
||||
|
||||
class DayOfYear(TimeFeature):
|
||||
"""Day of year encoded as value between [-0.5, 0.5]"""
|
||||
def __call__(self, index: pd.DatetimeIndex) -> ms.Tensor:
|
||||
return ms.Tensor((index.dayofyear - 1) / 365.0 - 0.5)
|
||||
|
||||
class MonthOfYear(TimeFeature):
|
||||
"""Month of year encoded as value between [-0.5, 0.5]"""
|
||||
def __call__(self, index: pd.DatetimeIndex) -> ms.Tensor:
|
||||
return ms.Tensor((index.month - 1) / 11.0 - 0.5)
|
||||
|
||||
class WeekOfYear(TimeFeature):
|
||||
"""Week of year encoded as value between [-0.5, 0.5]"""
|
||||
def __call__(self, index: pd.DatetimeIndex) -> ms.Tensor:
|
||||
return ms.Tensor((index.isocalendar().week - 1) / 52.0 - 0.5)
|
||||
|
||||
def time_features_from_frequency_str(freq_str: str) -> List[TimeFeature]:
|
||||
"""
|
||||
Returns a list of time features that will be appropriate for the given frequency string.
|
||||
Parameters
|
||||
----------
|
||||
freq_str
|
||||
Frequency string of the form [multiple][granularity] such as "12H", "5min", "1D" etc.
|
||||
"""
|
||||
|
||||
features_by_offsets = {
|
||||
offsets.YearEnd: [],
|
||||
offsets.QuarterEnd: [MonthOfYear],
|
||||
offsets.MonthEnd: [MonthOfYear],
|
||||
offsets.Week: [DayOfMonth, WeekOfYear],
|
||||
offsets.Day: [DayOfWeek, DayOfMonth, DayOfYear],
|
||||
offsets.BusinessDay: [DayOfWeek, DayOfMonth, DayOfYear],
|
||||
offsets.Hour: [HourOfDay, DayOfWeek, DayOfMonth, DayOfYear],
|
||||
offsets.Minute: [
|
||||
MinuteOfHour,
|
||||
HourOfDay,
|
||||
DayOfWeek,
|
||||
DayOfMonth,
|
||||
DayOfYear,
|
||||
],
|
||||
offsets.Second: [
|
||||
SecondOfMinute,
|
||||
MinuteOfHour,
|
||||
HourOfDay,
|
||||
DayOfWeek,
|
||||
DayOfMonth,
|
||||
DayOfYear,
|
||||
],
|
||||
}
|
||||
|
||||
offset = to_offset(freq_str)
|
||||
|
||||
for offset_type, feature_classes in features_by_offsets.items():
|
||||
if isinstance(offset, offset_type):
|
||||
return [cls() for cls in feature_classes]
|
||||
|
||||
supported_freq_msg = f"""
|
||||
Unsupported frequency {freq_str}
|
||||
The following frequencies are supported:
|
||||
Y - yearly
|
||||
alias: A
|
||||
M - monthly
|
||||
W - weekly
|
||||
D - daily
|
||||
B - business days
|
||||
H - hourly
|
||||
T - minutely
|
||||
alias: min
|
||||
S - secondly
|
||||
"""
|
||||
raise RuntimeError(supported_freq_msg)
|
||||
|
||||
def time_features(dates, timeenc=1, freq='h'):
|
||||
"""
|
||||
Extracts time features from a DataFrame based on the given frequency and encoding type.
|
||||
"""
|
||||
if timeenc == 0:
|
||||
dates['month'] = dates.date.apply(lambda row: row.month, 1)
|
||||
dates['day'] = dates.date.apply(lambda row: row.day, 1)
|
||||
dates['weekday'] = dates.date.apply(lambda row: row.weekday(), 1)
|
||||
dates['hour'] = dates.date.apply(lambda row: row.hour, 1)
|
||||
dates['minute'] = dates.date.apply(lambda row: row.minute, 1)
|
||||
dates['minute'] = dates.minute.map(lambda x: x // 15)
|
||||
freq_map = {
|
||||
'y': [], 'm': ['month'], 'w': ['month'], 'd': ['month', 'day', 'weekday'],
|
||||
'b': ['month', 'day', 'weekday'], 'h': ['month', 'day', 'weekday', 'hour'],
|
||||
't': ['month', 'day', 'weekday', 'hour', 'minute'],
|
||||
}
|
||||
return dates[freq_map[freq.lower()]].values
|
||||
|
||||
if timeenc == 1:
|
||||
dates = pd.to_datetime(dates.date.values)
|
||||
return np.vstack([feat(dates) for feat in time_features_from_frequency_str(freq)]).transpose(1, 0)
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
import numpy as np
|
||||
import mindspore as ms
|
||||
from mindspore import save_checkpoint, Tensor
|
||||
|
||||
def adjust_learning_rate(optimizer, epoch, args):
|
||||
if args.lradj == 'type1':
|
||||
lr_adjust = {epoch: args.learning_rate * (0.5 ** ((epoch - 1) // 1))}
|
||||
elif args.lradj == 'type2':
|
||||
lr_adjust = {
|
||||
2: 5e-5, 4: 1e-5, 6: 5e-6, 8: 1e-6,
|
||||
10: 5e-7, 15: 1e-7, 20: 5e-8
|
||||
}
|
||||
|
||||
if epoch in lr_adjust.keys():
|
||||
lr = lr_adjust[epoch]
|
||||
for param_group in optimizer.parameters:
|
||||
param_group.learning_rate = lr
|
||||
print('Updating learning rate to {}'.format(lr))
|
||||
|
||||
class EarlyStopping:
|
||||
def __init__(self, patience=7, verbose=False, delta=0):
|
||||
self.patience = patience
|
||||
self.verbose = verbose
|
||||
self.counter = 0
|
||||
self.best_score = None
|
||||
self.early_stop = False
|
||||
self.val_loss_min = np.Inf
|
||||
self.delta = delta
|
||||
|
||||
def __call__(self, val_loss, model, path):
|
||||
score = -val_loss
|
||||
if self.best_score is None:
|
||||
self.best_score = score
|
||||
self.save_checkpoint(val_loss, model, path)
|
||||
elif score < self.best_score + self.delta:
|
||||
self.counter += 1
|
||||
print(f'EarlyStopping counter: {self.counter} out of {self.patience}')
|
||||
if self.counter >= self.patience:
|
||||
self.early_stop = True
|
||||
else:
|
||||
self.best_score = score
|
||||
self.save_checkpoint(val_loss, model, path)
|
||||
self.counter = 0
|
||||
|
||||
def save_checkpoint(self, val_loss, model, path):
|
||||
if self.verbose:
|
||||
print(f'Validation loss decreased ({self.val_loss_min:.6f} --> {val_loss:.6f}). Saving model ...')
|
||||
save_checkpoint(model, path + '/' + 'checkpoint.ckpt')
|
||||
self.val_loss_min = val_loss
|
||||
|
||||
class dotdict(dict):
|
||||
"""dot.notation access to dictionary attributes"""
|
||||
__getattr__ = dict.get
|
||||
__setattr__ = dict.__setitem__
|
||||
__delattr__ = dict.__delitem__
|
||||
|
||||
class StandardScaler:
|
||||
def __init__(self):
|
||||
self.mean = 0.
|
||||
self.std = 1.
|
||||
|
||||
def fit(self, data):
|
||||
self.mean = data.mean(0).asnumpy() # Convert to numpy
|
||||
self.std = data.std(0).asnumpy() # Convert to numpy
|
||||
|
||||
def transform(self, data):
|
||||
mean = Tensor(self.mean).astype(data.dtype).to(data.device) if isinstance(data, Tensor) else self.mean
|
||||
std = Tensor(self.std).astype(data.dtype).to(data.device) if isinstance(data, Tensor) else self.std
|
||||
return (data - mean) / std
|
||||
|
||||
def inverse_transform(self, data):
|
||||
mean = Tensor(self.mean).astype(data.dtype).to(data.device) if isinstance(data, Tensor) else self.mean
|
||||
std = Tensor(self.std).astype(data.dtype).to(data.device) if isinstance(data, Tensor) else self.std
|
||||
if data.shape[-1] != mean.shape[-1]:
|
||||
mean = mean[-1:]
|
||||
std = std[-1:]
|
||||
return (data * std) + mean
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
yfinance
|
||||
requests
|
||||
beautifulsoup4
|
||||
openai
|
||||
python-dotenv
|
||||
gradio
|
||||
APScheduler==3.10.4
|
||||
blinker==1.8.2
|
||||
click==8.1.7
|
||||
feedparser==6.0.11
|
||||
Flask==3.0.3
|
||||
Flask-Cors==4.0.1
|
||||
Flask-SQLAlchemy==3.1.1
|
||||
greenlet==3.0.3
|
||||
gunicorn==22.0.0
|
||||
itsdangerous==2.2.0
|
||||
Jinja2==3.1.4
|
||||
MarkupSafe==2.1.5
|
||||
packaging==23.2
|
||||
pytz==2024.1
|
||||
sgmllib3k==1.0.0
|
||||
SQLAlchemy==2.0.31
|
||||
typing_extensions==4.12.2
|
||||
tzlocal==5.2
|
||||
Werkzeug==3.0.3
|
||||
121
rss_updater.py
|
|
@ -1,121 +0,0 @@
|
|||
import feedparser
|
||||
from datetime import datetime
|
||||
import json
|
||||
import time
|
||||
from models import RSSFeed, RawData, db
|
||||
|
||||
# 从配置文件加载 RSS feed 列表
|
||||
def load_rss_feeds_from_config(config_path="config.json"):
|
||||
try:
|
||||
with open(config_path, "r") as f:
|
||||
config = json.load(f)
|
||||
return config["feeds"]
|
||||
except FileNotFoundError:
|
||||
print(f"配置文件 {config_path} 不存在,请创建配置文件。")
|
||||
return []
|
||||
|
||||
# 解析 RSS feed
|
||||
def parse_rss_feed(url, config_path="config.json"):
|
||||
"""解析 RSS feed 并根据配置文件获取拉取数量和更新频次。
|
||||
|
||||
Args:
|
||||
url (str): RSS feed URL
|
||||
config_path (str, optional): 配置文件路径。Defaults to "config.json".
|
||||
|
||||
Returns:
|
||||
list: 解析后的 RSS 条目列表
|
||||
"""
|
||||
print(f"Parsing RSS feed from: {url}")
|
||||
feed = feedparser.parse(url)
|
||||
entries = []
|
||||
|
||||
# 加载配置文件
|
||||
try:
|
||||
with open(config_path, "r") as f:
|
||||
config = json.load(f)
|
||||
except FileNotFoundError:
|
||||
print(f"配置文件 {config_path} 不存在,请创建配置文件。")
|
||||
return None
|
||||
|
||||
# 找到对应 URL 的配置信息
|
||||
feed_config = next((feed for feed in config["feeds"] if feed["url"] == url), None)
|
||||
|
||||
if feed_config:
|
||||
num_entries = feed_config.get("num_entries", "all")
|
||||
#update_frequency = feed_config.get("update_frequency", 3600) # 默认更新频率为 1 小时
|
||||
|
||||
if num_entries == "all":
|
||||
for entry in feed.entries:
|
||||
entries.append({
|
||||
'title': entry.title,
|
||||
'pub_date': entry.published,
|
||||
'link': entry.link
|
||||
})
|
||||
else:
|
||||
try:
|
||||
num_entries = int(num_entries)
|
||||
for i, entry in enumerate(feed.entries):
|
||||
if i < num_entries:
|
||||
entries.append({
|
||||
'title': entry.title,
|
||||
'pub_date': entry.published,
|
||||
'link': entry.link
|
||||
})
|
||||
else:
|
||||
break
|
||||
except ValueError:
|
||||
print(f"配置文件中 {url} 的拉取数量无效,请检查配置文件。")
|
||||
return None
|
||||
|
||||
# 休眠,等待下次更新
|
||||
#time.sleep(update_frequency)
|
||||
|
||||
else:
|
||||
print(f"配置文件中没有找到 {url} 的配置信息。")
|
||||
|
||||
print(f"Parsed {len(entries)} entries from: {url}")
|
||||
return entries
|
||||
|
||||
# 更新 RSS 订阅
|
||||
def update_rss_feeds():
|
||||
"""更新 RSS 订阅并保存到 RawData 和 RSSFeed 表中"""
|
||||
urls = load_rss_feeds_from_config()
|
||||
print(f"Updating RSS feeds for URLs: {urls}")
|
||||
has_new_data = False
|
||||
for feed_config in urls:
|
||||
url = feed_config["url"]
|
||||
print(f"Parsing RSS feed from: {url}")
|
||||
entries = parse_rss_feed(url)
|
||||
for entry in entries:
|
||||
# 检查 RSSFeed 表中是否已存在相同链接的记录
|
||||
existing_feed = RSSFeed.query.filter_by(link=entry['link']).first()
|
||||
if existing_feed:
|
||||
print(f"Skipping duplicate entry with link: {entry['link']}")
|
||||
continue
|
||||
|
||||
# 创建 RSSFeed 对象
|
||||
rss_feed = RSSFeed(
|
||||
url=url,
|
||||
title=entry['title'],
|
||||
pub_date=entry['pub_date'],
|
||||
link=entry['link']
|
||||
)
|
||||
|
||||
# 添加 RSSFeed 对象到数据库
|
||||
db.session.add(rss_feed)
|
||||
|
||||
# 创建 RawData 对象
|
||||
raw_data = RawData(
|
||||
url=url,
|
||||
title=entry['title'],
|
||||
pub_date=entry['pub_date'],
|
||||
link=entry['link']
|
||||
)
|
||||
|
||||
# 添加 RawData 对象到数据库
|
||||
db.session.add(raw_data)
|
||||
db.session.commit()
|
||||
print(f"Added entry to RawData and RSSFeed tables: {entry['title']}")
|
||||
has_new_data = True
|
||||
|
||||
return has_new_data
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
line-height: 1.6;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
|
||||
header {
|
||||
background-color: #333;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
main {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: 2rem;
|
||||
}
|
||||
|
||||
.filter-container {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
#dateFilter {
|
||||
padding: 0.5rem;
|
||||
border-radius: 3px;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
.summary-card {
|
||||
background-color: #fff;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 5px;
|
||||
padding: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.summary-card h2 {
|
||||
margin-top: 0;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.pub-date {
|
||||
color: #777;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.summary-card img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
margin: 1rem 0;
|
||||
}
|
||||
|
||||
.summary-content {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.read-more {
|
||||
display: inline-block;
|
||||
background-color: #333;
|
||||
color: #fff;
|
||||
padding: 0.5rem 1rem;
|
||||
text-decoration: none;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.pagination {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
.page-link {
|
||||
display: inline-block;
|
||||
padding: 0.5rem 1rem;
|
||||
background-color: #333;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
border-radius: 3px;
|
||||
margin: 0 0.5rem;
|
||||
}
|
||||
|
||||
footer {
|
||||
text-align: center;
|
||||
padding: 1rem;
|
||||
background-color: #333;
|
||||
color: #fff;
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
function filterByDate(date) {
|
||||
window.location.href = `/?date=${date}`;
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const dateFilter = urlParams.get('date');
|
||||
if (dateFilter) {
|
||||
document.getElementById('dateFilter').value = dateFilter;
|
||||
}
|
||||
});
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>简报系统</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
line-height: 1.6;
|
||||
margin: 0;
|
||||
padding: 20px;
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
.summary-card {
|
||||
background-color: #fff;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 5px;
|
||||
padding: 15px;
|
||||
margin-bottom: 20px;
|
||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.summary-card h2 {
|
||||
margin-top: 0;
|
||||
color: #333;
|
||||
}
|
||||
.summary-card img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
margin-top: 10px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>简报系统</h1>
|
||||
{% for summary in summary_list %}
|
||||
<div class="summary-card">
|
||||
<h2>{{ summary.summary_title }}</h2>
|
||||
<p>{{ summary.bj_pub_date }}</p>
|
||||
{% if summary.summary_image %}
|
||||
<img src="{{ summary.summary_image }}" alt="{{ summary.summary_title }}">
|
||||
{% endif %}
|
||||
<p>{{ summary.summary_content }}</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</body>
|
||||
</html>
|
||||
155
test.py
|
|
@ -1,23 +1,144 @@
|
|||
import yfinance as yf
|
||||
from datetime import datetime, timedelta
|
||||
import tushare as ts
|
||||
|
||||
# 使用你的Tushare API Token
|
||||
ts.set_token('')
|
||||
pro = ts.pro_api()
|
||||
def get_stock_data(ticker: str, years: int = 1) -> tuple:
|
||||
end_date = datetime.now().strftime('%Y%m%d')
|
||||
start_date = (datetime.now() - timedelta(days=years * 365)).strftime('%Y%m%d')
|
||||
import argparse
|
||||
import os
|
||||
import cv2
|
||||
import numpy as np
|
||||
import torch
|
||||
from torchvision import models
|
||||
from pytorch_grad_cam import (
|
||||
GradCAM, HiResCAM, ScoreCAM, GradCAMPlusPlus,
|
||||
AblationCAM, XGradCAM, EigenCAM, EigenGradCAM,
|
||||
LayerCAM, FullGrad, GradCAMElementWise
|
||||
)
|
||||
from pytorch_grad_cam import GuidedBackpropReLUModel
|
||||
from pytorch_grad_cam.utils.image import (
|
||||
show_cam_on_image, deprocess_image, preprocess_image
|
||||
)
|
||||
from pytorch_grad_cam.utils.model_targets import ClassifierOutputTarget
|
||||
|
||||
|
||||
df = pro.daily(ts_code='600000.SH', start_date='20100101', end_date='')
|
||||
|
||||
pe = pro.balancesheet(ts_code='600000.SH')
|
||||
def get_args():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('--device', type=str, default='cpu',
|
||||
help='Torch device to use')
|
||||
parser.add_argument(
|
||||
'--image-path',
|
||||
type=str,
|
||||
default='./examples/both.png',
|
||||
help='Input image path')
|
||||
parser.add_argument('--aug-smooth', action='store_true',
|
||||
help='Apply test time augmentation to smooth the CAM')
|
||||
parser.add_argument(
|
||||
'--eigen-smooth',
|
||||
action='store_true',
|
||||
help='Reduce noise by taking the first principle component'
|
||||
'of cam_weights*activations')
|
||||
parser.add_argument('--method', type=str, default='gradcam',
|
||||
choices=[
|
||||
'gradcam', 'hirescam', 'gradcam++',
|
||||
'scorecam', 'xgradcam', 'ablationcam',
|
||||
'eigencam', 'eigengradcam', 'layercam',
|
||||
'fullgrad', 'gradcamelementwise'
|
||||
],
|
||||
help='CAM method')
|
||||
|
||||
parser.add_argument('--output-dir', type=str, default='output',
|
||||
help='Output directory to save the images')
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.device:
|
||||
print(f'Using device "{args.device}" for acceleration')
|
||||
else:
|
||||
print('Using CPU for computation')
|
||||
|
||||
return args
|
||||
|
||||
|
||||
news_a = pro.news(src='600000.SH', start_date='2024-01-20 09:00:00', end_date='2024-10-8 10:10:00')
|
||||
if __name__ == '__main__':
|
||||
""" python cam.py -image-path <path_to_image>
|
||||
Example usage of loading an image and computing:
|
||||
1. CAM
|
||||
2. Guided Back Propagation
|
||||
3. Combining both
|
||||
"""
|
||||
|
||||
forecast = pro.forecast(start_date='20200101', end_date='20241010', ts_code='600570.SH')
|
||||
args = get_args()
|
||||
methods = {
|
||||
"gradcam": GradCAM,
|
||||
"hirescam": HiResCAM,
|
||||
"scorecam": ScoreCAM,
|
||||
"gradcam++": GradCAMPlusPlus,
|
||||
"ablationcam": AblationCAM,
|
||||
"xgradcam": XGradCAM,
|
||||
"eigencam": EigenCAM,
|
||||
"eigengradcam": EigenGradCAM,
|
||||
"layercam": LayerCAM,
|
||||
"fullgrad": FullGrad,
|
||||
"gradcamelementwise": GradCAMElementWise
|
||||
}
|
||||
|
||||
current_price = pro.daily(ts_code='600570.SH')
|
||||
print(current_price.iloc[0]['close'])
|
||||
model = models.resnet50(pretrained=True).to(torch.device(args.device)).eval()
|
||||
|
||||
# Choose the target layer you want to compute the visualization for.
|
||||
# Usually this will be the last convolutional layer in the model.
|
||||
# Some common choices can be:
|
||||
# Resnet18 and 50: model.layer4
|
||||
# VGG, densenet161: model.features[-1]
|
||||
# mnasnet1_0: model.layers[-1]
|
||||
# You can print the model to help chose the layer
|
||||
# You can pass a list with several target layers,
|
||||
# in that case the CAMs will be computed per layer and then aggregated.
|
||||
# You can also try selecting all layers of a certain type, with e.g:
|
||||
# from pytorch_grad_cam.utils.find_layers import find_layer_types_recursive
|
||||
# find_layer_types_recursive(model, [torch.nn.ReLU])
|
||||
|
||||
target_layers = [model.layer4]
|
||||
|
||||
rgb_img = cv2.imread(args.image_path, 1)[:, :, ::-1]
|
||||
rgb_img = np.float32(rgb_img) / 255
|
||||
input_tensor = preprocess_image(rgb_img,
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]).to(args.device)
|
||||
|
||||
# We have to specify the target we want to generate
|
||||
# the Class Activation Maps for.
|
||||
# If targets is None, the highest scoring category (for every member in the batch) will be used.
|
||||
# You can target specific categories by
|
||||
# targets = [ClassifierOutputTarget(281)]
|
||||
# targets = [ClassifierOutputTarget(281)]
|
||||
targets = None
|
||||
|
||||
# Using the with statement ensures the context is freed, and you can
|
||||
# recreate different CAM objects in a loop.
|
||||
cam_algorithm = methods[args.method]
|
||||
with cam_algorithm(model=model,
|
||||
target_layers=target_layers) as cam:
|
||||
|
||||
# AblationCAM and ScoreCAM have batched implementations.
|
||||
# You can override the internal batch size for faster computation.
|
||||
cam.batch_size = 32
|
||||
grayscale_cam = cam(input_tensor=input_tensor,
|
||||
targets=targets,
|
||||
aug_smooth=args.aug_smooth,
|
||||
eigen_smooth=args.eigen_smooth)
|
||||
|
||||
grayscale_cam = grayscale_cam[0, :]
|
||||
|
||||
cam_image = show_cam_on_image(rgb_img, grayscale_cam, use_rgb=True)
|
||||
cam_image = cv2.cvtColor(cam_image, cv2.COLOR_RGB2BGR)
|
||||
|
||||
gb_model = GuidedBackpropReLUModel(model=model, device=args.device)
|
||||
gb = gb_model(input_tensor, target_category=None)
|
||||
|
||||
cam_mask = cv2.merge([grayscale_cam, grayscale_cam, grayscale_cam])
|
||||
cam_gb = deprocess_image(cam_mask * gb)
|
||||
gb = deprocess_image(gb)
|
||||
|
||||
os.makedirs(args.output_dir, exist_ok=True)
|
||||
|
||||
cam_output_path = os.path.join(args.output_dir, f'{args.method}_cam.jpg')
|
||||
gb_output_path = os.path.join(args.output_dir, f'{args.method}_gb.jpg')
|
||||
cam_gb_output_path = os.path.join(args.output_dir, f'{args.method}_cam_gb.jpg')
|
||||
|
||||
cv2.imwrite(cam_output_path, cam_image)
|
||||
cv2.imwrite(gb_output_path, gb)
|
||||
cv2.imwrite(cam_gb_output_path, cam_gb)
|
||||
|
|
|
|||
399
utils.py
|
|
@ -1,399 +0,0 @@
|
|||
from dataclasses import dataclass, field
|
||||
from typing import List, Dict, Optional
|
||||
import pandas as pd
|
||||
import asyncio
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
from datetime import datetime, timedelta
|
||||
import tushare as ts
|
||||
import json
|
||||
|
||||
# 使用你的Tushare API Token
|
||||
ts.set_token('')
|
||||
pro = ts.pro_api()
|
||||
|
||||
# 加载配置文件
|
||||
class Config:
|
||||
with open('config.json', 'r') as f:
|
||||
config_data = json.load(f)
|
||||
LLM_API_KEY = '' # 替换为你的API Key
|
||||
LLM_URL = 'https://api.deepseek.com/chat/completions'
|
||||
LLM_MODEL = 'deepseek-chat'
|
||||
|
||||
@dataclass
|
||||
class TickerClass:
|
||||
name: str # 股票代码
|
||||
display_name: str = field(default="") # 股票名称
|
||||
hist_data: Optional[pd.DataFrame] = field(default=None) # 历史数据
|
||||
balance_sheet: Optional[pd.DataFrame] = field(default=None) # 资产负债表
|
||||
financials: Optional[pd.DataFrame] = field(default=None) # 财务数据
|
||||
news: Optional[Dict] = field(default=None) # 新闻数据
|
||||
analyst_ratings: str = field(default=None) # 分析师评级
|
||||
price: float = field(default=None) # 股票当前价格
|
||||
sentiment_analysis: str = field(default=None) # 情感分析
|
||||
industry_analysis: str = field(default=None) # 行业分析
|
||||
final_analysis: str = field(default=None) # 最终的分析
|
||||
|
||||
|
||||
|
||||
# 获取文章的内容,输入是文章的URL,输出是文章的文本
|
||||
def get_article_text(url: str) -> str:
|
||||
try:
|
||||
response = requests.get(url)
|
||||
soup = BeautifulSoup(response.content, 'html.parser')
|
||||
article_text = ' '.join([p.get_text() for p in soup.find_all('p')])
|
||||
return article_text
|
||||
except:
|
||||
return "Error retrieving article text."
|
||||
|
||||
# 获取股票数据
|
||||
def get_stock_data(ticker: str, days: int = 30) -> tuple:
|
||||
end_date = datetime.now().strftime('%Y%m%d')
|
||||
start_date = (datetime.now() - timedelta(days=days)).strftime('%Y%m%d')
|
||||
|
||||
# 获取日线行情数据
|
||||
hist_data = pro.daily(ts_code=ticker, start_date=start_date, end_date=end_date)
|
||||
|
||||
# 获取资产负债表
|
||||
balance_sheet = pro.balancesheet(ts_code=ticker)
|
||||
|
||||
# 获取利润表
|
||||
financials = pro.income(ts_code=ticker)
|
||||
|
||||
# Tushare 不提供类似 yfinance 的新闻接口,这里返回空字典
|
||||
news = {}
|
||||
|
||||
return hist_data, balance_sheet, financials, news
|
||||
|
||||
# 获取股票名称
|
||||
def get_stock_name(ticker: str) -> str:
|
||||
stock_info = pro.stock_basic(ts_code=ticker, fields='name')
|
||||
if not stock_info.empty:
|
||||
return stock_info.iloc[0]['name']
|
||||
return "Unknown"
|
||||
|
||||
|
||||
# 获取分析师预测数据
|
||||
def get_analyst_ratings(ticker: str) -> str:
|
||||
forecast = pro.forecast(ts_code=ticker)
|
||||
if forecast.empty:
|
||||
return "No earnings forecast available."
|
||||
|
||||
latest_forecast = forecast.iloc[0]
|
||||
forecast_summary = f"Latest earnings forecast for {ticker}:\n {str(latest_forecast.to_dict())}"
|
||||
|
||||
return forecast_summary
|
||||
|
||||
# 获取当前股票价格
|
||||
def get_current_price(ticker: str) -> float:
|
||||
df = pro.daily(ts_code=ticker)
|
||||
if df.empty:
|
||||
return None
|
||||
return df.iloc[0]['close']
|
||||
|
||||
import requests
|
||||
|
||||
# 分析情感数据,结合新闻、历史数据、财务数据等,并让大模型给出情绪分数
|
||||
async def get_sentiment_analysis(news_title: str, news_content: str, related_stocks: List[str]) -> Dict[str, Dict]:
|
||||
print(f"Analyzing sentiment for the news: {news_title}")
|
||||
|
||||
news_analysis_results = {}
|
||||
|
||||
for stock in related_stocks:
|
||||
|
||||
hist_data, balance_sheet, financials, _ = get_stock_data(stock)
|
||||
|
||||
# 构建要发送给大模型的 prompt
|
||||
messages = [
|
||||
{
|
||||
"role": "system",
|
||||
"content": (
|
||||
"你是一名专业的金融分析师,专注于金融新闻和财务数据的情感分析。"
|
||||
"你将根据新闻内容、股票历史数据、财务数据和资产负债表等信息,分析该新闻对相关股票的情绪影响,"
|
||||
"并给出情绪分数(0到1之间,1表示非常积极,0表示非常消极),以及投资建议(例如:买入、持有、卖出)。"
|
||||
"请详细考虑市场反应、公司财务健康状况和未来前景。"
|
||||
)
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": (
|
||||
f"以下是关于股票 {stock} 的分析请求。\n\n"
|
||||
f"新闻标题: {news_title}\n"
|
||||
f"新闻内容: {news_content}\n\n"
|
||||
f"股票历史数据 (过去一年): {hist_data.to_dict()}\n\n"
|
||||
f"财务数据: {financials.to_dict()}\n\n"
|
||||
f"资产负债表: {balance_sheet.to_dict()}\n\n"
|
||||
f"请基于以上信息给出以下分析:\n"
|
||||
f"1. 该新闻对股票 {stock} 的情绪分数(0-1,1 表示非常积极)\n"
|
||||
f"2. 对股票的投资建议(买入、持有或卖出),并详细说明原因。"
|
||||
)
|
||||
}
|
||||
]
|
||||
|
||||
headers = {
|
||||
"Authorization": f"Bearer {Config.LLM_API_KEY}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
# 请求大模型 API 进行分析
|
||||
response = requests.post(Config.LLM_URL, json={"model": Config.LLM_MODEL, "messages": messages}, headers=headers)
|
||||
|
||||
if response.status_code == 200:
|
||||
|
||||
sentiment_result = response.json()['choices'][0]['message']['content']
|
||||
|
||||
|
||||
sentiment_score = extract_sentiment_score(sentiment_result)
|
||||
investment_suggestion = extract_investment_suggestion(sentiment_result)
|
||||
|
||||
|
||||
news_analysis_results[stock] = {
|
||||
"情绪分数": sentiment_score,
|
||||
"投资建议": investment_suggestion,
|
||||
"依据": sentiment_result
|
||||
}
|
||||
else:
|
||||
news_analysis_results[stock] = {
|
||||
"情绪分数": "无法获取",
|
||||
"投资建议": "错误",
|
||||
"依据": "分析过程中出错"
|
||||
}
|
||||
|
||||
return news_analysis_results
|
||||
|
||||
# 提取情感分数的辅助函数
|
||||
def extract_sentiment_score(sentiment_text: str) -> float:
|
||||
import re
|
||||
match = re.search(r"情绪分数[::]\s*(\d*\.?\d+)", sentiment_text)
|
||||
if match:
|
||||
return float(match.group(1))
|
||||
return 0.5
|
||||
|
||||
# 提取投资建议的辅助函数
|
||||
def extract_investment_suggestion(sentiment_text: str) -> str:
|
||||
import re
|
||||
match = re.search(r"投资建议[::]\s*(买入|持有|卖出)", sentiment_text)
|
||||
if match:
|
||||
return match.group(1)
|
||||
return "持有"
|
||||
|
||||
|
||||
# 调用大模型进行行业分析
|
||||
async def get_industry_analysis(ticker: TickerClass) -> None:
|
||||
print(f"Industry analysis for {ticker.name}")
|
||||
stock_info = pro.stock_basic(ts_code=ticker.name, fields='industry')
|
||||
|
||||
if stock_info.empty:
|
||||
industry = "未知"
|
||||
else:
|
||||
industry = stock_info.iloc[0]['industry']
|
||||
|
||||
payload = {
|
||||
"model": Config.LLM_MODEL,
|
||||
"messages": [
|
||||
{"role": "system", "content": f"你是一个行业分析助手。请为 {ticker.name} 提供行业分析。"},
|
||||
{"role": "user", "content": f"行业: {industry}\n请分析该行业的趋势、增长前景、监管变化和竞争格局。"}
|
||||
]
|
||||
}
|
||||
|
||||
headers = {
|
||||
"Authorization": f"Bearer {Config.LLM_API_KEY}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
response = requests.post(Config.LLM_URL, json=payload, headers=headers)
|
||||
|
||||
if response.status_code == 200:
|
||||
ticker.industry_analysis = response.json()['choices'][0]['message']['content']
|
||||
else:
|
||||
ticker.industry_analysis = "行业分析出错"
|
||||
|
||||
|
||||
|
||||
# 调用大模型进行最终分析
|
||||
async def get_final_analysis(ticker: TickerClass) -> None:
|
||||
print(f"Final analysis for {ticker.name}")
|
||||
|
||||
# 在构建的prompt中,明确要求模型引用情绪分析、财务数据和历史数据,并提供详细的依据
|
||||
payload = {
|
||||
"model": Config.LLM_MODEL,
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": (
|
||||
f"你是一位专业的金融分析师,负责提供股票 {ticker.name} 的最终投资建议。"
|
||||
"请基于以下内容,给出详细的建议并明确引用数据:\n"
|
||||
f"1. 情绪分析: {ticker.sentiment_analysis}\n"
|
||||
f"2. 最新分析师评级: {ticker.analyst_ratings}\n"
|
||||
f"3. 行业分析: {ticker.industry_analysis}\n"
|
||||
"你需要综合公司财务健康状况、市场表现、行业前景和情绪分析,"
|
||||
"并明确说明你的建议是基于哪些具体数据、分析或情绪影响,"
|
||||
"最终给出是否建议买入、持有或卖出股票。"
|
||||
)
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": (
|
||||
f"股票: {ticker.name}\n\n"
|
||||
f"请基于以上内容提供详细的投资建议,并引用财务数据、市场趋势、竞争地位和潜在风险等作为依据。"
|
||||
)
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
headers = {
|
||||
"Authorization": f"Bearer {Config.LLM_API_KEY}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
|
||||
response = requests.post(Config.LLM_URL, json=payload, headers=headers)
|
||||
|
||||
if response.status_code == 200:
|
||||
ticker.final_analysis = response.json()['choices'][0]['message']['content']
|
||||
else:
|
||||
ticker.final_analysis = "生成最终分析出错"
|
||||
|
||||
|
||||
# 根据所有股票的分析,进行股票排名
|
||||
def rank_companies(ticker_info_list: List[TickerClass], industry: str) -> str:
|
||||
print(f"Ranking ...")
|
||||
|
||||
|
||||
analysis_text = "\n\n".join(
|
||||
f"股票: {ticker.name} - {ticker.display_name}\n"
|
||||
f"当前价格: {ticker.price}\n"
|
||||
f"新闻情绪分析: {ticker.sentiment_analysis}\n"
|
||||
f"最新分析师评级: {ticker.analyst_ratings}\n"
|
||||
f"行业分析: {ticker.industry_analysis}\n"
|
||||
f"最终投资建议: {ticker.final_analysis}"
|
||||
for ticker in ticker_info_list
|
||||
)
|
||||
|
||||
|
||||
payload = {
|
||||
"model": Config.LLM_MODEL,
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
"content": (
|
||||
"你是一位资深的金融分析师,负责为房地产行业中的公司按投资潜力进行排名。"
|
||||
"在这次分析中,市场新闻的情绪分析是至关重要的判断依据,"
|
||||
"请务必将新闻情绪分析的结果作为每个股票排名和投资建议的核心因素之一,"
|
||||
"并结合公司的财务状况、市场趋势和竞争地位进行综合分析。"
|
||||
"请确保分析结果按照以下格式输出,并且每次都严格遵循以下示例格式:\n"
|
||||
"### 投资吸引力排名\n"
|
||||
"1. **000560.SZ** - **股票名称**\n"
|
||||
" **理由**:\n"
|
||||
" **新闻情绪分析**: 新闻情绪的详细分析结果及对市场反应的预期。\n"
|
||||
" **财务健康状况**: 描述财务状况。\n"
|
||||
" **市场趋势**: 描述市场趋势。\n"
|
||||
" **竞争地位**: 描述竞争地位。\n"
|
||||
" **潜在风险**: 描述潜在风险。\n"
|
||||
" **建议**: 买入或卖出。\n"
|
||||
"2. **002016.SZ** - **股票名称**\n"
|
||||
" **理由**:\n"
|
||||
" **新闻情绪分析**: 新闻情绪的详细分析结果及对市场反应的预期。\n"
|
||||
" **财务健康状况**: 描述财务状况。\n"
|
||||
" **市场趋势**: 描述市场趋势。\n"
|
||||
" **竞争地位**: 描述竞争地位。\n"
|
||||
" **潜在风险**: 描述潜在风险。\n"
|
||||
" **建议**: 买入或卖出。\n"
|
||||
"3. **000736.SZ** - **股票名称**\n"
|
||||
" **理由**:\n"
|
||||
" **新闻情绪分析**: 新闻情绪的详细分析结果及对市场反应的预期。\n"
|
||||
" **财务健康状况**: 描述财务状况。\n"
|
||||
" **市场趋势**: 描述市场趋势。\n"
|
||||
" **竞争地位**: 描述竞争地位。\n"
|
||||
" **潜在风险**: 描述潜在风险。\n"
|
||||
" **建议**: 买入或卖出。\n"
|
||||
"# 总结\n"
|
||||
"最后进行总结,说明哪个股票最具投资吸引力,并解释新闻情绪分析对其的影响。"
|
||||
)
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": (
|
||||
f"行业: {industry}\n\n"
|
||||
f"公司分析:\n{analysis_text}\n\n"
|
||||
f"请根据提供的分析,将这些公司按投资吸引力进行排名,并提供详细的理由。"
|
||||
"请务必明确引用新闻情绪分析结果,结合财务健康状况和市场趋势等作为排名依据。"
|
||||
)
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
headers = {
|
||||
"Authorization": f"Bearer {Config.LLM_API_KEY}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
|
||||
response = requests.post(Config.LLM_URL, json=payload, headers=headers)
|
||||
|
||||
if response.status_code == 200:
|
||||
return response.json()['choices'][0]['message']['content']
|
||||
else:
|
||||
return "公司排名出错"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
async def get_openai_verdict_2(news_title: str, news_content: str, tickers: List[str], industry: str):
|
||||
ticker_info_list = []
|
||||
|
||||
|
||||
for ticker in tickers:
|
||||
stock_name = get_stock_name(ticker)
|
||||
temp_ticker_info = TickerClass(name=ticker, display_name=stock_name)
|
||||
temp_ticker_info.hist_data, temp_ticker_info.balance_sheet, temp_ticker_info.financials, temp_ticker_info.news = get_stock_data(ticker, days=30)
|
||||
temp_ticker_info.analyst_ratings = get_analyst_ratings(ticker)
|
||||
temp_ticker_info.price = get_current_price(ticker)
|
||||
ticker_info_list.append(temp_ticker_info)
|
||||
|
||||
|
||||
sentiment_results = await get_sentiment_analysis(news_title, news_content, tickers)
|
||||
|
||||
|
||||
for ticker_object in ticker_info_list:
|
||||
if ticker_object.name in sentiment_results:
|
||||
ticker_object.sentiment_analysis = sentiment_results[ticker_object.name]["依据"]
|
||||
|
||||
# 异步调用行业分析
|
||||
tasks2 = [get_industry_analysis(ticker_object) for ticker_object in ticker_info_list]
|
||||
await asyncio.gather(*tasks2)
|
||||
|
||||
# 异步调用最终分析
|
||||
tasks3 = [get_final_analysis(ticker_object) for ticker_object in ticker_info_list]
|
||||
await asyncio.gather(*tasks3)
|
||||
|
||||
# 最后对所有股票进行排名并返回
|
||||
final_ranking = rank_companies(ticker_info_list, industry)
|
||||
return final_ranking
|
||||
|
||||
'''
|
||||
async def main():
|
||||
|
||||
news_title = "央行降低存量房贷利率,多重政策推动房地产市场回暖"
|
||||
news_content = (
|
||||
"2024年9月24日,央行宣布多项措施以提振房地产市场,包括降低存量房贷利率、统一房贷最低首付比例、"
|
||||
"引导LPR(贷款市场报价利率)下行等。这些政策旨在减轻购房者负担,增加市场需求,并提振整体经济。"
|
||||
"消息公布后,房地产股大幅上涨,多只港股内房股涨幅超过10%。"
|
||||
)
|
||||
|
||||
|
||||
tickers = ['000560.SZ', '000736.SZ', '002016.SZ']
|
||||
industry = "房地产"
|
||||
|
||||
|
||||
final_rankings = await get_openai_verdict_2(news_title, news_content, tickers=tickers, industry=industry)
|
||||
|
||||
|
||||
print(final_rankings)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
|
||||
'''
|
||||