Compare commits

..

No commits in common. "master" and "master" have entirely different histories.

67 changed files with 161 additions and 4529 deletions

2
.gitignore vendored
View File

@ -1,2 +0,0 @@
env_variables.env
__pycache__/

21
LICENSE
View File

@ -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.

View File

@ -1 +1,23 @@
# 昇思MindSopre开源任务挑战赛
随着人工智能技术的飞速发展大模型技术已成为推动AI应用创新的重要力量。为了促进大模型技术的深入研究和应用昇思MindSpore开源社区联合启智社区发布赛道《昇思MindSopre开源任务挑战赛》即《基于昇思MindSpore AI框架的套件及大模型应用创新赛》旨在发掘和培育具有创新性和实用性的大模型应用。
#赛事任务
参赛者需基于昇思MindSpore AI框架和昇思套件设计并开发一款具有创新性、实用性和可扩展性的人工智能应用。该方案应能够解决某一具体领域的实际问题并展示出卓越的性能和效果。
#奖项设置
本项赛事设置一等奖、二等奖、三等奖及优秀奖若干。
奖项 数量 含税奖金(单位:元)
一等奖 1组 30000+获奖证书
二等奖 3组 10000+获奖证书
三等奖 8组 5000+获奖证书
优秀奖 实际参与的15%(不包括一、二、三等奖) 获奖证书
#赛事委员会
主席
余跃 鹏城实验室OpenI启智社区运营中心主任
杨滔 昇思MindSpore开源社区负责人
委员
刘冰姿 OpenI启智社区开发者主管
邓 清 鹏城实验室算网联盟合作与交流部部长
何芦微 昇思MindSpore开源社区资深专家

View File

@ -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 APIOpenAI 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** —— 您的专属投资助手,助您在金融市场中稳健前行!

View File

@ -1,5 +0,0 @@
{
"OPENAI_API_KEY": "",
"OPENAI_URL": "",
"OPENAI_MODEL": ""
}

View File

@ -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')

View File

@ -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.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 337 KiB

View File

@ -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)

View File

@ -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

Binary file not shown.

56
main.py
View File

@ -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)

View File

@ -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
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

View File

@ -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

View File

@ -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/

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -1,6 +0,0 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -1 +0,0 @@

View File

@ -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)

View File

