
由于 Python 社区将在2020年停止 Python2.7 的支持,在未来我们将逐步停止对 Python2 引擎的更新,所有的新特性也将只在 Python3 引擎上线,所以建议大家将已有策略迁移到 Python3 引擎上。在聚宽官网新创建的策略将默认使用 Python3 引擎创建,用户已有策略仍然使用 Python2 引擎。 一创聚宽将在近期进行升级以支持 Python3 引擎,敬请期待。
聚宽官网Python3版本云端引擎上线
继客户端升级 Python3 之后,聚宽工程师们不懈努力,聚宽官网 Python3 版本的云端回测/模拟交易引擎终于上线啦!新的 Python3 引擎使用与研究模块 Python3 内核相同的环境,大家终于可以在策略中使用心心念念的 TensorFlow 了。
除了更新 Python 版本之外,我们还引入了一系列广受欢迎的第三方库:
机器学习/神经网络库:tensorflow,chainer,keras,pytorch,theano
网络请求:aiohttp,selenium,websocket-client
短信/语音工具:twilio
微信机器人:wxpy
凸优化工具:cvxpy
自然语言处理:nltk
期货基本面数据:fushare
分级基金数据:easyquotation
Python3与Python2的区别
Python3 中严格区分 byte 与 str,例如 pickle.loads 传入的第一个参数若为字符串则会报错;
print 从 Python2 中的关键字转变为了函数,意味着以下写法:print "hello world" 将在 Python3 中报错(正确写法:print(“hello world”));
"/" 在 Python2 返回结果向下取整,在 Python3 中将直接返回结果不进行任何取舍,需要 Python2 中的行为时请使用//。这个有可能导致 Python2 和 Python3 相同策略回测结果不同;
修改了一些语法:metaclass、raise、map、filter以及dict的items/keys/values 方法返回迭代对象而不是列表,描述符协议,保存类属性定义顺序,存关键字参数顺序;
去掉了一些语法:cmp、<>(也就是!=)、xrange(其实就是 range)、不再有经典类;
另外就是 Python2 与 Python3 在回测、模拟等方面的区别。
获取当前持仓标的(Python2 和 Python3 都可以这样使用,期货注意区分多仓和空仓)
# 多仓position = [p for p in context.portfolio.positions]# 多仓position = [p for p in context.portfolio.long_positions]# 空仓position = [p for p in context.portfolio.short_positions]
在回测及模拟交易中读取/写入研究中不同格式的文件
Python2 使用 from six import StringIO ,Python3 使用 from six import BytesIO
详情请查看:
在回测及模拟交易中读取/写入研究中不同格式的文件
有关 Pickle(.pkl文件)
pkl文件和运行环境有关,如何使用 pickle 模块将数据对象保存到文件并在回测中读取
详情请查看:在回测中读取或者写pkl文件
注意:Python2 环境生成的 pkl 文件不能在 Python3 下解析,反之亦然。
Python2 环境与 Python3 环境的区别:
Python3 环境新增第三方库:(节选)

Python3 环境移除的第三方库:

Python3 引擎中版本发生变化的第三方库:注意 Pandas 和 Numpy 的版本变化较大(节选)

常见问题
Q1:如何编写 Python2 与 Python3 都兼容的代码?
A1:使用six模块来兼容 Python2 与 Python3 之间的差异,详情请查看 six项目主页。
Q2:我在 Python2 环境下用 Pickle 保存了对象,在 Python3 环境下我该如何解析?
A2:可以尝试使用如下代码进行解析。由于 Python3 环境与 Python2 环境相比第三方库版本差异较大,若保存的对象依赖这些第三方库,则无法保证解析成功。例如在 Python2 环境下使用 pickle 保存的 DataFrame 对象由于 pandas 库的更改在 Python3 环境下进行解析会报错。注意设置 load 或 loads 函数的 encoding 参数为"latin1"。(Python2 环境下无法解析 Python3 环境中使用 Pickle 保存的对象;)
- 在研究环境下直接解析文件:
import picklewith open('research.pkl', 'rb') aspkl_file:temp =pickle.load(pkl_file, encoding="latin1")
- 在回测/模拟环境下解析研究环境中文件:
import pickletemp =pickle.loads(read_file('research.pkl'), encoding="latin1")
关于 Python3 与 Python2 环境更详细对比,请点击文末阅读原文。同时欢迎各位来提需求~

