请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化平台 帖子:3365825 新帖:0

回测调用研究模块总结(慎用Python3 PacVer 2.0)

谎言梦发表于:5 月 10 日 06:16回复(1)

今天做程序的时候,需要在回测模块调用研究模块生成的数据,出了些问题,查了一下之前的帖子,做了下总结。

关于回测模块调用研究数据的问题,之前有两篇帖子。
(1)打通回测与研究的文件通道 by 止一之路
(2)使用pickle模块将数据对象保存到文件并在回测中读取 by Supercritical-JoinQuant聚宽

结论概述:

1.研究模块采用python2,用write/read_file法存储读取数据。在回测模块就用write/read_file法调用数据,这是可行的。
2.研究模块采用python3,因为python3里面没有cpickle,所以用open法存储读取数据。如果在回测模块继续用open法,那么会报错找不到文件。如果继续使用write/read_file法,则可以读取数据。回头看看python2生产的数据能不能用open法,还是不行。所以,初步得到一个结论,无论是python2还是3, open方法都不好使。
3.研究模块采用python3(PacVer2.0)的话,回测模块用write/read_file法没有用,产生新的错误,自定义库。
总结,慎用python3(PacVer2.0)。

下面是详细的讨论。

从 生产数据的研究模块 和 调用数据的回测模块 两个方面来讨论:

(一)
我们知道回测模块用到的是python2.0,API中提到了write/read_file,这恰好是(1)提到的方法,我称它write/read_file方法。
研究模块用python2.0,调用cPickle和 StringIO,程序如下:
研究p2.png
1.1 那么我们用write/read_file方法在回测模块调用:
回测_p2.png

(二)如果我们研究模块用3.0,因为python3里面没有cPickle,我们我们调用pickle模块,代码如下:
研究p3.png
2.1 这个方法里用到了open,我称它为open方法。
既然用到了open,很自然的,在对应的回测模块中,我用open也可以调用数据么?
回测open.png
报错了~不行。
2.2 如果我们继续使用write/read_file呢?会正常运行。
回测write_p3.png
2.3(1.2) 面对从python3里生产的数据,用open方法不行,对于python2生产的数据可以吗?
回测open_p2.png
初步得到一个结论,无论是python2还是3, open方法都不好使。

(三). 如果我们研究模块用3.0(PacVer2.0),代码如下:
研究_p3v2.png
3.1 我们前面知道了open方法不好使,直接用write/read_file方法吧。
回测_p3v2.png
出现了新的错误,一堆中文。得到的结论就是在研究中用Python3.0(PacVer2.0)的话,回测模块无法调用数据。

后记:
在研究模块,你用python2,3存下来的数,在python3(PacVer2.0)里都没法读取。
说到底,慎用python3(PacVer2.0)。

# Python 3 (PacVer2.0)
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
a = ['a','b','c']
b = ['o','p','q']
result = {}
score_df = 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

#使用pickle模块将数据对象保存到文件
import pickle
pkl_file = open('research_p3v2.pkl', 'wb')
pickle.dump(result, pkl_file, 0)
pkl_file.close()

#使用pickle模块从文件中重构python对象
import pickle
pkl_file = open('research_p3v2.pkl', 'rb')
temp = pickle.load(pkl_file)
pkl_file.close()
temp
{'2017-04-17':      o    p    q
 a  0.0  0.0  0.0
 b  0.0  0.0  0.0
 c  0.0  0.0  0.0, '2017-04-18':      o    p    q
 a  1.0  1.0  1.0
 b  1.0  1.0  1.0
 c  1.0  1.0  1.0, '2017-04-19':      o    p    q
 a  2.0  2.0  2.0
 b  2.0  2.0  2.0
 c  2.0  2.0  2.0}
 

全部回复

0/140

量化课程

    移动端课程