发布于vn.py社区公众号【vnpy-community】
原文作者:何若楠 | 发布时间:2023-08-02
社区有不少新接触VeighNa的同学咨询如何上手学习,这里推荐下官方团队推出的小鹅通线上课程:《零基础入门系列》覆盖【Python基础】、【数据分析】、【GUI开发】三阶段,适合有金融背景的编程小白快速建立自己的Python开发知识体系;《全实战进阶系列》则针对具体的量化策略应用,适合有开发背景的金融小白通过实践来迅速掌握量化投研能力,包括【CTA实战】、【超越海龟】、【期权入门】和【投组策略】。
PyCharm是由JetBrains公司推出针对Python语言的IDE,其内置一整套可以帮助用户在使用Python语言开发时提高其效率的工具。本文意在为用户提供通过PyCharm开发使用VeighNa的方案以供参考。
本中的内容基于Windows系统编写,但对于Linux和Mac系统大部分也都适用。
当前时点,VeighNa适用的Windows系统包括:
- Windows 10/11
Windows Server 2019/2022
其他版本的Windows系统安装时可能遇到各种依赖库问题,不推荐使用。
在Windows系统上使用VeighNa,推荐安装官方推出的【VeighNa Studio】Python发行版,尤其是初次接触Python开发的新手用户。
PyCharm安装
首先从PyCharm官网下载PyCharm Community安装包:
下载完成后,双击安装包则可进入PyCharm安装向导:
如果想对安装选项进行设置,可以在PyCharm Community Edition Setup页面对相关选项进行勾选:
安装完成后,会跳转到安装成功页面:
如果前面勾选了Create Desktop Shortcut选项来创建桌面快捷方式的话,此时桌面上会出现PyCharm的图标,双击图标即可运行PyCharm。
VeighNa开发
创建项目
启动PyCharm之后,在弹出的欢迎界面中点击【New Project】创建新项目,如下图所示:
在弹出的新项目窗口中,首先需要选择存放项目的文件夹路径【Location】,然后勾选Python解释器选项中的【Previously configured interpreter】选项(即当前系统中已经安装的Python环境):
点击右侧Add Interpreter下拉框中的【Add Local Interpreter】,在弹出的对话框中点击左侧的【System Interpreter】标签,并在右侧出现的下拉框中选择VeighNa Studio自带Python解释器所在的路径:
点击底部的【OK】按钮保存解释器配置,回到新项目窗口中,点击右下方的【Create】按钮来完成新项目的创建:
创建成功的项目窗口如下图所示:
此时点击左上方的【External Libraries】,即可看到项目中可以调用的外部库:
点击site_packages文件夹,往下滚动就能找到VeighNa Studio中的vnpy核心框架包以及vnpy_前缀的插件模块包。此时可以通过点击对应图标来查看每个包中的文件源码,如下图所示:
把鼠标光标移到代码上方,会自动弹出对应代码的文档信息:
若按住Ctrl键的同时用鼠标左键点击代码,则会跳转到代码的声明部分:
点击窗口右下角的【Python 3.10】按钮,会弹出【Settings】项目配置窗口,可以看到当前解释器环境下安装的包名称和版本号信息。带有升级符号(向上箭头)的包,说明当前版本有更新版本,点击升级符号即可自动升级。
请注意:由于VeighNa对于部分依赖库有严格的版本要求,不建议用户手动升级安装的包,可能会出现版本冲突。
运行程序
从Github代码仓库下载VeighNa Trader启动脚本文件run.py,并将其放置于trader文件夹下,即可在窗口左侧的项目导航栏中看见run.py文件:
若部分代码下方可以看见绿色波浪线显示(变量名称英文词语检查),可以点击项目名称左方的主菜单按钮 -【File】-【Settings】-【Editor】-【Inspections】-【Proofreading】,取消【Typo】的勾选后点击【OK】确认。再回到主窗口,可以发现绿色波浪线已经消失:
点击鼠标右键,选择【Run 'run'】,即可开始运行run.py脚本:
此时在界面底部的终端内容输出区域中,可以看到程序运行时的打印信息:
与此同时,VeighNa Trader的主窗口也会自动弹出显示:
回到PyCharm,可以看到项目界面右上角已经有run脚本的运行记录了,后续直接点击三角形运行按钮也可运行脚本,如下图所示:
断点调试
PyCharm的断点调试功能十分强大,这里使用一个VeighNa的策略历史回测脚本来演示。
在左侧项目导航栏中点击鼠标右键,选择【New】-【File】, 在弹出的对话框中创建backtest.py:
然后在文件中编写简单的策略回测代码(具体可参考Github仓库中的回测示例),在想要调试的地方打上断点,如下图所示:
点击鼠标右键选择【Debug 'backtest'】, 即可开始调试脚本:
此时项目界面右上角已经可以看到backtest.py的运行记录,后续也可以通过点击这里的按钮直接启动调试任务:
启动调试后,可以看到主界面底部的Debug窗口开始输出程序运行信息,并且程序会暂停运行在第一个断点处。左侧显示的是线程信息,右侧则是当前上下文中的变量信息:
点击类似播放键的【Resume Program】即可继续运行调试,直到下一个断点处再次暂停:
此时可以看到底部右侧监控窗口中,当前上下文中的变量发生了变化:
后续重复上述步骤,点击【Resume Program】直到调试结束,可以看到Debug窗口的相应输出:
调试完之后,点击【Rerun 'backtest'】即可重新调试:
在调试过程中,点击【Step Into】可以进入函数的内部查看运行时的细节状态:
点击【Step Out】则可跳出当前函数,查看外层调用栈的状态:
点击【Step Over】可越过子函数(子函数会执行):
点击【Stop 'backtest'】则会直接停止当前程序的运行:
指定程序的运行目录
在PyCharm中新建项目时,默认是在当前目录下运行程序。若需要指定程序运行的目录,可以点击项目界面右上角的【Edit】进入【Run/Debug Configurations】界面:
修改程序启动时的目录【Working directory】即可:
C++回调断点调试
通常情况下,PyCharm只能在Python解释器中启动的线程里进行代码断点调试。之前有部分用户反馈过尝试在C++回调函数(如CTP API接口、PySide图形库等)中打断点但无法起效的问题。针对这种情况,可以通过在代码中设置断点的方式,来实现对非Python线程(即C++线程)的断点调试。
在项目左侧导航栏中点击鼠标右键,选择【New】-【File】, 创建geteway_test.py。
在创建成功的geteway_test.py中添加一段脚本策略的代码(可参考该文件),然后按住Ctrl同时用鼠标左键点击代码中的CtpGateway,跳转至ctp_gateway.py的源码中,在想要调试的回调函数内打上断点(注意不要打在函数定义的def那一行),如下图所示:
回到gateway_test.py,点击鼠标右键选择【Debug 'gateway_test'】开始调试:
请注意,如果用load_json函数读取connect_ctp.json,请确保读取对应.vntrader文件夹的json文件中配置了CTP账户登录信息。
此时可观察到并没有进入之前设定的断点,如下图所示:
终止调试后,找到之前在ctp_gateway.py中设定的断点处,在回调函数内的断点之前添加以下代码:
import pydevd
pydevd.settrace(suspend=False, trace_only_current_thread=True)
请注意:
- pydevd是PyCharm自带的调试插件,没有安装在Python解释器所在的Python环境里;
- suspend参数设置为True之后,调试会在这一句代码运行完之后暂停,而不是停在断点处。trace_only_current_thread参数设置为True之后,调试过程中只会监控当前线程;
- 调试结束之后不要忘记删掉这段代码。
然后再次运行调试gateway_test.py脚本:
此时可以看到底部的调试窗口中开始输出相关信息,同时程序暂停在了之前设置的断点处。左侧显示的是线程信息(可以看到多了一个Dummy线程显示),右侧显示的是变量信息(可以看到回调函数的入参):
对比VS Code
- 在PyCharm中,每个项目都需要对Python环境进行配置。在VS Code中,默认通过窗口右下角的Python解释器来选择全局的Python环境(针对所有打开的文件);
- PyCharm的Community版仅对Jupyter提供了只读支持,需要Professional版才能编辑和运行。VS Code仅需安装功能插件,就可以使用和Jupyter相关全部功能(包括读取、编辑、运行)。