@ -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 date Close High Low Open Vol
2 2014/1/2 2109.387 2113.11 2101.016 2112.126 68485486
3 2014/1/3 2083.136 2102.167 2075.899 2101.542 84497241
4 2014/1/6 2045.709 2078.684 2034.006 2078.684 89587608
5 2014/1/7 2047.317 2052.279 2029.246 2034.224 63402938
6 2014/1/8 2044.34 2062.952 2037.11 2047.256 71647364
7 2014/1/9 2027.622 2057.196 2026.446 2041.773 75941883
8 2014/1/10 2013.298 2029.297 2008.007 2023.535 75616121
9 2014/1/13 2009.564 2027.181 2000.404 2014.978 66544776
10 2014/1/14 2026.842 2027.428 2001.135 2007.156 70366614
11 2014/1/15 2023.348 2027.409 2010.204 2024.228 67436222
12 2014/1/16 2023.701 2034.707 2014.407 2022.538 72755719
13 2014/1/17 2004.949 2017.868 2001.33 2017.522 67305720
14 2014/1/20 1991.253 2005.938 1984.824 2001.894 56271247
15 2014/1/21 2008.313 2014.152 1992.015 1992.015 59844911
16 2014/1/22 2051.749 2052.339 2008.93 2009.969 98892856
17 2014/1/23 2042.18 2052.528 2039.052 2048.331 84210585
18 2014/1/24 2054.392 2060.986 2034.453 2037.667 92947921
19 2014/1/27 2033.3 2044.846 2029.626 2044.272 88815426
20 2014/1/28 2038.513 2047.129 2026.987 2036.402 72529043
21 2014/1/29 2049.914 2051.583 2039.771 2042.176 73865462
22 2014/1/30 2033.083 2045.931 2031.466 2045.931 62615184
23 2014/2/7 2044.497 2044.73 2014.698 2022.323 73598755
24 2014/2/10 2086.067 2087.975 2049.984 2049.984 124331833
25 2014/2/11 2103.671 2111.061 2082.522 2086.177 142211324
26 2014/2/12 2109.955 2110.904 2096.509 2103.828 126333186
27 2014/2/13 2098.401 2122.826 2096.966 2106.934 146532634
28 2014/2/14 2115.848 2116.186 2095.09 2097.32 111517950
29 2014/2/17 2135.415 2136.447 2117.689 2124.88 140244443
30 2014/2/18 2119.066 2134.143 2113.128 2134.143 142869308
31 2014/2/19 2142.554 2152.961 2111.168 2116.919 151261246
32 2014/2/20 2138.782 2177.978 2136.481 2152.891 157052276
33 2014/2/21 2113.693 2132.703 2098.328 2131.592 117662651
34 2014/2/24 2076.686 2099.717 2058.791 2099.717 123555308
35 2014/2/25 2034.219 2087.616 2026.543 2077.285 140132978
36 2014/2/26 2041.254 2041.627 2014.381 2026.61 110112687
37 2014/2/27 2047.354 2068.314 2036.391 2045.096 132163852
38 2014/2/28 2056.302 2058.489 2020.935 2040.624 111637907
39 2014/3/3 2075.235 2078.333 2047.067 2052.075 127460891
40 2014/3/4 2071.473 2074.025 2050.125 2068.107 115925792
41 2014/3/5 2053.084 2074.815 2050.175 2073.295 107733082
42 2014/3/6 2059.578 2065.79 2030.946 2050.032 109290133
43 2014/3/7 2057.908 2079.49 2050.47 2058.375 103709540
44 2014/3/10 1999.065 2042.634 1995.549 2042.352 115696666
45 2014/3/11 2001.157 2008.071 1985.599 1994.415 92705265
46 2014/3/12 1997.692 2011.06 1974.382 1996.239 101361719
47 2014/3/13 2019.111 2029.12 1996.529 2000.695 100978116
48 2014/3/14 2004.339 2017.913 1990.98 2008.825 87775111
49 2014/3/17 2023.673 2024.372 1999.249 2009.882 86250374
50 2014/3/18 2025.196 2034.917 2020.41 2026.224 96777193
51 2014/3/19 2021.734 2022.181 2002.441 2019.98 95180797
52 2014/3/20 1993.479 2030.847 1993.002 2017.22 110333048
53 2014/3/21 2047.619 2052.472 1986.071 1987.679 144477656
54 2014/3/24 2066.279 2074.056 2043.33 2050.827 147700085
55 2014/3/25 2067.311 2079.551 2057.491 2063.323 131822232
56 2014/3/26 2063.67 2074.572 2057.648 2070.574 102611116
57 2014/3/27 2046.588 2073.982 2042.713 2060.812 119149374
58 2014/3/28 2041.712 2060.134 2035.243 2046.851 121681965
59 2014/3/31 2033.306 2048.134 2024.185 2043.045 94356536
60 2014/4/1 2047.46 2050.681 2028.096 2031.005 83286576
61 2014/4/2 2058.988 2060.778 2046.742 2049.423 102658525
62 2014/4/3 2043.702 2066.007 2037.447 2063.497 108618421
63 2014/4/4 2058.831 2060.104 2035.221 2037.552 83189056
64 2014/4/8 2098.284 2102.452 2052.9 2054.53 133370983
65 2014/4/9 2105.237 2108.75 2095.64 2100.651 105340471
66 2014/4/10 2134.3 2146.67 2098.079 2105.876 156789609
67 2014/4/11 2130.542 2138.651 2120.179 2130.368 131768359
68 2014/4/14 2131.539 2134.434 2116.61 2127.409 102077853
69 2014/4/15 2101.601 2125.902 2098.15 2125.902 107531151
70 2014/4/16 2105.122 2112.05 2092.157 2097.213 89361657
71 2014/4/17 2098.885 2110.716 2095.714 2108.947 89896325
72 2014/4/18 2097.748 2099.637 2081.185 2091.48 88155695
73 2014/4/21 2065.826 2103.078 2065.234 2085.98 96378369
74 2014/4/22 2072.831 2073.663 2047.332 2062.787 98719882
75 2014/4/23 2067.382 2076.349 2059.109 2068.084 78531521
76 2014/4/24 2057.033 2075.757 2056.193 2064.156 78185955
77 2014/4/25 2036.519 2065.643 2035.566 2060.538 93042333
78 2014/4/28 2003.487 2035.99 2000.137 2033.337 89795262
79 2014/4/29 2020.341 2021.68 1997.64 2001.896 76221275
80 2014/4/30 2026.358 2029.538 2016.577 2020.438 74528578
81 2014/5/5 2027.353 2028.957 2007.351 2022.178 79933395
82 2014/5/6 2028.038 2038.705 2021.485 2024.256 74609411
83 2014/5/7 2010.083 2024.631 2008.451 2023.152 74360192
84 2014/5/8 2015.274 2036.941 2005.685 2006.853 77865393
85 2014/5/9 2011.135 2020.454 2001.3 2016.501 76224244
86 2014/5/12 2052.871 2055.506 2016.638 2022.932 115742077
87 2014/5/13 2050.728 2061.06 2043.547 2055.079 97223388
88 2014/5/14 2047.91 2056.574 2042.744 2049.27 72011125
89 2014/5/15 2024.974 2047.316 2022.861 2044.377 75845154
90 2014/5/16 2026.504 2027.756 2012.694 2023.596 66353660
91 2014/5/19 2005.183 2023.267 1996.015 2023.014 65329438
92 2014/5/20 2008.119 2018.156 2002.759 2011.846 61345382
93 2014/5/21 2024.951 2025.194 1991.055 2001.306 61811547
94 2014/5/22 2021.285 2041.96 2018.877 2023.148 74728474
95 2014/5/23 2034.569 2034.569 2017.739 2020.115 63488065
96 2014/5/26 2041.476 2045.381 2035.094 2042.028 70281220
97 2014/5/27 2034.565 2044.148 2032.839 2039.791 67577889
98 2014/5/28 2050.228 2052.656 2029.336 2034.561 81338642
99 2014/5/29 2040.595 2057.077 2039.238 2051.84 81242921
100 2014/5/30 2039.212 2046.96 2031.373 2040.394 75148898
101 2014/6/3 2038.305 2049.576 2037.3 2039.196 71584124
102 2014/6/4 2024.834 2038.481 2012.913 2037.989 72412771
103 2014/6/5 2040.878 2041.701 2016.175 2019.442 67949536
104 2014/6/6 2029.956 2041.573 2022.158 2040.864 66021744
105 2014/6/9 2030.502 2045.255 2023.198 2024.942 64788317
106 2014/6/10 2052.532 2052.765 2026.389 2033.207 79623717
107 2014/6/11 2054.948 2056.631 2045.407 2049.128 74444354
108 2014/6/12 2051.713 2057.105 2045.962 2051.582 81711186
109 2014/6/13 2070.715 2073.596 2048.618 2049.206 97174806
110 2014/6/16 2085.983 2087.322 2069.441 2070.699 95939770
111 2014/6/17 2066.698 2080.482 2064.666 2080.482 87800481
112 2014/6/18 2055.519 2066.913 2051.746 2064.383 87245350
113 2014/6/19 2023.735 2059.255 2017.653 2054.62 92914274
114 2014/6/20 2026.674 2027.148 2010.53 2013.414 67167246
115 2014/6/23 2024.365 2033.32 2022.917 2026.226 70485162
116 2014/6/24 2033.931 2034.707 2021.75 2023.699 71214634
117 2014/6/25 2025.502 2030.616 2018.36 2030.433 67539610
118 2014/6/26 2038.677 2040.754 2025.314 2025.662 80955778
119 2014/6/27 2036.51 2043.982 2025.073 2031.907 97592017
120 2014/6/30 2048.327 2052.342 2038.527 2038.613 96666598
121 2014/7/1 2050.381 2052.635 2041.937 2051.225 98457409
122 2014/7/2 2059.418 2060.595 2044.035 2049.485 109553911
123 2014/7/3 2063.229 2066.641 2048.081 2051.632 122926582
124 2014/7/4 2059.375 2065.078 2054.217 2062.358 105008792
125 2014/7/7 2059.927 2064.043 2050.887 2058.128 97168754
126 2014/7/8 2064.021 2064.433 2047.204 2058.134 95053393
127 2014/7/9 2038.612 2062.474 2037.601 2061.635 113305841
128 2014/7/10 2038.342 2045.527 2034.956 2036.54 97943819
129 2014/7/11 2046.961 2051.737 2033.004 2033.869 105088083
130 2014/7/14 2066.646 2067.342 2044.901 2047.744 115119740
131 2014/7/15 2070.357 2070.358 2059.679 2065.9 124488768
132 2014/7/16 2067.276 2075.493 2061.572 2068.343 137128020
133 2014/7/17 2055.591 2062.888 2046.189 2062.888 104491812
134 2014/7/18 2059.067 2067.233 2045.996 2047.498 106641094
135 2014/7/21 2054.479 2061.823 2049.175 2057.767 93857870
136 2014/7/22 2075.481 2078.085 2049.815 2050.5 123191868
137 2014/7/23 2078.489 2088.192 2072.229 2074.195 137292211
138 2014/7/24 2105.062 2107.946 2079.632 2079.632 165676996
139 2014/7/25 2126.614 2127.217 2106.714 2108.714 142495826
140 2014/7/28 2177.948 2181.496 2135.249 2135.249 236185752
141 2014/7/29 2183.192 2193.523 2172.102 2179.826 200264257
142 2014/7/30 2181.243 2194.572 2177.244 2178.179 184922187
143 2014/7/31 2201.562 2202.126 2173.9 2179.543 164691654
144 2014/8/1 2185.303 2218.789 2184.641 2194.17 191475042
145 2014/8/4 2223.331 2224.068 2186.917 2190.036 174097403
146 2014/8/5 2219.945 2226.838 2206.85 2224.632 175386987
147 2014/8/6 2217.465 2223.893 2192.993 2212.003 177711707
148 2014/8/7 2187.669 2220.568 2185.763 2216.659 175233274
149 2014/8/8 2194.425 2199.578 2180.597 2188.709 135181443
150 2014/8/11 2224.654 2225.961 2198.314 2199.433 150583421
151 2014/8/12 2221.595 2222.979 2210 2222.696 154799046
152 2014/8/13 2222.877 2230.991 2202.443 2223.051 178062806
153 2014/8/14 2206.466 2230.894 2204.384 2221.541 170149123
154 2014/8/15 2226.734 2230.872 2203.242 2207.226 149978691
155 2014/8/18 2239.466 2242.035 2228.134 2229.804 163928626
156 2014/8/19 2245.33 2246.016 2227.925 2242.34 177744592
157 2014/8/20 2240.211 2248.939 2233.892 2241.664 167658383
158 2014/8/21 2230.458 2240.077 2211.63 2239.568 165733498
159 2014/8/22 2240.812 2243.303 2225.267 2228.974 160111672
160 2014/8/25 2229.274 2241.553 2222.009 2241.1 162119578
161 2014/8/26 2207.106 2232.785 2200.618 2225.291 163507424
162 2014/8/27 2209.465 2216.67 2204.048 2207.03 120885885
163 2014/8/28 2195.818 2219.473 2194.861 2210.484 124229014
164 2014/8/29 2217.2 2218.696 2193.263 2198.946 105202496
165 2014/9/1 2235.511 2236.286 2217.685 2220.129 129166583
166 2014/9/2 2266.046 2267.509 2234.378 2239.684 192124869
167 2014/9/3 2288.627 2290.547 2268.1 2268.395 212478998
168 2014/9/4 2306.862 2307.701 2283.277 2290.029 199489978
169 2014/9/5 2326.432 2327.557 2307.447 2311.305 213181917
170 2014/9/9 2326.527 2331.917 2315.894 2328.426 196990318
171 2014/9/10 2318.305 2321.908 2306.421 2318.496 189828991
172 2014/9/11 2311.679 2343.595 2304.602 2315.732 222221798
173 2014/9/12 2331.95 2331.95 2302.775 2308.346 193471540
174 2014/9/15 2339.14 2340.449 2321.593 2330.187 215112414
175 2014/9/16 2296.555 2347.935 2293.869 2341.027 302694111
176 2014/9/17 2307.893 2309.048 2282.795 2298.982 210842453
177 2014/9/18 2315.928 2319.875 2297.931 2303.85 189089045
178 2014/9/19 2329.451 2331.561 2305.517 2312.984 174648487
179 2014/9/22 2289.866 2323.554 2284.378 2323.554 175842354
180 2014/9/23 2309.718 2311.525 2289.024 2289.091 156855169
181 2014/9/24 2343.575 2345.747 2297.876 2302.231 222525725
182 2014/9/25 2345.103 2365.154 2336.805 2352.865 225688323
183 2014/9/26 2347.718 2350.109 2329.955 2339.288 174748285
184 2014/9/29 2357.711 2363.059 2346.579 2353.708 200111021
185 2014/9/30 2363.87 2365.491 2354.268 2361.318 193918690
186 2014/10/8 2382.794 2382.794 2354.29 2368.576 204397326
187 2014/10/9 2389.371 2391.348 2367.111 2383.859 235920010
188 2014/10/10 2374.54 2386.277 2365.075 2380.755 224671126
189 2014/10/13 2366.009 2366.862 2341.124 2366.426 200899314
190 2014/10/14 2359.475 2380.515 2349.194 2362.802 196831418
191 2014/10/15 2373.67 2374.808 2344.373 2358.233 202804915
192 2014/10/16 2356.499 2389.675 2353.406 2361.13 248201168
193 2014/10/17 2341.184 2360.597 2312.826 2352.784 212300962
194 2014/10/20 2356.728 2357.509 2340.459 2346.052 160022305
195 2014/10/21 2339.657 2361.653 2337.551 2355.033 168828288
196 2014/10/22 2326.553 2352.124 2324.59 2339.223 152698425
197 2014/10/23 2302.418 2329.927 2297.33 2322.316 162636308
198 2014/10/24 2302.28 2314.875 2296.657 2303.08 132225281
199 2014/10/27 2290.437 2293.644 2279.836 2293.573 130261568
200 2014/10/28 2337.871 2338.278 2294.012 2294.012 178590357
201 2014/10/29 2373.03 2381.643 2339.712 2343.72 265588687
202 2014/10/30 2391.076 2397.256 2365.919 2371.891 294645943
203 2014/10/31 2420.178 2423.596 2384.483 2393.178 325763522
204 2014/11/3 2430.032 2436.785 2418.167 2425.225 298821235
205 2014/11/4 2430.677 2435.223 2417.221 2428.271 309013039
206 2014/11/5 2419.254 2434.363 2415.502 2432.169 263606654
207 2014/11/6 2425.864 2426.89 2401.75 2419.617 222005088
208 2014/11/7 2418.171 2454.423 2407.442 2427.898 291172245
209 2014/11/10 2473.673 2474.156 2428.185 2436.628 300628203
210 2014/11/11 2469.673 2508.623 2445.96 2483.648 411904065
211 2014/11/12 2494.476 2494.917 2444.814 2454.602 252933852
212 2014/11/13 2485.606 2507.743 2471.407 2494.998 295037058
213 2014/11/14 2478.824 2481.025 2457.045 2477.966 220607619
214 2014/11/17 2474.009 2508.767 2472.446 2506.864 215687800
215 2014/11/18 2456.366 2477.052 2449.813 2474.182 201062570
216 2014/11/19 2450.986 2461.491 2442.71 2452.15 186235771
217 2014/11/20 2452.66 2458.319 2437.476 2443.276 165495213
218 2014/11/21 2486.791 2488.201 2446.646 2452.635 212239774
219 2014/11/24 2532.879 2546.746 2495.521 2505.532 363485835
220 2014/11/25 2567.597 2568.381 2527.077 2531.998 314315572
221 2014/11/26 2604.345 2605.07 2570.404 2572.649 337127249
222 2014/11/27 2630.486 2631.399 2599.108 2615.367 364075719
223 2014/11/28 2682.835 2683.18 2622.061 2629.626 465880035
224 2014/12/1 2680.155 2720.743 2668.841 2691.725 446791741
225 2014/12/2 2763.545 2777.372 2665.686 2667.82 437733381
226 2014/12/3 2779.525 2824.179 2733.868 2768.678 562120281
227 2014/12/4 2899.456 2900.508 2772.432 2783.469 532687718
228 2014/12/5 2937.647 2978.029 2813.052 2926.573 640500296
229 2014/12/8 3020.258 3041.657 2879.847 2907.815 587570890
230 2014/12/9 2856.269 3091.324 2834.592 2992.49 771998379
231 2014/12/10 2940.006 2946.707 2807.678 2855.94 512886913
232 2014/12/11 2925.743 2965.675 2892.611 2912.346 482632733
233 2014/12/12 2938.173 2962.51 2914.956 2929.36 409480811
234 2014/12/15 2953.421 2960.227 2890.904 2921.446 400371695
235 2014/12/16 3021.518 3021.897 2943.912 2953.811 453842723
236 2014/12/17 3061.02 3076.599 2993.333 3031.952 542503179
237 2014/12/18 3057.521 3089.791 3030.319 3062.801 435904952
238 2014/12/19 3108.596 3117.527 3018.421 3053.075 521073511
239 2014/12/22 3127.445 3189.867 3090.509 3129.267 679371915
240 2014/12/23 3032.612 3136.838 3025.667 3085.08 437762400
241 2014/12/24 2972.532 3050.507 2934.911 3039.206 376805246
242 2014/12/25 3072.536 3073.345 2969.874 2992.462 376947776
243 2014/12/26 3157.603 3164.155 3064.176 3078.005 460700932
244 2014/12/29 3168.016 3223.86 3126.944 3212.559 510111439
245 2014/12/30 3165.815 3190.299 3130.353 3160.801 397725320
246 2014/12/31 3234.677 3239.357 3157.259 3172.597 405998521
247 2015/1/5 3350.519 3369.281 3253.883 3258.627 531352391
248 2015/1/6 3351.446 3394.224 3303.184 3330.799 501661695
249 2015/1/7 3373.954 3374.896 3312.211 3326.649 391918880
250 2015/1/8 3293.456 3381.566 3285.095 3371.957 371131170
251 2015/1/9 3285.412 3404.834 3267.509 3276.965 410240872
252 2015/1/12 3229.316 3275.185 3191.582 3258.213 322064679
253 2015/1/13 3235.301 3259.386 3214.412 3223.542 230725754
254 2015/1/14 3222.437 3268.483 3193.978 3242.337 240190747
255 2015/1/15 3336.455 3337.084 3207.545 3224.07 282546240
256 2015/1/16 3376.495 3400.318 3340.49 3343.603 339876753
257 2015/1/19 3116.351 3262.207 3095.066 3189.727 401098789
258 2015/1/20 3173.052 3190.245 3100.477 3114.56 357080811
259 2015/1/21 3323.611 3337.004 3178.343 3189.085 410956024
260 2015/1/22 3343.344 3352.384 3293.978 3327.319 353382961
261 2015/1/23 3351.764 3406.786 3328.293 3357.096 366249240
262 2015/1/26 3383.182 3384.798 3321.315 3347.257 317541007
263 2015/1/27 3352.96 3390.216 3290.219 3389.853 374517551
264 2015/1/28 3305.738 3354.802 3294.655 3325.722 301927095
265 2015/1/29 3262.305 3286.786 3234.241 3258.997 274658613
266 2015/1/30 3210.363 3288.503 3210.308 3273.747 258312548
267 2015/2/2 3128.3 3175.134 3122.572 3148.136 250861629
268 2015/2/3 3204.907 3207.935 3129.732 3156.086 248192164
269 2015/2/4 3174.126 3238.982 3171.144 3212.822 249098086
270 2015/2/5 3136.531 3251.212 3135.819 3251.212 306139305
271 2015/2/6 3075.907 3129.539 3052.939 3120.09 246749666
272 2015/2/9 3095.124 3119.034 3049.111 3063.51 206108383
273 2015/2/10 3141.593 3142.099 3084.253 3090.49 193817139
274 2015/2/11 3157.704 3166.421 3139.052 3145.765 172840094
275 2015/2/12 3173.416 3181.766 3134.244 3157.959 194592309
276 2015/2/13 3203.827 3237.159 3182.794 3186.808 261290436
277 2015/2/16 3222.363 3228.846 3195.884 3206.137 223797429
278 2015/2/17 3246.906 3255.725 3230.772 3230.884 228332624
279 2015/2/25 3228.843 3257.223 3215.552 3256.479 233348094
280 2015/2/26 3298.359 3300.616 3202.188 3222.151 301263875
281 2015/2/27 3310.303 3324.546 3291.007 3296.831 299163717
282 2015/3/2 3336.285 3336.76 3298.669 3332.721 346445671
283 2015/3/3 3263.052 3317.695 3260.429 3317.695 382044619
284 2015/3/4 3279.533 3286.588 3250.484 3264.182 293639522
285 2015/3/5 3248.476 3266.638 3221.666 3264.085 320663585
286 2015/3/6 3241.187 3266.933 3234.533 3248.036 282915791
287 2015/3/9 3302.408 3307.702 3198.37 3224.314 321495440
288 2015/3/10 3286.068 3309.915 3277.095 3289.085 285817576
289 2015/3/11 3290.9 3325.054 3278.471 3289.594 282985535
290 2015/3/12 3349.323 3360.054 3300.488 3314.813 357295105
291 2015/3/13 3372.911 3391.255 3352.15 3359.488 328410154
292 2015/3/16 3449.305 3449.305 3377.087 3391.158 399132430
293 2015/3/17 3502.847 3504.123 3459.694 3469.603 520939506
294 2015/3/18 3577.301 3577.662 3503.853 3510.501 545217144
295 2015/3/19 3582.271 3600.684 3546.844 3576.019 537346614
296 2015/3/20 3617.318 3632.338 3569.38 3587.084 516661669
297 2015/3/23 3687.728 3688.249 3635.485 3640.104 536062832
298 2015/3/24 3691.41 3715.873 3600.698 3692.569 639554669
299 2015/3/25 3660.727 3693.151 3634.559 3680.953 521886348
300 2015/3/26 3682.095 3707.318 3615.011 3641.942 488647203
301 2015/3/27 3691.096 3710.477 3656.831 3686.134 408945165
302 2015/3/30 3786.568 3795.935 3710.612 3710.612 564702353
303 2015/3/31 3747.899 3835.567 3737.043 3822.987 561676037
304 2015/4/1 3810.294 3817.082 3742.213 3748.34 447458319
305 2015/4/2 3825.784 3835.451 3775.894 3827.689 479299673
306 2015/4/3 3863.929 3864.405 3792.211 3803.383 473033311
307 2015/4/7 3961.378 3961.666 3891.728 3899.42 570447535
308 2015/4/8 3994.811 4000.22 3903.648 3976.532 618085419
309 2015/4/9 3957.534 4016.396 3900.027 4006.13 585176825
310 2015/4/10 4034.31 4040.348 3929.319 3947.492 484283619
311 2015/4/13 4121.715 4128.072 4057.293 4072.723 589814227
312 2015/4/14 4135.565 4168.346 4091.257 4125.782 610683541
313 2015/4/15 4084.163 4175.494 4069.007 4135.648 613005812
314 2015/4/16 4194.823 4195.305 4031.244 4055.916 551242956
315 2015/4/17 4287.296 4317.223 4238.91 4254.723 701706205
316 2015/4/20 4217.077 4356.001 4190.681 4301.352 857132807
317 2015/4/21 4293.623 4294.375 4188.569 4212.185 634470627
318 2015/4/22 4398.494 4400.193 4297.951 4304.597 680305086
319 2015/4/23 4414.508 4444.41 4358.844 4414.485 667344661
320 2015/4/24 4393.686 4416.376 4318.119 4355.951 628554996
321 2015/4/27 4527.396 4529.735 4441.929 4441.929 671088521
322 2015/4/28 4476.215 4572.391 4432.904 4527.635 767676416
323 2015/4/29 4476.62 4499.945 4398.639 4446.119 519834202
324 2015/4/30 4441.655 4507.344 4441.054 4483.013 526727975
325 2015/5/4 4480.464 4487.57 4387.426 4441.343 494173398
326 2015/5/5 4298.706 4488.865 4282.237 4479.848 572858596
327 2015/5/6 4229.266 4376.353 4187.368 4311.641 481732993
328 2015/5/7 4112.214 4213.764 4108.009 4197.896 394566653
329 2015/5/8 4205.917 4206.86 4099.042 4152.984 397428094
330 2015/5/11 4333.584 4334.877 4187.82 4231.271 488750515
331 2015/5/12 4401.219 4402.309 4317.975 4342.37 521866408
332 2015/5/13 4375.76 4415.629 4342.481 4402.378 510490475
333 2015/5/14 4378.311 4397.745 4329.042 4372.816 449077935
334 2015/5/15 4308.691 4366.822 4278.553 4366.822 439706198
335 2015/5/18 4283.491 4324.826 4260.509 4277.895 380057452
336 2015/5/19 4417.552 4418.403 4285.777 4285.777 436735224
337 2015/5/20 4446.288 4520.538 4432.279 4434.979 514106223
338 2015/5/21 4529.422 4530.478 4438.258 4456.435 464996520
339 2015/5/22 4657.596 4658.273 4562.989 4584.984 655591287
340 2015/5/25 4813.798 4814.672 4656.825 4660.075 682461391
341 2015/5/26 4910.897 4911.685 4779.075 4854.85 704892829
342 2015/5/27 4941.714 4958.156 4857.056 4932.846 681165379
343 2015/5/28 4620.266 4986.503 4614.241 4943.742 782964592
344 2015/5/29 4611.744 4698.193 4431.563 4603.465 611262409
345 2015/6/1 4828.738 4829.502 4615.231 4633.098 593389035
346 2015/6/2 4910.527 4911.574 4797.552 4844.704 623748099
347 2015/6/3 4909.978 4942.065 4822.442 4924.381 611453839
348 2015/6/4 4947.102 4947.965 4647.407 4912.945 674952402
349 2015/6/5 5023.096 5051.626 4898.068 5016.088 772240812
350 2015/6/8 5131.881 5146.949 4997.481 5045.694 855035085
351 2015/6/9 5113.534 5147.454 5042.963 5145.978 729893818
352 2015/6/10 5106.036 5164.162 5001.489 5049.197 596969001
353 2015/6/11 5121.593 5122.457 5050.765 5101.44 563990522
354 2015/6/12 5166.35 5178.191 5103.401 5143.343 625627854
355 2015/6/15 5062.993 5176.795 5048.742 5174.418 637803984
356 2015/6/16 4887.432 5029.684 4842.1 5004.412 550801407
357 2015/6/17 4967.898 4983.658 4767.216 4890.551 537101168
358 2015/6/18 4785.356 4966.767 4780.873 4942.52 507440899
359 2015/6/19 4478.364 4744.081 4476.501 4689.929 452689626
360 2015/6/23 4576.492 4577.939 4264.772 4471.613 473526128
361 2015/6/24 4690.15 4691.768 4552.129 4604.579 543003709
362 2015/6/25 4527.779 4720.701 4483.548 4711.763 572797533
363 2015/6/26 4192.873 4456.896 4139.53 4399.933 565217874
364 2015/6/29 4053.03 4297.475 3875.05 4289.771 673786349
365 2015/6/30 4277.222 4279.969 3847.88 4006.754 709176633
366 2015/7/1 4053.7 4317.053 4043.367 4214.15 598769427
367 2015/7/2 3912.767 4080.387 3795.253 4058.624 586015612
368 2015/7/3 3686.915 3927.128 3629.556 3793.712 548163111
369 2015/7/6 3775.912 3975.214 3653.037 3975.214 831139286
370 2015/7/7 3727.125 3750.57 3585.399 3654.778 698818688
371 2015/7/8 3507.192 3599.253 3421.525 3467.399 680356922
372 2015/7/9 3709.33 3748.479 3373.54 3432.454 656914612
373 2015/7/10 3877.803 3959.22 3677.435 3707.458 586364255
374 2015/7/13 3970.388 4030.195 3858.637 3918.99 643489007
375 2015/7/14 3924.487 4035.435 3855.56 3958.373 670558799
376 2015/7/15 3805.703 3914.273 3741.25 3874.968 601301324
377 2015/7/16 3823.176 3877.514 3688.442 3758.505 492256200
378 2015/7/17 3957.352 3994.477 3814.147 3831.421 481726268
379 2015/7/20 3992.11 4021.326 3927.121 3948.421 539106714
380 2015/7/21 4017.675 4041.819 3912.801 3939.898 504288028
381 2015/7/22 4026.045 4042.338 3960.864 3996.427 520732225
382 2015/7/23 4123.923 4132.612 4019.038 4022.268 563585966
383 2015/7/24 4070.908 4184.449 4044.831 4124.755 627424860
384 2015/7/27 3725.558 4051.159 3720.444 3985.57 556003247
385 2015/7/28 3663.002 3762.526 3537.358 3573.143 563330042
386 2015/7/29 3789.168 3792.072 3612.064 3689.825 434352085
387 2015/7/30 3705.766 3844.374 3685.956 3773.788 457943228
388 2015/7/31 3663.726 3729.512 3620.165 3655.667 350955745
389 2015/8/3 3622.905 3648.943 3549.496 3614.99 363968731
390 2015/8/4 3756.545 3757.029 3601.289 3621.855 362901666
391 2015/8/5 3694.573 3782.352 3676.39 3745.646 366422979
392 2015/8/6 3661.539 3710.57 3614.742 3625.504 274074663
393 2015/8/7 3744.205 3756.74 3686.3 3692.614 340757184
394 2015/8/10 3928.415 3943.624 3775.854 3786.033 497304319
395 2015/8/11 3927.908 3970.337 3891.179 3928.808 538923460
396 2015/8/12 3886.32 3937.772 3871.136 3881.228 442688278
397 2015/8/13 3954.556 3955.789 3838.159 3869.911 430073303
398 2015/8/14 3965.335 4000.684 3939.835 3976.405 467988217
399 2015/8/17 3993.668 3994.537 3907.399 3947.844 460432060
400 2015/8/18 3748.164 4006.337 3743.394 3999.134 543770822
401 2015/8/19 3794.109 3811.427 3558.383 3646.803 475396239
402 2015/8/20 3664.291 3788.005 3663.607 3754.567 390063057
403 2015/8/21 3507.744 3652.837 3490.54 3609.959 369920479
404 2015/8/24 3209.905 3388.364 3191.879 3373.478 334671792
405 2015/8/25 2964.967 3123.034 2947.944 3004.126 352325110
406 2015/8/26 2927.288 3092.041 2850.714 2980.794 466699663
407 2015/8/27 3083.591 3085.422 2906.49 2978.03 400308398
408 2015/8/28 3232.35 3235.839 3102.945 3125.264 443136928
409 2015/8/31 3205.986 3207.862 3109.163 3203.559 397431382
410 2015/9/1 3166.624 3180.331 3053.738 3157.832 432432468
411 2015/9/2 3160.167 3194.485 3019.087 3027.678 438170153
412 2015/9/7 3080.42 3217.579 3066.304 3149.38 296468114
413 2015/9/8 3170.452 3174.709 3011.117 3054.444 255415465
414 2015/9/9 3243.089 3256.743 3165.696 3182.552 375327978
415 2015/9/10 3197.893 3243.281 3178.904 3190.553 273261759
416 2015/9/11 3200.234 3223.762 3163.449 3189.479 224557822
417 2015/9/14 3114.798 3229.482 3049.23 3221.165 346631158
418 2015/9/15 3005.172 3081.703 2983.92 3043.805 249194445
419 2015/9/16 3152.263 3182.934 2983.535 2998.036 277524524
420 2015/9/17 3086.061 3204.702 3085.314 3131.982 317602892
421 2015/9/18 3097.917 3122.048 3070.336 3100.28 209175398
422 2015/9/21 3156.54 3159.883 3060.856 3072.094 239897354
423 2015/9/22 3185.619 3213.476 3152.481 3161.318 274786154
424 2015/9/23 3115.888 3164.041 3104.744 3137.723 236322670
425 2015/9/24 3142.687 3151.165 3109.691 3126.491 212887723
426 2015/9/25 3092.347 3149.948 3062.995 3130.851 236263871
427 2015/9/28 3100.756 3103.069 3042.31 3085.567 156727530
428 2015/9/29 3038.137 3068.298 3021.157 3055.218 163222673
429 2015/9/30 3052.781 3073.3 3039.742 3052.841 146642449
430 2015/10/8 3143.357 3172.281 3133.127 3156.075 234276050
431 2015/10/9 3183.152 3192.717 3137.788 3146.644 234851445
432 2015/10/12 3287.662 3318.714 3188.407 3193.54 386294715
433 2015/10/13 3293.23 3298.626 3253.249 3262.156 297153133
434 2015/10/14 3262.441 3307.315 3256.253 3280.02 295077739
435 2015/10/15 3338.073 3338.297 3254.392 3255.032 316283851
436 2015/10/16 3391.352 3393.018 3334.854 3358.297 395460575
437 2015/10/19 3386.7 3423.402 3355.566 3401.627 378112183
438 2015/10/20 3425.33 3425.516 3357.861 3377.547 318973758
439 2015/10/21 3320.676 3447.258 3265.436 3428.561 458455428
440 2015/10/22 3368.739 3373.776 3282.993 3292.291 323739341
441 2015/10/23 3412.434 3422.022 3360.218 3377.548 347372854
442 2015/10/26 3429.581 3457.517 3402 3448.649 365560853
443 2015/10/27 3434.336 3441.565 3332.616 3409.137 328172768
444 2015/10/28 3375.196 3439.758 3367.231 3417.011 293523284
445 2015/10/29 3387.315 3411.714 3362.509 3387.774 235676026
446 2015/10/30 3382.561 3417.201 3346.591 3380.284 243595118
447 2015/11/2 3325.085 3391.064 3322.312 3337.578 230951129
448 2015/11/3 3316.695 3346.275 3302.184 3330.316 192897428
449 2015/11/4 3459.64 3459.646 3325.619 3325.619 339078730
450 2015/11/5 3522.819 3585.657 3455.525 3459.215 553254947
451 2015/11/6 3590.032 3596.382 3508.827 3514.436 429167033
452 2015/11/9 3646.881 3673.76 3588.498 3588.498 503016682
453 2015/11/10 3640.485 3669.533 3607.891 3617.396 429746576
454 2015/11/11 3650.249 3654.877 3605.621 3635.004 360972651
455 2015/11/12 3632.902 3659.315 3603.228 3656.817 361717600
456 2015/11/13 3580.839 3632.556 3564.809 3600.764 345870933
457 2015/11/16 3606.957 3607.612 3519.421 3522.461 276187057
458 2015/11/17 3604.795 3678.273 3598.068 3629.977 383575468
459 2015/11/18 3568.468 3617.069 3558.697 3605.061 297580734
460 2015/11/19 3617.062 3618.213 3561.044 3573.776 247915576
461 2015/11/20 3630.5 3640.529 3607.915 3620.791 310801972
462 2015/11/23 3610.32 3654.754 3598.871 3630.867 315997474
463 2015/11/24 3616.113 3616.484 3563.104 3602.887 248810524
464 2015/11/25 3647.93 3648.367 3607.518 3614.068 273024857
465 2015/11/26 3635.552 3668.376 3629.865 3659.574 306761582
466 2015/11/27 3436.303 3621.897 3412.427 3616.544 354287525
467 2015/11/30 3445.405 3470.371 3327.812 3433.855 304197903
468 2015/12/1 3456.309 3483.414 3417.545 3442.441 252390755
469 2015/12/2 3536.905 3538.847 3427.661 3450.278 301491480
470 2015/12/3 3584.824 3591.73 3517.23 3525.727 281111255
471 2015/12/4 3524.992 3568.97 3510.412 3558.149 251736411
472 2015/12/7 3536.927 3543.945 3506.625 3529.806 208302579
473 2015/12/8 3470.07 3518.648 3466.79 3518.648 224367310
474 2015/12/9 3472.439 3495.702 3454.879 3462.583 195698845
475 2015/12/10 3455.495 3503.654 3446.273 3469.806 200427517
476 2015/12/11 3434.581 3455.548 3410.924 3441.597 182908878
477 2015/12/14 3520.668 3521.779 3399.28 3403.507 215374620
478 2015/12/15 3510.354 3529.961 3496.854 3518.126 200471341
479 2015/12/16 3516.187 3538.689 3506.291 3522.091 193482310
480 2015/12/17 3579.999 3583.408 3533.628 3533.628 283856476
481 2015/12/18 3578.964 3614.698 3568.161 3574.94 273707904
482 2015/12/21 3642.472 3651.056 3565.751 3568.581 299849280
483 2015/12/22 3651.767 3652.635 3616.87 3645.99 261178763
484 2015/12/23 3636.089 3684.567 3633.025 3653.282 298201801
485 2015/12/24 3612.485 3640.221 3572.277 3631.313 227785225
486 2015/12/25 3627.914 3635.256 3601.738 3614.054 198451111
487 2015/12/28 3533.779 3641.588 3533.779 3635.769 269983278
488 2015/12/29 3563.736 3564.171 3515.52 3528.395 182551923
489 2015/12/30 3572.876 3573.684 3538.112 3566.731 187889609
490 2015/12/31 3539.182 3580.602 3538.353 3570.467 176963659
491 2016/1/4 3296.258 3538.689 3295.741 3536.589 184418423
492 2016/1/5 3287.711 3328.139 3189.605 3196.651 266882083
493 2016/1/6 3361.84 3362.974 3288.933 3291.195 238886670
494 2016/1/7 3125.002 3309.657 3115.885 3309.657 70569123
495 2016/1/8 3186.412 3235.451 3056.878 3194.625 286440822
496 2016/1/11 3016.704 3166.215 3016.697 3131.853 271643691
497 2016/1/12 3022.861 3047.664 2978.463 3026.159 207659622
498 2016/1/13 2949.597 3059.015 2949.29 3041.107 194282106
499 2016/1/14 3007.649 3012.293 2867.553 2874.049 212905644
500 2016/1/15 2900.97 3001.708 2883.868 2988.048 198721697
501 2016/1/18 2913.8367 2945.4496 2844.7042 2847.5389 164699694
502 2016/1/19 3007.7393 3012.0684 2906.4038 2914.4078 205279703
503 2016/1/20 2976.6938 3016.2827 2951.9219 2993.0138 216505474
504 2016/1/21 2880.4816 2998.7904 2880.0848 2934.3912 191675668
505 2016/1/22 2916.5624 2931.3587 2851.7325 2911.1123 159810734
506 2016/1/25 2938.5149 2955.7826 2911.8286 2934.0781 153039057
507 2016/1/26 2749.7854 2911.9907 2743.8393 2907.7177 210836054
508 2016/1/27 2735.5578 2768.7719 2638.3016 2756.082 215722046
509 2016/1/28 2655.6609 2740.5358 2647.4931 2711.1582 171120280
510 2016/1/29 2737.5996 2755.3665 2649.7905 2652.8544 186673106
511 2016/2/1 2688.8536 2735.2551 2655.6234 2730.9844 156383744
512 2016/2/2 2749.5703 2755.1591 2687.9817 2687.9817 158078211
513 2016/2/3 2739.2469 2746.072 2696.8835 2719.5737 148397217
514 2016/2/4 2781.0227 2793.2981 2751.3135 2751.4317 170382018
515 2016/2/5 2763.492 2790.061 2762.1597 2783.0761 141186284
516 2016/2/15 2746.1958 2760.359 2682.09 2684.9614 129263932
517 2016/2/16 2836.5705 2840.6224 2758.579 2758.579 195961614
518 2016/2/17 2867.3379 2868.701 2824.3556 2829.7636 216909925
519 2016/2/18 2862.8927 2893.2148 2857.6989 2881.7769 219203873
520 2016/2/19 2860.0208 2872.7236 2840.4876 2854.904 163391413
521 2016/2/22 2927.175 2933.9638 2880.3474 2888.5984 232176042
522 2016/2/23 2903.3313 2928.048 2872.2816 2925.7082 199740663
523 2016/2/24 2928.896 2929.8712 2872.2741 2889.8846 213410384
524 2016/2/25 2741.2454 2922.2372 2729.8506 2922.2372 270284416
525 2016/2/26 2767.2097 2784.7525 2715.8743 2760.0575 191110472
526 2016/2/29 2687.9788 2755.8898 2638.9631 2754.8137 207410709
527 2016/3/1 2733.17 2747.5621 2668.7574 2688.3799 187207443
528 2016/3/2 2849.6811 2852.7001 2732.5388 2733.767 270961783
529 2016/3/3 2859.7582 2878.445 2840.8741 2847.3305 287478210
530 2016/3/4 2874.1468 2880.3719 2808.8493 2848.5384 312495169
531 2016/3/7 2897.3395 2911.8386 2871.3462 2886.6403 217466836
532 2016/3/8 2901.387 2902.6212 2802.5628 2895.6664 233482661
533 2016/3/9 2862.556 2863.0147 2811.7175 2839.4112 183355383
534 2016/3/10 2804.7255 2863.1763 2803.4764 2847.567 138979461
535 2016/3/11 2810.3074 2815.6074 2772.5512 2781.6004 127247554
536 2016/3/14 2859.499 2889.8164 2823.0282 2830.0836 194816030
537 2016/3/15 2864.3684 2865.787 2819.7949 2853.9776 163386667
538 2016/3/16 2870.43 2881.5293 2854.1919 2858.7085 186492535
539 2016/3/17 2904.8319 2921.0002 2857.1913 2875.4108 200290213
540 2016/3/18 2955.1498 2971.5508 2908.7416 2915.5177 313332735
541 2016/3/21 3018.8017 3028.3215 2973.7575 2978.4554 352400438
542 2016/3/22 2999.3628 3019.1008 2988.4256 3001.63 270377322
543 2016/3/23 3009.9604 3012.5596 2980.8554 2991.1685 216977462
544 2016/3/24 2960.9704 2998.1537 2960.5366 2986.801 237006403
545 2016/3/25 2979.4343 2981.4077 2952.1057 2956.1997 175074344
546 2016/3/28 2957.82 3008.1675 2948.5259 2988.0104 202021241
547 2016/3/29 2919.8318 2962.2029 2905.2513 2956.7052 182965345
548 2016/3/30 3000.6449 3001.1055 2941.2177 2941.2177 210371451
549 2016/3/31 3003.9152 3023.4086 2992.9155 3009.3672 220413445
550 2016/4/1 3009.5298 3009.6729 2956.247 2997.0883 206545866
551 2016/4/5 3053.0654 3057.3297 2993.1476 3000.9382 256730344
552 2016/4/6 3050.592 3059.7937 3029.0049 3039.7449 232262051
553 2016/4/7 3008.42 3062.3579 3007.0603 3058.3388 220919506
554 2016/4/8 2984.9582 2996.1706 2960.46 2988.2 187904633
555 2016/4/11 3033.957 3048.9766 3006.909 3006.909 220018324
556 2016/4/12 3023.6464 3036.8249 3001.3151 3031.3013 182718668
557 2016/4/13 3066.6381 3097.1648 3041.3584 3041.3584 310003246
558 2016/4/14 3082.3615 3086.6975 3056.9886 3080.09 208237830
559 2016/4/15 3078.1166 3089.9509 3066.8721 3085.0263 189613051
560 2016/4/18 3033.6604 3058.4629 3022.9701 3058.4629 183304512
561 2016/4/19 3042.8232 3054.5032 3024.8951 3047.1326 156533200
562 2016/4/20 2972.5837 3055.689 2905.0485 3050.3805 283144219
563 2016/4/21 2952.8911 2990.6729 2943.464 2954.3703 189406849
564 2016/4/22 2959.24 2960.2089 2926.7759 2933.0349 137211668
565 2016/4/25 2946.6704 2954.0921 2917.0202 2949.9727 125856243
566 2016/4/26 2964.6997 2965.4291 2933.9707 2944.7156 117711604
567 2016/4/27 2953.6709 2976.0221 2949.4322 2967.1902 130867640
568 2016/4/28 2945.5886 2959.5123 2916.3744 2955.7421 138663274
569 2016/4/29 2938.3235 2950.5761 2930.3565 2935.3756 109310628
570 2016/5/3 2992.6432 2993.5346 2929.8148 2940.3923 168703643
571 2016/5/4 2991.2721 3004.4184 2978.3295 2983.0266 165407106
572 2016/5/5 2997.8416 2999.1181 2977.1998 2987.0224 144831383
573 2016/5/6 2913.2476 3003.5904 2913.0361 2998.4022 206796498
574 2016/5/9 2832.1125 2896.1623 2821.8261 2896.1623 180378330
575 2016/5/10 2832.5912 2845.2376 2820.1642 2822.3273 120829310
576 2016/5/11 2837.0372 2857.2539 2818.6989 2843.5448 135795466
577 2016/5/12 2835.8618 2839.2763 2781.2362 2812.1083 136337655
578 2016/5/13 2827.1087 2850.0929 2814.1146 2828.4615 114319710
579 2016/5/16 2850.8617 2851.229 2804.9907 2816.7754 114653592
580 2016/5/17 2843.6841 2860.3205 2832.4592 2850.9264 123369064
581 2016/5/18 2807.5141 2828.2552 2781.4165 2828.178 140487826
582 2016/5/19 2806.9061 2829.4023 2801.5475 2802.3147 111595071
583 2016/5/20 2825.4831 2825.9517 2785.0795 2792.8883 108700899
584 2016/5/23 2843.645 2848.0713 2826.2562 2826.3123 120470455
585 2016/5/24 2821.6663 2839.695 2807.1878 2839.6823 111452445
586 2016/5/25 2815.0863 2843.165 2807.7488 2835.0293 103527265
587 2016/5/26 2822.4429 2827.0916 2780.7634 2813.5431 114766797
588 2016/5/27 2821.046 2832.7994 2809.7992 2817.9684 109845823
589 2016/5/30 2822.4509 2830.9697 2794.6608 2814.6507 106319589
590 2016/5/31 2916.616 2917.1351 2822.5927 2822.5927 215260341
591 2016/6/1 2913.5077 2929.0759 2909.5121 2917.1541 188386421
592 2016/6/2 2925.2293 2925.6702 2906.5242 2911.2193 159716916
593 2016/6/3 2938.682 2945.5193 2915.185 2929.7881 172021023
594 2016/6/6 2934.0979 2945.9416 2922.2833 2940.9943 141993742
595 2016/6/7 2936.0449 2938.444 2923.502 2936.2821 132987867
596 2016/6/8 2927.159 2937.9863 2908.3666 2932.3761 143046071
597 2016/6/13 2833.0707 2911.1582 2832.5072 2897.2731 169255434
598 2016/6/14 2842.1886 2843.4558 2822.0609 2824.2285 119755274
599 2016/6/15 2887.2101 2894.2639 2811.7808 2814.6931 166671069
600 2016/6/16 2872.8166 2887.7426 2865.3878 2878.4023 173882767
601 2016/6/17 2885.105 2900.2993 2872.1845 2873.0089 171472517
602 2016/6/20 2888.8091 2891.6583 2864.0199 2887.6358 136571051
603 2016/6/21 2878.5575 2919.302 2869.1759 2898.3837 164359089
604 2016/6/22 2905.5495 2905.978 2869.5133 2872.7337 130590424
605 2016/6/23 2891.9602 2904.1115 2878.661 2902.3979 136137375
606 2016/6/24 2854.2864 2899.5689 2807.5976 2883.759 190842609
607 2016/6/27 2895.7033 2895.731 2840.2765 2840.5585 156697472
608 2016/6/28 2912.5574 2913.5817 2878.8243 2885.0112 173871047
609 2016/6/29 2931.5923 2933.9974 2915.0618 2918.5337 193215586
610 2016/6/30 2929.6057 2938.1374 2922.3124 2931.4805 154464930
611 2016/7/1 2932.4758 2944.9894 2925.8101 2931.8016 141246227
612 2016/7/4 2988.604 2992.4978 2922.5196 2924.293 222017132
613 2016/7/5 3006.3919 3010.275 2990.6416 2991.7524 235204450
614 2016/7/6 3017.2924 3017.6523 2984.8278 2998.5207 212370920
615 2016/7/7 3016.8467 3024.1087 2994.6426 3009.3533 222681667
616 2016/7/8 2988.0939 3001.5506 2983.881 3000.3263 168986859
617 2016/7/11 2994.9167 3022.9439 2990.9071 2993.7489 224338224
618 2016/7/12 3049.381 3049.6814 2984.4205 2992.5195 259486295
619 2016/7/13 3060.6893 3069.0469 3048.1991 3049.5128 253659384
620 2016/7/14 3054.0182 3057.0458 3036.5234 3054.9748 180194804
621 2016/7/15 3054.296 3062.6832 3044.5375 3056.6817 172866398
622 2016/7/18 3043.5643 3058.3214 3031.6388 3047.6373 177496562
623 2016/7/19 3036.5979 3043.5999 3014.2889 3040.2257 155361466
624 2016/7/20 3027.8995 3042.997 3022.6309 3034.7139 138242815
625 2016/7/21 3039.0091 3053.3336 3027.3676 3027.6042 163767370
626 2016/7/22 3012.8157 3039.27 3007.4567 3038.1182 162010181
627 2016/7/25 3015.8278 3027.1228 3003.2921 3008.0937 144206582
628 2016/7/26 3050.1661 3050.6145 3013.8021 3014.0397 156694506
629 2016/7/27 2991.9991 3057.4237 2939.2273 3050.3675 280160915
630 2016/7/28 2994.3234 3003.3631 2968.182 2980.5012 190564950
631 2016/7/29 2979.3388 3000.0546 2972.9166 2992.5355 150101534
632 2016/8/1 2953.3854 2972.8751 2931.9633 2971.9491 147407763
633 2016/8/2 2971.2787 2971.2787 2946.6365 2950.0796 115468900
634 2016/8/3 2978.4608 2981.1555 2956.7856 2963.2145 141141332
635 2016/8/4 2982.4261 2982.8601 2958.9332 2976.4096 133933301
636 2016/8/5 2976.6962 2991.6767 2971.5638 2978.7776 141857101
637 2016/8/8 3004.2767 3004.7182 2959.0477 2972.6248 155729833
638 2016/8/9 3025.6805 3025.9108 2998.6766 3001.3063 169995446
639 2016/8/10 3018.7459 3033.1964 3017.0903 3023.4724 164675165
640 2016/8/11 3002.6376 3038.0478 3001.1681 3013.6776 161879481
641 2016/8/12 3050.6674 3051.0541 2999.039 3000.2731 168173657
642 2016/8/15 3125.1952 3137.4763 3053.8705 3056.4835 297616506
643 2016/8/16 3110.0369 3140.4408 3102.0653 3130.5333 278328934
644 2016/8/17 3109.5549 3114.2545 3090.2811 3106.9911 213839637
645 2016/8/18 3104.1138 3125.5812 3093.3171 3107.7527 229359081
646 2016/8/19 3108.102 3113.3438 3082.771 3100.3912 194347453
647 2016/8/22 3084.8051 3112.7395 3083.5932 3107.3812 185387927
648 2016/8/23 3089.7055 3101.1095 3073.5292 3081.5717 161368965
649 2016/8/24 3085.8804 3097.1483 3079.5478 3092.0197 145707440
650 2016/8/25 3068.3294 3073.4441 3041.5053 3073.4441 174032980
651 2016/8/26 3070.3088 3087.6522 3063.894 3069.8504 149663901
652 2016/8/29 3070.0273 3074.9433 3058.7853 3068.4602 144500007
653 2016/8/30 3074.6768 3082.9879 3065.9713 3071.4404 140434811
654 2016/8/31 3085.491 3087.6977 3063.3963 3072.9164 141368609
655 2016/9/1 3063.3054 3088.7043 3062.8763 3083.9606 155191093
656 2016/9/2 3067.352 3072.5258 3050.4924 3057.4945 150446920
657 2016/9/5 3072.0953 3085.4853 3065.329 3070.707 144963317
658 2016/9/6 3090.7127 3095.5092 3053.1868 3071.0554 172908524
659 2016/9/7 3091.9281 3105.6775 3087.8794 3091.3287 186956763
660 2016/9/8 3095.9543 3096.7832 3083.9015 3089.9529 145883771
661 2016/9/9 3078.8548 3101.7922 3078.2183 3095.4269 160692924
662 2016/9/12 3021.9771 3040.9522 2999.9288 3037.5073 206012086
663 2016/9/13 3023.5095 3029.7208 3008.7405 3025.0345 135387580
664 2016/9/14 3002.8486 3017.9447 2995.4156 3008.9044 133413401
665 2016/9/19 3026.0513 3026.6512 3005.3228 3005.3228 119225027
666 2016/9/20 3022.9995 3027.8165 3015.8804 3027.1717 118924117
667 2016/9/21 3025.8736 3032.4503 3017.5408 3021.5762 115721213
668 2016/9/22 3042.3132 3054.4351 3035.0703 3038.422 139309554
669 2016/9/23 3033.8956 3046.8047 3032.8023 3044.7858 125590976
670 2016/9/26 2980.4295 3028.2428 2980.1169 3028.2428 144330286
671 2016/9/27 2998.1723 2998.2333 2969.1321 2974.593 121701450
672 2016/9/28 2987.8576 3000.6954 2984.3206 3000.6954 104625697
673 2016/9/29 2998.4827 3009.1984 2991.9088 2992.1683 113213919
674 2016/9/30 3004.703 3009.1953 2993.0617 2994.2507 101333562
675 2016/10/10 3048.1428 3048.2358 3014.6198 3020.4566 160051104
676 2016/10/11 3065.2497 3066.104 3048.0175 3051.6216 167273496
677 2016/10/12 3058.4981 3060.5142 3048.8881 3057.3163 142493577
678 2016/10/13 3061.3458 3064.9989 3052.6403 3057.9724 154756725
679 2016/10/14 3063.8086 3064.7895 3043.1841 3056.9927 155373705
680 2016/10/17 3041.1663 3068.812 3033.7532 3064.691 163733265
681 2016/10/18 3083.8751 3084.1867 3037.4036 3037.4036 182042460
682 2016/10/19 3084.7189 3096.2228 3076.7705 3085.749 182470143
683 2016/10/20 3084.4577 3089.682 3076.2949 3084.9076 160691364
684 2016/10/21 3090.9412 3101.8486 3069.2669 3081.3891 187388072
685 2016/10/24 3128.2467 3137.0335 3090.7864 3092.0466 240522349
686 2016/10/25 3131.9385 3132.5046 3121.0499 3127.9684 203380898
687 2016/10/26 3116.3119 3129.8382 3110.3874 3129.8382 191663263
688 2016/10/27 3112.3498 3114.7587 3100.3918 3112.6028 158008789
689 2016/10/28 3104.2703 3128.6427 3101.2371 3111.7035 181774123
690 2016/10/31 3100.492 3102.3015 3081.0722 3097.1881 151506764
691 2016/11/1 3122.4356 3122.6147 3097.0423 3101.6639 160232032
692 2016/11/2 3102.7326 3118.9773 3099.8196 3115.7291 182722067
693 2016/11/3 3128.9356 3140.9298 3094.1025 3096.765 222986260
694 2016/11/4 3125.3167 3141.3337 3119.5354 3126.3489 197683197
695 2016/11/7 3133.3326 3139.2017 3117.0961 3124.892 179418490
696 2016/11/8 3147.8875 3156.8812 3134.9547 3140.9435 190846979
697 2016/11/9 3128.3702 3146.9497 3096.9466 3146.0775 241114958
698 2016/11/10 3171.282 3172.3085 3148.544 3148.544 244192602
699 2016/11/11 3196.0436 3202.7401 3166.0696 3169.4007 310854579
700 2016/11/14 3210.371 3221.4584 3186.7956 3187.7093 329608313
701 2016/11/15 3206.9858 3214.292 3195.0353 3209.9546 240886350
702 2016/11/16 3205.0572 3210.8927 3195.4105 3208.4973 221766993
703 2016/11/17 3208.4525 3211.0527 3187.2056 3198.4985 214206240
704 2016/11/18 3192.8559 3212.394 3187.4963 3207.1933 209826639
705 2016/11/21 3218.1477 3229.7568 3188.2799 3188.4964 230652844
706 2016/11/22 3248.3517 3249.6765 3220.9825 3220.9825 261631547
707 2016/11/23 3241.1366 3262.8788 3231.5863 3247.9448 249959592
708 2016/11/24 3241.7359 3257.8574 3232.869 3237.428 232324527
709 2016/11/25 3261.9378 3262.4379 3209.5979 3241.2433 233921601
710 2016/11/28 3276.9996 3288.3372 3267.6736 3270.0471 281551253
711 2016/11/29 3282.9238 3301.2133 3263.3973 3269.2339 320836287
712 2016/11/30 3250.0344 3277.2694 3239.5206 3272.1422 243576053
713 2016/12/1 3273.3093 3279.6707 3256.2555 3257.0268 237759864
714 2016/12/2 3243.8432 3279.7137 3235.277 3270.1205 259567205
715 2016/12/5 3204.7092 3219.5181 3194.8785 3203.7844 223010394
716 2016/12/6 3199.6473 3215.3114 3196.5248 3202.0293 157572693
717 2016/12/7 3222.2415 3222.428 3189.485 3198.4748 169072847
718 2016/12/8 3215.3658 3228.122 3211.4712 3225.5499 170710173
719 2016/12/9 3232.8834 3244.8013 3207.0433 3209.3395 204023956
720 2016/12/12 3152.9704 3245.0946 3149.8955 3233.6661 274708461
721 2016/12/13 3155.0374 3162.496 3118.7121 3138.9881 185164495
722 2016/12/14 3140.5308 3170.0208 3136.348 3149.3774 201358887
723 2016/12/15 3117.677 3138.7793 3100.9128 3125.7568 189990626
724 2016/12/16 3122.9815 3128.8735 3106.3464 3111.5145 164988699
725 2016/12/19 3118.0846 3125.284 3110.0817 3120.6963 154169716
726 2016/12/20 3102.8759 3117.0145 3084.7997 3115.8984 157426759
727 2016/12/21 3137.4297 3140.2512 3107.2396 3107.2396 186706607
728 2016/12/22 3139.558 3143.1685 3126.8872 3132.1558 167804990
729 2016/12/23 3110.1544 3138.404 3103.7476 3134.9292 166176769
730 2016/12/26 3122.569 3122.8812 3068.415 3095.5787 152571881
731 2016/12/27 3114.664 3127.8828 3113.7451 3117.3868 141528939
732 2016/12/28 3102.2357 3118.7818 3094.5488 3113.7671 135727087
733 2016/12/29 3096.0968 3111.7994 3087.344 3095.8447 132623292
734 2016/12/30 3103.6373 3108.8393 3089.9894 3097.3454 133267130
735 2017/1/3 3135.9208 3136.4558 3105.3085 3105.3085 141567187
736 2017/1/4 3158.794 3160.1029 3130.1145 3133.7873 167860850
737 2017/1/5 3165.4109 3168.5021 3154.281 3157.9063 174727645
738 2017/1/6 3154.321 3172.0347 3153.0253 3163.7761 183708966
739 2017/1/9 3171.2362 3173.136 3147.7351 3148.5317 171714075
740 2017/1/10 3161.6713 3174.5781 3157.3322 3167.5701 179759216
741 2017/1/11 3136.7535 3167.0288 3136.2667 3156.6856 178362221
742 2017/1/12 3119.2886 3144.9699 3115.9787 3133.6015 148889240
743 2017/1/13 3112.7644 3130.5146 3102.1628 3116.0827 156274214
744 2017/1/16 3103.428 3105.1423 3044.2912 3104.4924 257885996
745 2017/1/17 3108.7746 3108.9072 3072.3384 3087.0295 136157861
746 2017/1/18 3113.0123 3123.7203 3098.5864 3104.7664 131780128
747 2017/1/19 3101.2992 3115.7778 3094.0055 3104.9715 123851420
748 2017/1/20 3123.1389 3125.6599 3095.2147 3095.8185 122366777
749 2017/1/23 3136.7748 3145.8411 3125.4209 3125.4209 132660392
750 2017/1/24 3142.5533 3149.5312 3131.2181 3134.5921 125973881
751 2017/1/25 3149.5547 3151.4723 3133.1911 3137.6462 112073827
752 2017/1/26 3159.166 3163.1041 3148.9083 3149.2167 113876772
753 2017/2/3 3140.17 3162.6771 3136.013 3160.0816 92224736
754 2017/2/6 3156.9838 3158.8433 3135.3869 3143.0931 127198283
755 2017/2/7 3153.0878 3159.544 3140.0356 3154.4046 128337442
756 2017/2/8 3166.9818 3167.4465 3132.0333 3148.086 144920187
757 2017/2/9 3183.1794 3186.838 3162.5744 3164.6875 191640327
758 2017/2/10 3196.699 3205.049 3182.8021 3183.0069 239348913
759 2017/2/13 3216.8394 3219.4072 3198.9946 3198.9946 220191508
760 2017/2/14 3217.928 3219.4047 3205.2853 3216.137 188798088
761 2017/2/15 3212.9857 3235.9977 3206.5606 3215.4639 241507706
762 2017/2/16 3229.6184 3230.2754 3207.7852 3210.3567 216955942
763 2017/2/17 3202.0756 3238.3959 3199.4248 3227.7073 226228177
764 2017/2/20 3239.9613 3241.458 3198.9633 3198.9633 232152096
765 2017/2/21 3253.3257 3254.3355 3239.8775 3242.2226 211673066
766 2017/2/22 3261.2184 3261.3808 3243.8398 3252.6898 207453776
767 2017/2/23 3251.375 3264.0819 3236.3549 3258.8319 209179800
768 2017/2/24 3253.4327 3253.9556 3233.5348 3246.8603 186406362
769 2017/2/27 3228.6602 3251.6543 3224.0884 3249.1945 182581071
770 2017/2/28 3241.7331 3242.679 3225.9689 3225.9689 151244318
771 2017/3/1 3246.9335 3259.9781 3237.8714 3240.0726 190677550
772 2017/3/2 3230.0281 3256.8074 3228.6647 3250.5183 181215076
773 2017/3/3 3218.3118 3221.1553 3206.6127 3219.2019 157082368
774 2017/3/6 3233.8657 3234.6626 3215.067 3217.3345 156092158
775 2017/3/7 3242.4063 3242.6591 3226.8219 3233.0939 164064235
776 2017/3/8 3240.6646 3245.3043 3230.6083 3240.5323 160731388
777 2017/3/9 3216.7457 3233.8749 3205.2794 3233.7007 167371108
778 2017/3/10 3212.7601 3222.3189 3208.4472 3213.7294 136672743
779 2017/3/13 3237.0244 3237.1212 3193.1565 3209.4492 163673760
780 2017/3/14 3239.3278 3246.3285 3231.5209 3235.2515 146946022
781 2017/3/15 3241.7597 3243.713 3227.7377 3235.403 144055682
782 2017/3/16 3268.9354 3269.77 3247.1628 3247.1628 189416002
783 2017/3/17 3237.4471 3274.1903 3232.2806 3271.8665 200583223
784 2017/3/20 3250.8082 3251.1271 3228.1177 3241.1101 170548430
785 2017/3/21 3261.6108 3262.2209 3246.6959 3250.2473 162719306
786 2017/3/22 3245.2198 3255.7779 3229.1283 3246.2233 189731649
787 2017/3/23 3248.5495 3262.0914 3221.9344 3245.8078 193029144
788 2017/3/24 3269.4451 3275.2066 3241.1233 3247.3495 219777914
789 2017/3/27 3266.9552 3283.2393 3262.1184 3268.924 201852675
790 2017/3/28 3252.9479 3265.6344 3246.0861 3265.6344 161710013
791 2017/3/29 3241.3144 3262.0976 3233.2795 3252.8653 216105575
792 2017/3/30 3210.2369 3240.0174 3195.8524 3235.1369 247135479
793 2017/3/31 3222.5142 3226.2483 3205.5365 3206.2529 196442922
794 2017/4/5 3270.3054 3270.6453 3233.2367 3235.6603 248320202
795 2017/4/6 3281.0047 3286.6739 3265.7645 3272.1926 245287999
796 2017/4/7 3286.616 3295.187 3275.0507 3280.6239 236108942
797 2017/4/10 3269.3926 3285.4594 3265.0121 3285.4594 232694616
798 2017/4/11 3288.9657 3290.3887 3244.4047 3266.2219 281281248
799 2017/4/12 3273.8301 3284.9338 3262.2773 3283.8369 269381790
800 2017/4/13 3275.9603 3281.1369 3261.4901 3265.2181 207346875
801 2017/4/14 3246.0668 3276.7112 3238.8959 3276.1381 214508558
802 2017/4/17 3222.1673 3229.9491 3199.9121 3229.9491 212737189
803 2017/4/18 3196.7133 3225.0546 3196.4884 3215.3963 188661353
804 2017/4/19 3170.6867 3189.4368 3147.0655 3184.666 213238075
805 2017/4/20 3172.1003 3178.1826 3148.1844 3165.665 190873985
806 2017/4/21 3173.1512 3180.7944 3158.6286 3170.2899 164761740
807 2017/4/24 3129.5312 3164.2479 3111.2145 3164.2479 186277434
808 2017/4/25 3134.5674 3145.2672 3117.4488 3123.8943 153418307
809 2017/4/26 3140.8471 3152.9534 3131.418 3132.9181 169878107
810 2017/4/27 3152.1869 3155.0033 3097.3334 3131.3496 211793073
811 2017/4/28 3154.6584 3154.7266 3136.5781 3144.0219 162889899
812 2017/5/2 3143.7121 3154.7812 3136.5391 3147.2275 154222962
813 2017/5/3 3135.346 3148.2857 3123.7509 3138.3068 163763924
814 2017/5/4 3127.3687 3143.8179 3111.3912 3127.1058 177967485
815 2017/5/5 3103.0378 3117.6141 3092.0918 3114.7735 176213641
816 2017/5/8 3078.6129 3093.4516 3067.6943 3090.0652 180526904
817 2017/5/9 3080.5269 3084.2077 3056.558 3064.8484 135066674
818 2017/5/10 3052.785 3090.8191 3051.5896 3078.1728 160794452
819 2017/5/11 3061.5003 3063.5637 3016.5305 3036.7891 191341901
820 2017/5/12 3083.5132 3090.4914 3051.8713 3054.1123 159684099
821 2017/5/15 3090.2289 3098.9125 3085.9319 3085.9319 135660728
822 2017/5/16 3112.9642 3113.5116 3060.5344 3082.8717 173775564
823 2017/5/17 3104.4415 3119.5816 3101.2953 3107.802 168674158
824 2017/5/18 3090.139 3103.4413 3077.9631 3082.3288 148620035
825 2017/5/19 3090.6309 3095.4826 3081.278 3086.7054 129635230
826 2017/5/22 3075.6756 3103.9375 3063.1529 3087.1705 153683730
827 2017/5/23 3061.947 3084.2352 3050.8423 3069.3935 178310599
828 2017/5/24 3064.0759 3064.8127 3022.3026 3047.5681 139813353
829 2017/5/25 3107.8311 3114.6578 3052.8309 3055.3425 191391841
830 2017/5/26 3110.0587 3120.6627 3100.3877 3101.2864 155923486
831 2017/5/31 3117.1778 3143.2787 3111.5563 3125.3252 152950430
832 2017/6/1 3102.6232 3113.5212 3097.6794 3108.4214 163015719
833 2017/6/2 3105.54 3110.3891 3081.8485 3094.2253 142504925
834 2017/6/5 3091.6561 3105.5056 3084.8301 3102.1095 132570300
835 2017/6/6 3102.126 3102.8633 3078.7872 3084.5401 113439963
836 2017/6/7 3140.3249 3140.7743 3098.9508 3101.7608 173229014
837 2017/6/8 3150.3336 3153.2635 3132.8278 3136.4705 152277659
838 2017/6/9 3158.4004 3165.9197 3146.1075 3147.4533 160136334
839 2017/6/12 3139.8766 3164.9502 3135.314 3149.5266 146729425
840 2017/6/13 3153.7429 3155.9895 3131.0431 3134.0089 128318279
841 2017/6/14 3130.674 3149.1731 3125.3546 3146.748 138347042
842 2017/6/15 3132.4863 3137.5854 3117.084 3125.5865 146954245
843 2017/6/16 3123.1662 3134.2511 3117.8567 3126.3728 129652758
844 2017/6/19 3144.3739 3146.7703 3121.7787 3122.1578 134891758
845 2017/6/20 3140.0136 3150.4646 3134.6106 3148.0187 141191802
846 2017/6/21 3156.2118 3157.0275 3132.6173 3148.9861 136688268
847 2017/6/22 3147.4532 3186.9823 3146.6432 3152.2424 191344006
848 2017/6/23 3157.873 3158.0474 3118.0946 3138.4441 154843648
849 2017/6/26 3185.4439 3187.8891 3156.9767 3157.0022 173579211
850 2017/6/27 3191.1969 3193.4613 3172.463 3183.4198 148201198
851 2017/6/28 3173.2014 3193.4397 3170.7859 3183.6334 146516720
852 2017/6/29 3188.0625 3188.7741 3174.2835 3174.9811 128755470
853 2017/6/30 3192.4269 3193.2411 3171.5703 3176.9481 121464543
854 2017/7/3 3195.9116 3196.2861 3177.0244 3191.9982 140305717
855 2017/7/4 3182.8039 3193.0644 3174.314 3192.8885 141114967
856 2017/7/5 3207.1342 3207.3095 3174.7081 3179.2169 148296483
857 2017/7/6 3212.444 3215.95 3188.7733 3203.8631 175809287
858 2017/7/7 3217.9567 3219.5232 3195.2905 3203.8225 176715416
859 2017/7/10 3212.6319 3223.3402 3203.2089 3208.4627 198928010
860 2017/7/11 3203.0375 3226.908 3199.2235 3201.5169 187837262
861 2017/7/12 3197.5439 3215.1962 3177.9346 3201.9292 186900880
862 2017/7/13 3218.1632 3219.2683 3190.3393 3192.3615 195303611
863 2017/7/14 3222.4168 3222.9784 3204.8529 3212.0316 160126773
864 2017/7/17 3176.4648 3230.354 3139.5035 3219.7914 266205274
865 2017/7/18 3187.5672 3187.671 3150.1284 3159.7318 190623060
866 2017/7/19 3230.9762 3232.9408 3179.73 3181.4015 272420726
867 2017/7/20 3244.8647 3246.236 3225.4328 3227.5056 232108392
868 2017/7/21 3237.9817 3247.7122 3231.9556 3236.5881 206003251
869 2017/7/24 3250.5989 3261.1046 3230.0705 3230.898 233056399
870 2017/7/25 3243.6894 3261.6454 3233.1376 3249.1376 205573873
871 2017/7/26 3247.6748 3264.8483 3228.0389 3244.4608 213542005
872 2017/7/27 3249.7814 3251.9261 3220.6366 3243.765 228485945
873 2017/7/28 3253.2404 3256.3706 3232.9634 3240.1728 182226880
874 2017/7/31 3273.0283 3276.9461 3251.1941 3252.7519 246039440
875 2017/8/1 3292.6383 3292.6383 3273.5038 3274.3685 237194594
876 2017/8/2 3285.0568 3305.4313 3282.0377 3288.5183 266730628
877 2017/8/3 3272.9286 3293.3686 3262.1554 3279.9864 233277004
878 2017/8/4 3262.0809 3287.1929 3261.3066 3269.3182 275906340
879 2017/8/7 3279.4566 3280.1035 3243.7153 3257.67 231173379
880 2017/8/8 3281.8728 3285.4833 3269.6582 3277.1887 252043537
881 2017/8/9 3275.573 3277.9433 3263.8468 3277.8083 235597907
882 2017/8/10 3261.7494 3282.519 3236.1829 3269.7347 240684622
883 2017/8/11 3208.5413 3245.1163 3200.7481 3237.9222 262962995
884 2017/8/14 3237.3602 3240.0517 3206.0436 3206.0436 190346796
885 2017/8/15 3251.2617 3263.5892 3235.1013 3235.2298 182297997
886 2017/8/16 3246.4512 3248.785 3228.8705 3247.8525 176852051
887 2017/8/17 3268.4298 3269.1389 3251.4593 3253.8455 203622551
888 2017/8/18 3268.7243 3275.0763 3248.0833 3253.2434 191122483
889 2017/8/21 3286.9055 3287.5186 3270.4753 3274.5805 186122483
890 2017/8/22 3290.2257 3293.476 3274.941 3287.6147 186537991
891 2017/8/23 3287.7049 3299.4572 3274.4404 3283.7966 179832208
892 2017/8/24 3271.5117 3297.9886 3266.3589 3287.9594 163468937
893 2017/8/25 3331.5221 3331.9146 3271.4608 3271.4608 205839482
894 2017/8/28 3362.6514 3375.0339 3336.1264 3336.1264 257461438
895 2017/8/29 3365.2261 3374.5947 3354.4627 3362.0604 219504535
896 2017/8/30 3363.6266 3376.6481 3357.0803 3361.8207 246863312
897 2017/8/31 3360.8103 3367.3581 3340.6865 3361.4621 234419781
898 2017/9/1 3367.1194 3381.9252 3358.4724 3365.9913 282497584
899 2017/9/4 3379.583 3381.4027 3359.1309 3369.7185 267427849
900 2017/9/5 3384.317 3390.8233 3371.5706 3377.1968 216552946
901 2017/9/6 3385.3888 3391.0105 3364.7645 3372.4277 229090785
902 2017/9/7 3365.4974 3387.7956 3363.1765 3383.6281 221118685
903 2017/9/8 3365.2426 3380.8898 3353.6876 3364.4275 198405184
904 2017/9/11 3376.4188 3384.81 3360.0462 3365.3506 219011019
905 2017/9/12 3379.488 3391.0694 3370.8519 3381.487 272910319
906 2017/9/13 3384.147 3387.1397 3366.5412 3374.7185 194550715
907 2017/9/14 3371.4256 3391.6435 3361.3335 3383.47 221306487
908 2017/9/15 3353.6192 3365.5277 3345.3283 3365.1454 219765816
909 2017/9/18 3362.8587 3371.7486 3352.5134 3352.5134 190319676
910 2017/9/19 3356.8446 3370.4009 3344.7054 3365.5315 191129691
911 2017/9/20 3365.9959 3370.0978 3346.5356 3352.1848 192196661
912 2017/9/21 3357.8123 3377.8844 3356.8754 3364.6977 197448695
913 2017/9/22 3352.5294 3356.4514 3334.9846 3347.1569 179234007
914 2017/9/25 3341.5487 3350.9612 3334.9438 3344.5886 169621293
915 2017/9/26 3343.5826 3347.1629 3332.5985 3336.3497 132628595
916 2017/9/27 3345.2717 3349.6949 3340.2989 3340.8219 143086945
917 2017/9/28 3339.6421 3344.6005 3336.1784 3343.8446 149444300
918 2017/9/29 3348.9431 3357.0154 3340.3109 3340.3109 144862443
919 2017/10/9 3374.3781 3410.1704 3366.965 3403.2458 191736057
920 2017/10/10 3382.9879 3384.0262 3358.7953 3373.3446 179423841
921 2017/10/11 3388.2838 3395.7794 3379.1634 3381.488 181476704
922 2017/10/12 3386.1 3390.2036 3372.5331 3385.5329 161809380
923 2017/10/13 3390.5233 3395.7484 3383.2392 3384.4883 139954764
924 2017/10/16 3378.4704 3400.5113 3374.7687 3393.2055 174330620
925 2017/10/17 3372.0407 3382.4072 3365.5646 3373.2342 125381725
926 2017/10/18 3381.7937 3383.2323 3371.9249 3373.5281 157228791
927 2017/10/19 3370.1721 3378.7359 3359.6284 3374.6444 158476495
928 2017/10/20 3378.6481 3379.7652 3360.1001 3363.5138 127172851
929 2017/10/23 3380.699 3385.2853 3374.705 3382.28 130846289
930 2017/10/24 3388.2477 3388.6886 3374.1246 3376.5989 139897511
931 2017/10/25 3396.8975 3398.3041 3382.0338 3384.8579 123131222
932 2017/10/26 3407.5671 3414.2415 3391.4549 3397.519 183768625
933 2017/10/27 3416.8124 3421.1026 3402.1141 3404.4978 170257173
934 2017/10/30 3390.3371 3419.7315 3357.2762 3413.8679 208349286
935 2017/10/31 3393.3417 3397.0988 3376.1238 3380.999 153498206
936 2017/11/1 3395.9125 3410.3519 3388.5978 3393.9678 180566127
937 2017/11/2 3383.3095 3391.652 3372.2131 3391.652 166864267
938 2017/11/3 3371.7441 3380.57 3347.3603 3377.7356 172714790
939 2017/11/6 3388.1742 3389.3826 3356.5337 3369.685 154636468
940 2017/11/7 3413.5748 3415.1482 3387.9459 3389.4721 190571746
941 2017/11/8 3415.4602 3434.4918 3404.8811 3409.1474 185436470
942 2017/11/9 3427.7946 3428.7704 3408.6186 3410.6723 158650426
943 2017/11/10 3432.6731 3438.7924 3414.3286 3423.1846 189276503
944 2017/11/13 3447.8358 3449.1638 3435.0849 3435.1839 205389054
945 2017/11/14 3429.5482 3450.4949 3419.6919 3446.5453 196472674
946 2017/11/15 3402.5245 3423.7495 3396.381 3416.2112 168792076
947 2017/11/16 3399.2503 3409.6532 3390.5888 3393.1937 156684332
948 2017/11/17 3382.9075 3403.2855 3373.2956 3392.6834 249458153
949 2017/11/20 3392.3988 3393.1063 3337.116 3361.3563 176524683
950 2017/11/21 3410.4977 3419.802 3377.5989 3382.3595 196871803
951 2017/11/22 3430.4643 3442.1777 3404.2865 3417.3313 213567093
952 2017/11/23 3351.9182 3429.4237 3342.3324 3425.0093 215265393
953 2017/11/24 3353.8207 3360.7459 3328.3339 3340.3842 159569663
954 2017/11/27 3322.2298 3347.0506 3315.2642 3346.6567 166439170
955 2017/11/28 3333.657 3333.7998 3300.7808 3311.2322 138247799
956 2017/11/29 3337.862 3343.0624 3305.5721 3335.5671 183805932
957 2017/11/30 3317.1884 3340.9201 3306.2832 3328.6427 156595851
958 2017/12/1 3317.6174 3324.5161 3302.4398 3315.1051 139198300
959 2017/12/4 3309.6183 3323.9961 3304.1034 3310.3814 148053288
960 2017/12/5 3303.6751 3315.7373 3300.5117 3301.6906 208278862
961 2017/12/6 3293.9648 3296.2013 3254.6108 3291.3128 151604452
962 2017/12/7 3272.0542 3291.2817 3259.1637 3283.2791 132105900
963 2017/12/8 3289.9924 3297.1304 3258.7593 3264.4776 133209314
964 2017/12/11 3322.1956 3322.6736 3288.2949 3290.4881 131965984
965 2017/12/12 3280.8136 3320.3103 3280.3291 3320.3103 124604827
966 2017/12/13 3303.0373 3304.0101 3273.3248 3278.3968 111998647
967 2017/12/14 3292.4385 3309.5295 3282.5732 3302.9322 120544235
968 2017/12/15 3266.1371 3287.5292 3259.3883 3287.5292 130940618
969 2017/12/18 3267.9224 3280.5438 3254.1775 3268.0335 120700389
970 2017/12/19 3296.5384 3296.9398 3266.0191 3266.0191 115140134
971 2017/12/20 3287.6057 3300.2124 3276.1201 3296.7403 137745118
972 2017/12/21 3300.0593 3309.2233 3267.4042 3281.1179 142127927
973 2017/12/22 3297.063 3307.3276 3293.4415 3297.6852 124047326
974 2017/12/25 3280.461 3312.2998 3270.4407 3296.2106 146893635
975 2017/12/26 3306.1246 3307.2994 3274.3274 3277.8372 142434501
976 2017/12/27 3275.7828 3307.0798 3270.349 3302.4612 162674890
977 2017/12/28 3296.3847 3304.0962 3263.7282 3272.2913 175371670
978 2017/12/29 3307.1721 3308.2249 3292.7699 3295.2461 141586836

View File

@ -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

View File

@ -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

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 381 KiB

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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 # 合并沿着第二个维度

View File

@ -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]

View File

@ -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

File diff suppressed because one or more lines are too long

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}
});

View File

@ -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
View File

@ -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
View File

@ -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-11 表示非常积极)\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())
'''

View File