使用预编译加密你的核心代码

当前的真个量化平台可支持将核心代码预编译成so文件,然后让策略调用的方式,让您的策略核心算法更加安全。这里介绍一下这个方式。

1、下载虚拟机

预编译需要一个和真格量化平台一致的python环境,这里我们直接给您提供一个配置好环境的linux虚拟机。

虚拟机下载地址

https://pan.baidu.com/s/1jIda1MNLR3ARZa6fdTagSQ

提取码 zvsw

2、登录虚拟机

打开VMWare,选择打开虚拟机,找到刚下载解压好的vmx文件打开

图片

图片

用用户pobo登录

用户名 pobo 密码 zhengelianghua

3、启动对应的环境

进入到/home/miniconda3/bin

根据需要编译的python代码版本启动对应环境 source activate pobo_py35胡总和source activate pobo_py27,如果您的策略是3.5就是py35版本,2.7就是py27,范例中采用py35,您可以自行改为py27

如下图

图片

cd /home/miniconda3/bin source activate pobo_py35

4、编译核心代码文件

然后回到工作目录

准备好您需要编译加密的核心代码,范例中的核心代码是一个简单的函数,最新价在20日均线上方则给出多信号(return 1),在20均线下方则给出空信号(return -1),否则不给信号(return 0)

如下

from PoboAPI import * def CalcSignal(code): dyndata = GetQuote(code) if dyndata is None or dyndata.now == 0: log.info('当前%s无行情'%code) return 0 else: hisdata = GetHisDataAsDF(code,BarType.Day,count = 50) hisdata['ma20'] = hisdata['close'].rolling(window = 20).mean() if dyndata.now>hisdata['ma20'].iloc[-1]: return 1 else : return -1

将上述代码保存为zhenge_testso.py

然后准备一个编译用的py文件compile.py

代码如下

from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize(["zhenge_testso.py"])) # 这里写你要加密的程序文件 # 推荐使用相对路径,编译出的so文件在引用其他模块时可能会出现路径问题

将这两个文件放到同一个目录下后,执行以下的shell命令

python compile.py build_ext

图片

执行完成后可以看到当前目录下生成了一个叫build的文件夹,在build/lib.***/文件夹下

有一个zhenge_testso.***.so文件,这就是我们加好密的核心代码文件了。

图片

5、在策略中使用加密的so文件

接下来就是在策略中调用我们刚刚编译好的so文件了。

首先到策略编辑页面,选择上传附件

图片

这里需要注意的是,上传附件文件名最大需要小于40个字符,在范例中,将so文件改名为zhenge_testso.so进行上传

上传后可以在管理附件列表中看到文件

图片

这就表示上传成功了。

然后就可以在策略中进行引入了,这里附上测试策略代码

# coding:utf-8 from PoboAPI import * from zhenge_testso import * #开始事件,用于初始化一些参数 def OnStart(context) : log.info('策略启动...') #登录交易账号,需在主页用户管理中设置账号,并把「回测期货」替换成您的账户名称 context.myacc = None if '回测期货' in context.accounts : log.info('登录交易账号[回测期货]') if context.accounts['回测期货'].Login() : context.myacc = context.accounts['回测期货'] # sayhello() # test2('rb2205.SHFE') def OnMarketQuotationInitialEx(context,exchange,daynight): if exchange != 'SHFE': return SubscribeBar('rb2205.SHFE',BarType.Day) def OnBar(context,code,type): signal = CalcSignal('rb2205.SHFE') if signal == 0: print('无信号') elif signal == 1: print('开多信号') elif signal == -1: print('开空信号')

测试策略结果如下图

图片