返回主题列表
【有用功】在回测及模拟交易中读取/写入研究中不同格式的文件
JoinQuant-Supercritical 发布于2018-04-27
回复 68
浏览 18295
179
listen
分享到:
微信
微博
雪球
## 请注意区分Python2和Python3
python2使用six的StringIO,python3使用six的BytesIO
更多有关文件操作的方法请参考[Python的io文档](https://docs.python.org/3.6/library/io.html#io.BytesIO)及[six的文档](https://six.readthedocs.io/)
**投资研究的根目录在哪**
https://www.joinquant.com/research
**如何将本地的文件上传到投资研究**
打开[投资研究](https://www.joinquant.com/research)按照下面的指示完成,上传结束后文件在根目录。
为了保证大家可以正常的使用,我们对文件大小及上传速度有限制,如果文件较大,请使用我们的金融终端在本地研究。
![上传.png][1]
**在回测及研究中读取研究中的文件**
(1)在官网的回测及研究中读取研究中的数据,请参考下面的回测;
**如何在回测及模拟交易中连网获取数据**
(1)我们的回测及模拟支持连网,您可以requests等获取数据;
(2)也可以连您自己的数据库,具体教程参考[如何连数据库](https://www.joinquant.com/post/14048);
**如何获取研究的目录**
![pwd.png][2]
**如何在研究中读取研究中的csv文件**
将csv文件和研究文件放在同一个目录下(不确定的话,直接都放到研究的根目录),直接使用pandas读取
```
import pandas as pd
pd.read_csv('test.csv')
```
**写入研究及读入回测**
```
import pandas as pd
from six import StringIO
# python3使用下面的
# from six import BytesIO
"""
将回测结果写入研究中,csv文件
"""
# 初始化函数,设定基准等等
def initialize(context):
# 写入
df = get_price('000001.XSHE')
write_file('test_df.csv', str(df))
# 读入
df2 = pd.read_csv(StringIO(read_file('test_df.csv')))
print(type(df2))
print(df2)
```
**如何将回测中的数据写到研究中**
```
df = attribute_history('000001.XSHE', 5, '1d') #获取DataFrame表
write_file('from_backtest.csv', df.to_csv(), append=False) #写到文件中
```
在[研究根目录](https://www.joinquant.com/research)查看文件,勾选需要下载的文件,然后在最上面工具栏点击下载
下载文件,由于官网有限制,如果数据量比较多请使用我们的[JQData](https://www.joinquant.com/help/api/help?name=JQData)
![back.png][3]
![xiazai.png][4]
**每天收盘后,将持仓信息持久化到本地**
```
## 收盘后运行函数
def after_market_close(context):
log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
#得到当天所有成交记录
trades = get_trades()
for _trade in trades.values():
log.info('成交记录:'+str(_trade))
df = context.portfolio.positions
write_file('json_test.josn', str(dict(df)))
log.info('一天结束')
log.info('##############################################################')
```
**在Python2回测中读取json文件**
```
from six import StringIO
import json
ans_file = StringIO(read_file('history_rsrs.json'))
df = ans_file.read(ans_file)
print(type(df))
# 将单引号替换为双引号
df = df.replace("'", '"')
df2 = json.loads(df)
print(type(df2))
```
**在回测中写及读取pkl文件**
pkl文件比较特殊,请尽量保证python2的版本一致,[使用pickle模块将数据对象保存到文件并在回测中读取](https://www.joinquant.com/post/11578)
```
import cPickle as pickle
df = get_price('600507.XSHG')
content = pickle.dumps(df) #将数据序列化成pkl格式的字符串
write_file('test.pkl',content) #储存数据
df = pickle.loads(read_file('test.pkl')) #读取字符串形式的pkl文件
print df
```
**在回测中读取h5文件**
```
from keras.models import load_model
from six import BytesIO
with open('temp','wb') as f:
f.write(read_file('model20')) #储存一个临时文件,进程结束后清理
load_model('temp')
print('加载完成')
```

```
Python3回测读取h5文件,方法二
from six import BytesIO
models = tf.keras.models.load_model(BytesIO(read_file('xxx.h5')))
```
**csv中文乱码**
df.to_csv('test.csv', encoding="utf_8_sig")
**有问题可以多试几种编码方式,例如gbk,utf-8等**
[参考](https://www.cnblogs.com/onelikeone/p/7751506.html)

**说明**:
- 参考教程[在回测及模拟交易中读取/写入研究中不同格式的文件](https://www.joinquant.com/view/community/detail/a9f7577b37265f78ffc2c6bb2467d47e)
- 回测或者模拟交易,默认从研究的根目录读取文件;
- 回测或者模拟交易保存的文件也默认在研究的根目录中;
- 不支持excel文件,您可以保存成csv;
[1]: https://image.joinquant.com/3ced8bde5c25b0746eeda395db413483
[2]: https://image.joinquant.com/4460f86c9859de514291ddf37df15ce2
[3]: https://image.joinquant.com/236fe5250e12f92a68c0658b59c201c8
[4]: https://image.joinquant.com/aa04b030f9d686cce873834b2ba3081e
179
listen
分享到:
微信
微博
雪球
评论
JoinQuant-Supercritical
将回测中的数据写入研究中。
df = attribute_history('000001.XSHE', 5, '1d') #获取DataFrame表
write_file('from_huice.csv', df.to_csv(), append=False) #写到文件中
![捕获.JPG][1]
[1]: https://image.joinquant.com/bb0a22b05b567995a6dd24f009a989a1
2018-05-14
JoinQuant-Supercritical
每天收盘后,将持仓信息持久化到本地:
```
## 收盘后运行函数
def after_market_close(context):
log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
#得到当天所有成交记录
trades = get_trades()
for _trade in trades.values():
log.info('成交记录:'+str(_trade))
df = context.portfolio.positions
write_file('json_test.josn', str(dict(df)))
log.info('一天结束')
log.info('##############################################################')
```
实际效果如下图:
![捕获.JPG][1]
[1]: https://image.joinquant.com/526afc2b9e27ce2924688eebd642c326
2018-05-17
JoinQuant-Supercritical
写入沪深300的股票到HS300.stocks.json文件中
```
import json
write_file('HS300.stocks.json', json.dumps(get_index_stocks('000300.XSHG')))
```
```
import pandas as pd
df = read_file('HS300.stocks.json')
print(type(df))
print(df)
print('='*50)
df2= json.loads(df)
print(type(df2))
print(df2)
```
不能序列化的对象可以转换为dict格式再写入。参见上一条。
2018-05-17
vensentzhou
多谢,留下备用
2018-05-17
JoinQuant-Supercritical
```
import pandas as pd
"""
将回测结果写入研究中,csv,Excel文件
"""
# 初始化函数,设定基准等等
def initialize(context):
write_file('test.csv', str(get_index_stocks('000300.XSHG')))
write_file('test.xlsx', str(get_index_stocks('000300.XSHG')))
```
![捕获.JPG][1]
[1]: https://image.joinquant.com/f4840c08f1c6931fada5b3cd6d9fbbf8
2018-06-08
JoinQuant-Supercritical
写入研究及读入回测
```
import pandas as pd
from six import StringIO
"""
将回测结果写入研究中,csv文件
"""
# 初始化函数,设定基准等等
def initialize(context):
# 写入
df = get_price('000001.XSHE')
write_file('test_df.xlsx', str(df))
# 读入
df2 = pd.read_csv(StringIO(read_file('test_df.xlsx')))
print(type(df2))
print(df2)
```
![捕获.JPG][1]
[1]: https://image.joinquant.com/b98d1718340eb99653b1734077a7e479
2018-06-08
gorf
write_file('test.xlsx', str(get_index_stocks('000300.XSHG')))
这句是不对的,写的还是文本文件,只是扩展名是xlsx。
2018-06-11
JoinQuant-Supercritical
pandas.Panel,用什么方法写文件?
df = panel.to_frame()
然后用csv保存就可以了
2018-09-07
JoinQuant-Supercritical
**读取研究中的excel文件**
https://www.joinquant.com/post/3898?tag=algorithm
### 使用xlrd
```
import xlrd
excel_content = read_file("asd.xsl")
excel = xlrd.open_workbook(file_contents=excel_content)
```
### 使用pandas
```
import pandas as pd
from six import StringIO
print pd.read_excel(StringIO(read_file('test.xls')))
```
或者
```
# https://www.joinquant.com/post/15256?replyId=52139#52139
df = pd.read_excel(StringIO(read_file(fileName)),sheetname=curMonth) #读excel
```
2018-09-12
Join Quant - 技术
读取xls/xlsx
```
import pandas as pd
from six import StringIO
print pd.read_excel(StringIO(read_file('test.xls')))
```
文件如何上传?
![daa597d0bd67fff8566d3404ca38444.png][1]
[1]: https://image.joinquant.com/ab84f196bae289cd9735d017dbc8cf93
2018-09-30
yu7788
学习了,make先
2018-11-06
Elvish
在回测中读、写pickle文件
使用pickle.dumps()输出文件至研究、pickle.load()读取研究中的pkl文件
```
import cPickle as pickle
from six import StringIO
import pandas as pd
# 生成文件
a = ['a','b','c']
b = ['o','p','q']
result = {}
score_df = pd.DataFrame(np.zeros(len(a)*len(b)).reshape(len(a),len(b)),\
index = a,columns = b)
result['2017-04-17'] = score_df
score_df = score_df + 1
result['2017-04-18'] = score_df
score_df = score_df + 1
result['2017-04-19'] = score_df
print result
# 输出文件
content = pickle.dumps(result)
write_file(path = 'research.pkl', content = content, append=False)
# 导入文件
pkl_file_read = read_file('research.pkl')
result = pickle.load(StringIO(pkl_file_read))
#打印结果
print result
```
![屏幕快照 2019-01-25 12.00.32.png][1]
[1]: https://image.joinquant.com/1aa4dada3eb5127fcc0531a4e589b66b
2019-01-25
随心-自动人生
每只股票的每天成交量假设是自定义数据,如何写读取成交量的代码?自定义数据的格式是日期,股票代码,成交量
2019-02-09
JoinQuant-Supercritical
@随心-自动人生 可以使用csv格式存储数据,然后读取csv文件即可。
2019-02-09
随心-自动人生
@Supercritical-JoinQuant聚宽 我是可以读取csv了,但是如何把数据对应上?回测时候如何使用?比如回测到某天的时候?如何取到那只股票那天的数据?
2019-02-09
JoinQuant-Supercritical
@随心-自动人生 这些就需要您已经实现了,根据时间判断。也可以在社区发悬赏贴,找其他感兴趣的小伙伴帮您实现。
2019-02-09
zhugq
@Supercritical-JoinQuant聚宽
一直报编码错误,要utf-8 encoded格式,我改成unicode(utf-8) 不行,没其他的格式了?怎么处理这个问题
2019-02-19
zhugq
@Supercritical-JoinQuant聚宽
就是文件上传以后,打开文件报错
2019-02-19
JoinQuant-Supercritical
@zhugq 请发下报错截图,我们查看下。或者新建一个excel文件,把原来的数据复制进去,再上传打开。
2019-02-19
zhugq
![微信图片_20190219110150.png][1]
[1]: https://image.joinquant.com/dc7dae1de071f583b52ceba2ffa55c29
这个报错
2019-02-19
首页
上一页
1
2
3
4
下一页
尾页
您尚未登录,请 登录 或者 注册 聚宽发表回复。
取 消
提 交
关于
关于我们
联系我们
加入我们
数据
指数数据
基金数据
国泰安数据
股票财务数据
金融期货数据
行业概念数据
帮助
常见问题
API文档
Python教程
Python 2 to 3
友情链接
果仁网
关注我们
知乎专栏
雪球
微信公众号
用户协议 | 隐私政策
@2025 @joinquant.com | 京ICP备17068639号-5 | 增值电信业务经营许可证:京B2-20212305
关于
关于我们
加入我们
联系我们
数据
指数数据
基金数据
国泰安数据
股票财务数据
金融期货数据
行业概念数据
帮助
常见问题
API文档
Python教程
@2025 @joinquant.com | 京ICP备17068639号-5 | 增值电信业务经营许可证:京B2-20212305