【有用功】在回测及模拟交易中读取/写入研究中不同格式的文件

【有用功】在回测及模拟交易中读取/写入研究中不同格式的文件

返回主题列表

【有用功】在回测及模拟交易中读取/写入研究中不同格式的文件

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('加载完成')

```

![Img]( https://image.joinquant.com/75dbc420d8981469a14dc3cd4870e13f)

```

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)

![Img]( https://image.joinquant.com/9d5806f61688ab5986fc5765daf0ae38)

**说明**:

- 参考教程[在回测及模拟交易中读取/写入研究中不同格式的文件](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

相关典藏

[香水] CK one summer 2015夏季限定版 中性淡香水
365bet网站平台

[香水] CK one summer 2015夏季限定版 中性淡香水

📅 08-13 👁️‍🗨️ 4837
世界第14倒下!主力与球迷互殴,11人或遭禁赛,世预赛不能踢了
365bet亚洲娱乐场

世界第14倒下!主力与球迷互殴,11人或遭禁赛,世预赛不能踢了

📅 07-15 👁️‍🗨️ 2716
如何在linux上编程c语言
365bet365游戏

如何在linux上编程c语言

📅 08-21 👁️‍🗨️ 7723