新的vn.py社区论坛已经上线差不多大半年的时间,许多社区用户都贡献了非常高质量的量化交易相关内容。接下来我们计划每周整理一篇论坛中的精华文章,制作为一个《vn.py社区精选》系列。
每篇文章我们会先争得作者的转载同意,同时支付200元的稿费。稿费金额数字不大,更多是对每位作者为vn.py社区做出贡献的一份感谢,也欢迎大家在论坛上更多分享自己的使用经验!
为什么要加密?
从执行方式上,编程语言可分为2类,编译型语言和解释型语言:
- 编译型语言(如C++等),在程序执行之前,会先通过编译器对程序源代码执行进行编译,将其转变为机器语言后(如.dll 或者.exe),再由机器语言负责最后的运行操作;
- 解释型语言(如Python等),则省去了编译的过程,而是选择在程序运行的时候,通过解释器对程序逐行做出解释,然后直接运行。
尽管在分类上属于解释型语言,Python在实际运行时为了提高效率,同样会先从源代码(py文件)编译为字节码文件(pyc文件),而后在运行时通过解释器再来解释为机器指令执行。第二次运行该Python文件时,解释器会在硬盘中寻找到事先编译过的pyc文件,若找到则直接载入,否则就重新生成pyc文件。
但无论是py文件还是pyc文件,都有极高的风险泄露源代码:
- py文件:Python程序的可读源代码;
- pyc文件:作为字节码,可以通过某些工具(如uncompyle6)还原为.py文件。
无论是谁,都不会希望自己辛辛苦苦开发的量化策略被任何第三方窃取,因此自然而然就产生了对策略文件进行加密的需求:对py文件加密,生成可以正常加载运行,但无法被反编译的pyd文件(在Linux上为.so文件)。
解决方案Cython
作为Python语言的子集,Cython主要被用来解决Python代码中的运行效率瓶颈问题,如numpy底层的矩阵运算加速,期权的实时定价模型等等。
除了加速功能外,Cython也提供了一整套Python语言的静态编译器,可以将Python源代码转换成C源代码,再编译成pyd二进制文件(本质上是dll文件)。
尝试用VSCode打开一个编译生成的pyd文件:
可以看到内容全都是不可读的二进制乱码,从而实现了我们需要的代码加密功能。
一步步学加密
尽管听起来有点复杂,Cython的实际操作却非常非常简单,装好工具后只需要一条命令就能完成所有编译工作,所以完全不用紧张,照着下面的傻瓜教程一步步操作就好。
第一步
安装Visual StudioComunity 2017,下载地址:
https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/
安装时请勾选“使用C++的桌面开发”,如下图所示:
第二步
在Python环境中安装Cython,打开cmd后输入运行pip install cython即可:
第三步
创建一个新的文件夹Demo,把需要加密的策略(如demo_strategy)复制到该文件夹下:
第四步
在Demo文件夹下,按住“Shift”+ 鼠标右键,点击“在此处打开命令窗口(或者Powershell)”进入cmd,输入以下命令来进行编译:
cythonize -i demo_strategy.py
随后Cython工具会自动执行C代码的生成和编译工作,输出类似下图中的一系列日志信息:
第五步
编译完成后,Demo文件夹下会多出2个新的文件,其中就有已加密的策略文件demo_strategy.cp37-win_amd64.pyd:
第六步
在操作系统的用户目录下(如C:\Users\Administrator\),创建strategies文件夹,用于存放用户自己开发的的策略文件。将上一步生成的demo_strategy.cp37-win_amd64.pyd,放到此处即可运行:
第七步
启动VN Trader后,进入CTA策略模块即可看到加密后的DemoStrategy策略已经正常识别并加载到了系统中:
了解更多知识,请关注vn.py社区公众号。