VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 187
声望: 59

新的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文件:

 

description

 

可以看到内容全都是不可读的二进制乱码,从而实现了我们需要的代码加密功能。

 

 

一步步学加密

 

尽管听起来有点复杂,Cython的实际操作却非常非常简单,装好工具后只需要一条命令就能完成所有编译工作,所以完全不用紧张,照着下面的傻瓜教程一步步操作就好。

 
 

第一步

 

安装Visual StudioComunity 2017,下载地址:

https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/

 

安装时请勾选“使用C++的桌面开发”,如下图所示:
 
description

 

 

第二步

 

在Python环境中安装Cython,打开cmd后输入运行pip install cython即可:

 

description

 
 

第三步

 
创建一个新的文件夹Demo,把需要加密的策略(如demo_strategy)复制到该文件夹下:

 
description

 

 

第四步

 

在Demo文件夹下,按住“Shift”+ 鼠标右键,点击“在此处打开命令窗口(或者Powershell)”进入cmd,输入以下命令来进行编译:

 

cythonize -i demo_strategy.py

 

随后Cython工具会自动执行C代码的生成和编译工作,输出类似下图中的一系列日志信息:

 

description

 
 

第五步

 
编译完成后,Demo文件夹下会多出2个新的文件,其中就有已加密的策略文件demo_strategy.cp37-win_amd64.pyd:

 
description

 

 

第六步

 
在操作系统的用户目录下(如C:\Users\Administrator\),创建strategies文件夹,用于存放用户自己开发的的策略文件。将上一步生成的demo_strategy.cp37-win_amd64.pyd,放到此处即可运行:
 

description

 

 

第七步

 
启动VN Trader后,进入CTA策略模块即可看到加密后的DemoStrategy策略已经正常识别并加载到了系统中:

 
description

 

了解更多知识,请关注vn.py社区公众号。

description

Member
avatar
加入于:
帖子: 3
声望: 0

你好 加密成功了 但运行到vnpy的代码部分就报错 什么原因 求大佬指点

Administrator
avatar
加入于:
帖子: 4550
声望: 325

阿白ebca998e71f64013 wrote:

你好 加密成功了 但运行到vnpy的代码部分就报错 什么原因 求大佬指点

贴个报错截图看看?

Member
avatar
加入于:
帖子: 3
声望: 0

时间,信息
20:59:10.146,CTA策略引擎初始化成功
20:59:10.144,"策略文件strategies.ai_bi_strategy.cp37-win_amd64加载失败,触发异常:
Traceback (most recent call last):
File ""d:\vnstudio\lib\site-packages\vnpy_ctastrategy\engine.py"", line 817, in load_strategy_class_from_module
module = importlib.import_module(module_name)
File ""d:\vnstudio\lib\importlib__init__.py"", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File ""<frozen importlib._bootstrap>"", line 1006, in _gcd_import
File ""<frozen importlib._bootstrap>"", line 983, in _find_and_load
File ""<frozen importlib._bootstrap>"", line 962, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'strategies.ai_bi_strategy.cp37-win_amd64'; 'strategies.ai_bi_strategy' is not a package
"

加密之后,CTA策略加载时会报错

Administrator
avatar
加入于:
帖子: 4550
声望: 325

加密后,要把pyd文件改名下,移除掉cp37-win_amd64的部分

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】