发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2023-04-28
本周发布了VeighNa的3.7.0版本,本次更新的主要内容是增加了量化交易容器解决方案VeighNa Docker,为Linux和Mac系统用户提供类似VeighNa Studio的快速安装部署功能。
在此首先要对社区用户【eis】表示感谢!正是他在社区论坛中分享的xhost图形界面输出方案,帮助我们找到了如何基于Docker容器运行GUI程序的技术方向。
对于已经安装了VeighNa Studio的用户,可以使用快速更新功能完成自动升级。对于没有安装的用户,请下载VeighNa Studio-3.7.0,体验一键安装的量化交易Python发行版,下载链接:
https://download.vnpy.com/veighna_studio-3.7.0.exe
开始正文内容之前想要说明下:对比VeighNa Studio,使用VeighNa Docker需要掌握更高水平的开发技术知识,并不一定适合所有用户。
这里梳理一些VeighNa Docker适合的应用场景:
如果你有上述需求,那么强烈推荐继续往下看。
从互联网上普遍能搜索到的描述定义来看,Docker是一套开源的应用容器引擎,采用操作系统级别的虚拟化技术来对【软件应用】及其【依赖的运行时环境】进行打包,并将打包完成的轻量级容器快速部署到各种不同环境中高效运行。
看完这段有点绕口的文字,不知道大家的感觉如何?反正当我第一次接触Docker的时候挺晕的,所以这里试着通过类比的方式来帮大家更加容易地理解。
不管是投研回测还是实盘交易,想要成功运行起来一个VeighNa量化平台的程序,必须确保当前的系统上已经安装好了:
上述三块内容中,3就是前文中的【软件应用】,而1和2加在一起则是【依赖的运行时环境】。那么为了实现这三块内容的快速安装部署,在Windows系统上的解决方案就是VeighNa Studio,运行exe安装包后几次点击就能自动完成整个安装流程。
由于Linux系统上软件安装方式的区别:例如系统自带Python(影响1)、底层依赖库的全局影响(影响2)等,导致无法直接照搬VeighNa Studio的方案,更好的选择是采用类似虚拟机的形式将1-3整体打包后进行分发部署(直接不用安装了)。
在还没有VeighNa Studio的1.0版本时代,我们就曾经推出过基于VirtualBox的虚拟机镜像,但大家用下来普遍反馈虚拟机对比实体机的性能损耗还是挺明显。背后的原因可以参考上图的右侧部分,虚拟机中的应用程序和底层硬件中间,隔着有Hypervisor(虚拟硬件层)和Guest OS(虚拟机内系统)两层组件,带来了显著的开销(分钟级的启动耗时)。
2013年发布的Docker带来了更加轻量级的方案。参考上图的左侧部分,在宿主机的操作系统上仅需运行Docker守护进程来负责对Docker容器进行运维管理,省去了臃肿的虚拟机内系统,从而实现更高的运行效率:节省大量系统资源、毫秒级的启动耗时、接近原生运行的性能水平。
本次3.7.0版本中新增的VeighNa Docker,就是打包了Python解释器、底层依赖库和VeighNa量化平台的完整量化容器镜像,仅需几行命令就能实现自动下载和运行启动。
运行Docker容器之前需要先安装Docker引擎,这里重点介绍在Linux(Ubuntu 22.04)服务器上的安装流程,不清楚的地方推荐参考官方文档中的安装教程。
1. 卸载移除老版本程序:
sudo apt-get remove docker docker-engine docker.io containerd runc
2. 更新apt源并安装HTTPS访问所需的库:
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg
3. 添加Docker官方的GPG Key:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
4. 设置添加apt仓库:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5. 再次更新apt源:
sudo apt-get update
6. 安装Docker引擎等组件:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7. 运行hello-world镜像验证安装成功:
sudo docker run hello-world
8. 安装xhost的运行依赖程序:
apt-get install x11-xserver-utils
9. 启动xhost(注意该命令每次重启系统后都要运行):
xhost +
对于Windows和Mac系统用户直接从Docker官网下载安装Docker Desktop即可,Windows上推荐启用WSL2环境。
完成Docker引擎的安装配置后,运行VeighNa Docker就相当简单了。
在用户目录下创建一个空文件夹(这里假设为/home/user/trader),在其中放置run.py启动脚本文件,内容为:
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy_ctp import CtpGateway
from vnpy_ctastrategy import CtaStrategyApp
from vnpy_ctabacktester import CtaBacktesterApp
def main():
"""Start VeighNa Trader"""
qapp = create_qapp()
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.add_app(CtaStrategyApp)
main_engine.add_app(CtaBacktesterApp)
main_window = MainWindow(main_engine, event_engine)
main_window.showMaximized()
qapp.exec()
if __name__ == "__main__":
main()
然后在终端Terminal中运行下述命令:
docker run \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /home/user/trader:/home \
veighna/veighna:3.7 python3 run.py
如果是第一次运行,Docker引擎会自动从Docker Hub网站上下载拉取veighna/veighna:3.7镜像(大约几分钟的时间,取决于网络带宽),并在下载完成后直接启动容器,此时就可以看到熟悉的VeighNa Trader界面了:
尽管容器和虚拟机在底层实现上有着挺大区别,但是对于其中运行的程序来说整体环境相当类似,在容器中同样存在运行程序时的默认用户目录/home。
运行docker run命令时,我们通过参数【-v /home/user/trader:/home】,将之前在操作系统中新建的/home/user/trader(包括其中的文件)挂载到了容器内的/home目录下,从而保证在容器内运行【python3 run.py】命令时能够成功找到run.py文件。
在VeighNa Trader的运行过程中,临时文件(JSON配置文件、SQLite数据库文件等)会被写入到容器内的/home/.vntrader文件夹中,由于前面的挂载机制等同于外部系统中的/home/user/trader/.vntrader文件夹。该文件夹中的内容即使关闭Docker容器后也依旧存在,从而满足程序运行过程中的数据持久化需求。
目前VeighNa Docker中已经打包的模块包括:
交易接口
策略应用
数据库适配器
数据服务接口
投研环境
除了上文中展示的VeighNa Trader外,VeighNa Docker还支持更多其他的运行方式,例如Jupyter Lab交互式投研环境、VS Code容器内代码开发、no_ui交易服务运行等,我们将会在后续的文章中详细讲解,欢迎关注。
发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2023-04-19
近几个月,可能许多VeighNa社区用户或多或少都听过了【VeighNa Elite】或者【VeighNa菁英版】的名字(下文简称Elite版)。经过半年多的迭代打磨,Elite版已经于3月底正式发布上线,在此对之前参加内测的用户表示衷心感谢。
作为面向专业交易员推出的量化交易终端产品,Elite版在开源版VeighNa量化平台的基础上针对性能、功能和稳定三个方面做出了许多优化:
具体的优化细节将会在下文中介绍,这里也对VeighNa量化平台现有的三层产品体系做个简单的梳理:
由于Python的GIL全局锁限制,VeighNa平台在单进程的情况下仅能利用CPU单核的算力,所以通常建议开源版中每个VeighNa进程运行CTA策略的数量在20-50的范围内(具体取决于CPU主频和策略计算开销),超过该范围后可能造成Tick-2-Trade延时出现显著的增加。
尽管nogil项目已经被提上了Python 3.12的开发计划,但具体发布时间还有挺大的不确定性。为了在保证Tick-2-Trade延时的情况下,尽可能满足专业交易员在策略并发数量上的需求,Elite版采用了类似Chrome浏览器的多进程架构设计:
通过将开销较大的计算逻辑拆分到独立进程的方式,实现对当今多核心CPU算力的充分利用,并且在系统核心引擎层的算法性能方面也进行了优化:
在使用体验上,Elite版保持了和开源版高度一致的客户端运行模式,双击桌面图标即可直接启动运行,对于老用户来说可以几乎无感上手,而无需担心服务端系统(定制版)中较为繁琐的专业化运维流程。
之前有不少社区用户提交过围绕国内市场专有行情和交易规则的代码修改PR(如非交易时段的Tick过滤、K线合成器对商品期货上午15分钟休息的处理等),但由于前文提到开源版对于各类金融市场的广泛覆盖,这些PR并没有合并到开源仓库中,而是保留在了论坛帖子里供有需要的用户自行学习修改。
作为面向专业交易员的Elite版,覆盖范围上聚焦在三大主流量化市场(期货、期权、证券),因此策略引擎层面也做了相应的适配调整(如基于品种交易时段配置文件的行情Tick过滤等)。
在策略开发方面,Elite版也提供了许多额外的功能:
Elite版中整合了标准化算法交易功能,用户可以直接在主界面快速启动算法执行各种智能化的交易任务:
通过位于数据监控区域的算法监控组件,可以直观跟踪当前算法的执行状态,并支持随时【暂停】或者【停止】:
现有版本中已经提供AlgoTrading模块中的被动类算法,后续也计划接入其他三方算法供应商提供的主动类算法,满足更多专业交易员场景下的执行需求。
对于许多使用VeighNa开源版运行CTA策略交易的用户来说,每当遇到主力合约切换的交易日都要经历一段比较麻烦的操作,整体上要完成的四个步骤包括:
尽管在CTA策略模块中提供了【移仓助手】功能,但每次只能执行一个合约上的移仓操作,且采用的同步下单模式有时会出现移仓瘸腿或者滑点较大的情况。
基于多进程的系统架构,Elite版重新实现了【移仓助手】功能,支持多合约批量并发移仓任务。同时采用价差算法来执行移仓交易,用户可以自行设置每个合约上的移仓数量和委托上限等参数,有效避免移仓中的瘸腿情况并降低整体的滑点成本。
开始移仓任务前,会自动弹出确认执行移仓信息的对话框,方便检查各参数是否设置正确,避免误操作的风险:
对于专业交易员群体中普遍的多账户交易需求,Elite版提供了完善的功能支持。用户可以在登录启动程序时,加载多个VeighNa交易接口并配置对应的交易账号,每个接口可以指定自定义名称,方便在交易过程中的监控识别。
Elite版同时也提供了【多账户批量下单】功能,用户可以根据需求任意创建下单账户组合,并为组合中的每个账户分配独立的下单比例,满足不同资金水平和风险偏好下的多账户交易需求:
在围绕订单流交易(Order-Flow Trading)的领域,【市场深度交易下单】是一种广为使用的交易功能,在不同软件中的名字出入可能比较大:
整体上看,深度交易的核心功能包括:
Elite版当前已经支持单合约的深度交易,后续计划增加对价差交易(SpreadTrading)中的价差组合支持。
目前Elite版仅作为【VeighNa Elite会员服务】的专属权益提供,其他会员权益包括:
Elite会员服务的年费价格为9999元,感兴趣的同学可以直接扫描下方二维码,或者点击公众号菜单栏的【社区交流】->【Elite会员服务】:
职位名称
T0交易员
职位职责
职位要求
其他信息
职位名称
金融销售
职位职责
职位要求
其他信息
薪资范围10-15K,缴纳五险一金,具体面谈
联系方式
张女士 18116244272
工作地点
上海
发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2023-3-31
2023年第3场VeighNa社区活动开始报名,本场活动将在上海举办,分享主题是【HFT证券统一接入交易网关应用】。
本场活动提供20个线下名额,报名优先对机构量化从业人员开放,感兴趣的同学不要错过!
内容:
统一接入交易网关介绍
Python版API开发实践
量化策略相关应用场景
QA问答和交流环节
时间:4月22日 14:00-17:00
地点:上海
报名费:99元(Elite会员免费参加)
报名方式:扫描下方二维码报名,报名时请填写手机号并注明线上还是线下参加!
发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2023-3-30
上篇文章展示了RUMI策略在rb99.SHFE上的初步回测绩效,跑通了策略回测下一步自然就是参数优化。
《海龟交易法则》这本书的参数优化章节中提到,传统上使用较多的总收益率(total_return)、收益回撤比(return_drawdown_ratio)、夏普比率(sharpe_ratio)等指标,由于其计算公式中过度依赖【起始】和【结束】两个点的数值,导致其用于策略绩效评估中的【稳健性略有不足】。
这里用图例来说明,下图中的紫色实线为某一策略的回测资金曲线:
绿色和红色两条虚线,分别为选取不同的起始和结束时间点后,体现出的策略整体收益情况。对于同样一条资金曲线,仅仅由于所选时间段的区别,就造成了虚线斜率(总收益率,同时影响收益回撤比和夏普比率计算中的分子)相当显著的偏差,在参数优化中也就更容易导致【过度拟合】的问题。
搞清楚了问题所在,解决方案也十分简单:就是让整条资金曲线上更多的数据点能够参与斜率的计算。经典方法之一就是统计学中的线性回归(Linear Regression),体现为上图中的这条蓝色虚线,相对更能够代表策略的长期收益情况。
围绕这一思路,《海龟交易法则》的作者柯蒂斯提出了【R-Cubed】稳健优化指标:
VeighNa Elite版的CTA回测引擎中内置了R-Cubed统计指标,基于其对RUMI策略在rb99.SHFE的2010-2019时间段上进行优化后(结合使用广域遗传和分组穷举),得到的策略参数为:
以此在2010至2023年初的回测结果即为上一篇的封面图:
上一篇文章发布后,有同学反馈担心使用99这种进行了平滑处理的指数会导致结果失真,这里使用过去一年三个具体主力合约和99的回测结果做一个对比(策略参数均使用上一步优化结果):
可以看到rb2205和rb2209的绩效统计指标要好于同期的rb99,而rb2301上则差于同期的rb99,但整体还是保持了较为明显的一致性。
除了螺纹钢rb以外,我们也在其他一些品种上尝试了RUMI策略。这里我们使用2017年至2023年2月(6年多)的数据来作为总数据集,选择从2017年1月到2020年6月作为样本内进行参数优化,然后使用2020年7月至2023年2月作为样本外进行检验。
为了节约文章长度,以下回测图表和统计指标均为总数据集上的结果:
回测参数:
交易成本
策略参数
bar_window: 25
bar_interval: "1m"
bar_buffer: 204
fast_window: 2
slow_window: 10
rumi_window: 40
stop_percent: 0.04
max_holding: 100
risk_window: 20
risk_capital: 100_000
回测参数:
交易成本
策略参数
回测参数:
交易成本
策略参数
至此我们围绕RUMI策略的研究告一段落。作为一套流传甚广的CTA策略,RUMI策略的核心逻辑体现出了量化研究中典型的【渐进式优化】特征:站在前人肩膀上(均线金死叉)迈出新的一步(过滤均线缠绕),从而实现更好的风险收益比。
今年接下来的时间里【Elite量化策略实验室】系列会持续更新,努力为大家带来更多量化策略深入解析。
VeighNa Elite已于本周正式上线发布1.0.0版本,目前对量化私募机构的投研人员提供一个月免费试用,感兴趣的同学请扫码添加小助手:
免责声明
文章中的信息或观点仅供参考,作者不对其准确性或完整性做出任何保证。读者应以其独立判断做出投资决策,作者不对因使用本报告的内容而引致的损失承担任何责任。
发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2023-03-15
看到标题,可能许多VeighNa社区的老用户已经猜到了内容。
2021年底上海量贝信息科技有限公司(简称“量贝公司”)通过知乎、简书、QQ群、量贝公司官网各种公开渠道对我司(微信 18391752892)进行攻击和诽谤,无端指责我司从事“金融违法行为”以及“剽窃知识产权”,量贝公司更是向证监会举报我司从事“金融违法行为”,继而在毫无凭证、证据的情况下凭空捏造、污蔑我司被证监会“查处”。
我司本不予理会这些无端攻击,正常从事经营,怎奈量贝公司及其实际控制人王登高看到我司未做回应,继续肆无忌惮的造谣、诽谤和攻击我司及我司法定代表人陈晓优。我司及我司法定代表人随即委托律师发起了对量贝公司的名誉侵权(网络侵权责任纠纷)法律诉讼,包括:
经过一年左右的时间,我们终于等到了两起诉讼的一审判决结果:
经法院查明,证监部门并未对原告(韦纳公司及陈晓优)作出过行政处罚。
且法院认为,被告量贝公司的评论内容(包括但不限于非法金融,剽窃代码等)均为其推测和臆断,极易引发网络不特定人员对原告(韦纳公司及陈晓优)产生$,主观过错明显,构成对原告(韦纳公司及陈晓优)名誉权的侵害。
故法院判令被告量贝公司停止侵权、删除攻击原告陈晓优的评论和链接、公开向韦纳软件和陈晓优赔礼道歉以及支付部分经济赔偿。
以下是法院的民事判决书链接:
目前我司法定代表人陈晓优对量贝公司的诉讼,量贝公司不服浦东新区人民法院(2022)沪0115民初32589号民事判决,已经提起二审上诉,我们对于任何恶意侵犯公司及公司法人名誉的行为,将会奉陪到底。
过去的一年里,我们得到了诸多来自VeighNa开源社区的朋友、上海正策律师事务所、公司内部团队的支持和帮助,在此表示由衷的感谢。
虽然2022年的整体开发进度受到了不少影响,但我们依然会继续坚持【开源量化交易平台】的核心方向,不忘初心努力为大家带来更加优秀的产品和服务!
发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2023-3-1
VeighNa平台面向专业量化交易用户的Elite(菁英版)从2022年10月开始内测以来,经过5个月时间的迭代目前已经到了0.9.0版本,预计将在3月底之前正式上线发布。
前期VeighNa Elite在开发上主要专注于交易系统性能方面的优化,如:
后续根据内测用户的反馈,开始增加交易和策略相关的功能扩展,交易方面的内容包括:市场深度委托、多账户组合交易、标准化执行算法等。策略方面推出的则是更加针对量化私募机构策略开发需求的EliteCtaStrategy和ElitePortfolioStrategy模块。
翻了下公众号的历史记录,【VeighNa量化策略实验室】系列的上一篇文章更新已经是2021年9月的事情。时隔一年半再次回归,升级为基于VeighNa Elite版的【Elite量化策略实验室】,同样希望能够在量化策略研究方面给大家带来更多的灵感。
本文分享的RUMI策略来自于VeighNa社区用户推荐的互联网资料,原作者已经很难确定,甚至我们连RUMI具体是什么的缩写也不清楚(如果有知道的欢迎评论区留言)。
为了吊起大家的胃口,先来看一下螺纹钢期货上经过各种细节优化的结果:
移动平均线(Moving Average)作为一种大家非常熟悉的技术指标,由于其非平稳性时间序列的特征(即均值并不围绕固定中枢波动),本身并不适合作为CTA策略的核心信号使用。
而简单的使用双均线金死叉作为交易信号,尽管能够在大趋势中捕捉相当一部分行情,但在均线缠绕出现的震荡类行情中则会遭遇来回打脸的问题。
因此RUMI策略采用了对均线偏离度平滑处理的方式,来更好的识别趋势机会:
有了RUMI指标后,交易信号则是十分简单:
看到这里不难发现,本质上RUMI策略是对传统均线金死叉(即DIFF上下穿0轴)信号的一种优化,通过平滑处理的方式降低DIFF的敏感度来解决均线缠绕的问题。
本文中的RumiStrategy采用EliteCtaStrategy模块下的策略模板类EliteCtaTemplate开发,用户可以直接通过基础参数来配置策略运行的K线数据周期(无需再创建和维护BarGenerator进行合成):
class RumiStrategy(EliteCtaTemplate):
"""RUMI策略"""
author = "VeighNa菁英版"
# 基础参数(必填)
bar_window: int = Parameter(1) # K线窗口
bar_interval: int = Parameter("1m") # K线级别
bar_buffer: int = Parameter(100) # K线缓存
在定义策略的参数和变量时,可以分别使用Parameter和Variable辅助类来创建,无需再手动添加字段名称到parameters和variables列表中:
# 策略参数(可选)
fast_window: int = Parameter(3) # 快速均线窗口
slow_window: int = Parameter(50) # 慢速均线窗口
rumi_window: int = Parameter(30) # 均线偏差窗口
max_holding: int = Parameter(100) # 持仓周期上限
stop_percent: float = Parameter(0.03) # 保守止损比例
risk_window: int = Parameter(10) # 风险计算窗口
risk_capital: int = Parameter(1_000_000) # 交易风险投入
price_add: int = Parameter(5) # 委托下单超价
# 策略变量
trading_size: int = Variable(1) # 当前委托数量
rumi_0: float = Variable(0.0) # RUMI当前数值
rumi_1: float = Variable(0.0) # RUMI上期数值
EliteCtaTemplate提供了新的on_history回调函数,用于推送已经合成完毕且缓存为时间序列的K线数据容器HistoryManager:
def on_history(self, hm: HistoryManager) -> None:
"""K线推送"""
# 计算均线数组
fast_array: ndarray = sma(hm.close, self.fast_window)
slow_array: ndarray = wma(hm.close, self.slow_window)
# 计算均线差值
diff_array: ndarray = fast_array - slow_array
rumi_array: ndarray = sma(diff_array, self.rumi_window)
self.rumi_0 = rumi_array[-1]
self.rumi_1 = rumi_array[-2]
# 判断上下穿
long_signal: bool = cross_over(rumi_array, 0)
short_signal: bool = cross_below(rumi_array, 0)
由于采用了连续内存区域分配,HistoryManager可以提供比开源版ArrayManager更快的数据更新和计算效率,且支持快速转换为Pandas的DataFrame对象。当用户收到on_history推送时,HistoryManager对象中的K线缓存数据固定为bar_buffer长度,用户无需再额外进行条件判断检查数据满足长度要求。
除了封装TA-Lib中的指标计算函数外,EliteCtaStrategy模块中还额外提供了类似cross_over/cross_below的常用条件判断和逻辑运算函数。
根据市场波动对交易仓位进行动态管理的技术,能够有效平滑资金曲线波动和提高整体夏普比率,随着海龟策略体系的普及在CTA策略中被广泛应用(具体细节在《超越海龟策略精析》课程中有详细讲解)。
# 计算交易数量
self.trading_size = self.calculate_volume(self.risk_capital, self.risk_window, 1000, 1)
这里通过调用EliteCtaTemplate所提供的calculate_volume函数,传入交易风险资金risk_capital、风险评估窗口risk_window、委托数量上下限(1000、1)参数,快速计算当前市场情况下合适的交易委托数量。
考虑到机构投资者普遍金额和数量较大的交易执行需求,由用户在策略中直接实现具体的买卖委托操作可能较为麻烦,因此EliteCtaTemplate提供了目标仓位交易执行功能:
# 获取当前目标
last_target: int = self.get_target()
# 初始化新一轮目标(默认不变)
new_target: int = last_target
# 执行开仓信号
if long_signal:
new_target = self.trading_size
elif short_signal:
new_target = -self.trading_size
# 持仓时间平仓
if self.bar_since_entry() >= self.max_holding:
new_target = 0
# 保护止损平仓
close_price = hm.close[-1]
if last_target > 0:
stop_price: float = self.long_average_price() * (1 - self.stop_percent)
if close_price <= stop_price:
new_target = 0
elif last_target < 0:
stop_price: float = self.short_average_price() * (1 + self.stop_percent)
if close_price >= stop_price:
new_target = 0
# 设置新一轮目标
self.set_target(new_target)
# 执行目标交易
self.execute_trading(self.price_add)
# 推送UI更新
self.put_event()
在上文代码中,交易执行的步骤可以分解为:
同时除了RUMI策略本身的多空交易逻辑外,我们出于实盘交易中的谨慎风险管理原则,额外添加了两块平仓出场逻辑:
总持仓时间限制的出场:
a. 使用bar_since_entry函数,获取开仓以来经过的K线总数量;
b. 当总数量超过一个上限值,认为趋势已经衰减结束,平仓离场;
保护性止损位平仓出场:
a. 在多空持仓场景下,分别使用long_average_price和short_average_price函数获取开仓成本价;
b. 以做多为例:当价格跌破多头开仓成本价一个固定百分比,则止损离场
在实盘交易中,目标交易执行模式的主要优势包括:
回测数据上,本文中选择使用米筐RQData提供的rb99连续指数合约数据(rb888连续主力合约数据由于长期的换月升贴水平滑,较早时期的价格已变为负数),在后续的篇幅中我们会尝试更多的品种,回测配置如下:
作为原始版本策略的源码复现,初步回测结果勉强过得去:
策略回测的关键统计结果:
下一篇文章中,将会详细讲解如何使用EliteCtaStrategy实现基于稳健统计指标R-Cubed的参数优化,以及分享RumiStrategy在更多品种上的回测绩效。
当前VeighNa Elite版仍处于免费内测阶段,内测账号可以通过提供量化私募机构的投研人员名片申请,感兴趣的同学请扫码添加小助手:
免责声明
文章中的信息或观点仅供参考,作者不对其准确性或完整性做出任何保证。读者应以其独立判断做出投资决策,作者不对因使用本报告的内容而引致的损失承担任何责任。
发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2023-2-22
2023年第2场VeighNa社区活动开始报名,本场活动将在深圳举办,分享主题是基于VeighNa Elite版本的CTA进阶策略。
本场活动提供40个名额,报名优先对机构量化从业人员开放,感兴趣的同学不要错过!
内容:
VeighNa Elite版简介
Elite CtaStrategy模块
Elite版CTA策略分享
QA问答和交流环节
时间:3月18日 14:00-17:00
地点:深圳
报名费:99元(Elite会员免费参加)
报名方式:扫描下方二维码报名,报名时请填写手机号并注明线上还是线下参加,我们会在会场地址确认后发送短信通知线下参加的同学!
发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2023-02-22
《30天精进Python交易GUI》课程更新35-40集,近6集内容中详细讲解了量化系统中的【通用化数据监控表格控件】的开发使用技巧,以及如何通过Qt Style Sheet实现【自定义交易UI界面风格美化】,感兴趣的同学请戳这里。
上周发布了VeighNa的3.6.0版本,本次更新的主要内容是增加了Mac系统上的CTP交易接口支持(本文完成于专门为此采购的Mac Mini M2~)。
对于已经安装了VeighNa Studio的用户,可以使用快速更新功能完成自动升级。对于没有安装的用户,请下载VeighNa Studio-3.6.0,体验一键安装的量化交易Python发行版,下载链接:
https://download.vnpy.com/veighna_studio-3.6.0.exe
得益于Python语言本身的跨平台优势(Windows、Linux、Mac三大系统),VeighNa量化交易平台的核心框架部分很早就可以在Mac系统上运行。
但由于C++类交易API对于Mac系统支持的普遍不足,导致之前只有vnpy_ib等少数【纯Python实现】的交易接口可以在Mac系统上运行,对于大部分用户来说没什么实际价值。
从6.6.7版本的CTP API开始,上期技术官方推出了对Mac系统支持,包括Intel(x86_64)和苹果M系(arm64)芯片。终于,VeighNa平台可以在Mac系统上为期货量化用户提供从投研回测到实盘交易的一体化解决方案。
目前Mac系统上还没有类似VeighNa Studio的开箱即用发行版(开发团队在抓紧研究中),需要手动完成安装流程:
1 . 前往Python官网下载3.10版本的安装包(或者使用brew安装),安装完成后在终端(Terminal)中运行命令:
python3
检查确认打开的Python解释器为3.10版本。
2 . 使用brew安装TA-Lib的C++开发包:
brew install ta-lib
3 . 安装NumPy和TA-Lib(Python),这里推荐使用豆瓣PyPI镜像解决官方源访问困难的问题:
python3 -m pip install numpy --index=https://pypi.doubanio.com/simple
python3 -m pip install ta-lib==0.4.24 --index=https://pypi.doubanio.com/simple
4 . 安装米筐RQData客户端,注意这里使用的是米筐PyPI源:
python3 -m pip install rqdatac --index=https://pypi2.ricequant.com/simple
5 . 安装VeighNa核心框架,以及需要使用的功能插件模块:
python3 -m pip install vnpy --index=https://pypi.doubanio.com/simple
python3 -m pip install vnpy_ctastrategy vnpy_ctabacktester vnpy_datamanager vnpy_sqlite vnpy_rqdata --index=https://pypi.doubanio.com/simple
这里的例子中包括(具体可以根据自己的需求调整):
pip安装过程中如果出现报错某些依赖库的缺失,可以尝试先pip install该依赖库,然后再次执行上述安装命令。
6 . 安装CTP交易接口模块:
python3 -m pip install vnpy_ctp --index=https://pypi.doubanio.com/simple
如果Intel芯片的机器上安装失败,请在App Store中安装XCode编译器后再次尝试。
完成后即可使用run.py脚本启动VeighNa Trader:
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy_ctp import CtpGateway
from vnpy_ctastrategy import CtaStrategyApp
from vnpy_ctabacktester import CtaBacktesterApp
from vnpy_datamanager import DataManagerApp
def main():
"""Start VeighNa Trader"""
qapp = create_qapp()
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.add_app(CtaStrategyApp)
main_engine.add_app(CtaBacktesterApp)
main_engine.add_app(DataManagerApp)
main_window = MainWindow(main_engine, event_engine)
main_window.showMaximized()
qapp.exec()
if __name__ == "__main__":
main()
附上几张Mac系统运行VeighNa平台的截图:
如果大家在安装过程中遇到任何问题,欢迎在本文评论区留言交流!
本次在Mac上开发CTP交易接口的过程中也踩了不少的坑,包括:
如果对上述内容感兴趣的话也请在评论区告诉我们,后面考虑做一期专门的技术分享文章!
发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2023-02-14
截至2023年2月13日,VeighNa(vn.py)项目在Github上收获的Star总数突破20,000(查看Star数据请戳这里的Github仓库),感谢开源社区用户们的长期支持!
VeighNa开发团队会继续坚持【By Traders, For Traders】的核心理念,为大家带来更加强大和好用的量化交易平台产品!
附上自2015年初在Github上开源以来的Star增长曲线(截图来自Star History网站):
《30天精进Python交易GUI》课程更新35-40集,近6集内容中详细讲解了量化系统中的【通用化数据监控表格控件】的开发使用技巧,以及如何通过Qt Style Sheet实现【自定义交易UI界面风格美化】,感兴趣的同学请戳这里。
发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2023-01-31
2023年首场VeighNa社区活动开始报名,本场活动将在上海举办(深圳、北京、杭州等地也都在今年计划中),分享主题是近期许多社区同学反馈感兴趣的【基于Ubuntu系统的VeighNa量化交易应用 】。
本场活动只提供20个名额,报名优先对机构量化从业人员开放,感兴趣的同学不要错过!
内容:
为什么选择Linux系统?
搭建Ubuntu量化交易环境
Ubuntu上的量化应用案例
期货公司高频交易托管服务介绍
QA问答和交流环节
时间:2月25日 14:00-17:00
地点:上海浦东
报名费:99元(Elite会员免费参加)
报名方式:扫描下方二维码添加小助手后,发送名片报名
发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2023-01-30
近几年Python社区的热点话题总离不开【性能优化】,在《2022年项目计划》开头期待过的Python官方性能优化计划"Shannon Plan",初步成果已经能看到(以下数据来自Python官方,仅供参考):
大神Sam Gross去年已经通过nogil项目成功证明了移除GIL的可行性,但由于社区生态中诸多包和模块都深度融合使用了GIL(这里包括VeighNa的一系列C++交易接口封装),简单粗暴的一次性移除GIL可能会对社区生态造成负面影响(毕竟没人想再体会类似Python2->Python3升级的痛苦)。
就在2023年1月,Sam Gross创建了一个新的提案PEP 703,其中提出将GIL作为Python编译时的可选项(不想看太长英文的同学推荐OSChina的这篇)。如果该提案得到了通过,那么后续发布的Python将会分为两个版本:暂时无法升级或者依赖库较多的项目可以继续使用【包含GIL】的版本,而追求性能的项目则可以升级到【移除GIL】的版本上充分利用CPU多核算力(升级需要重新修改编译pyd扩展)。
PEP 703能否得到Python社区的接受,以及如果接受具体会在哪个版本中发布,暂时都还无法确定。基于上述情况,VeighNa项目在后续3.0大版本迭代周期中,核心支持会依旧保持在Python 3.10上,接下来对2023年主要工作方向做个梳理。
几年前做的一次调查投票里,VeighNa社区中主力使用Windows系统的用户占比大概是80%上下。得益于Python生态本身的跨平台优势,VeighNa项目中纯Python的部分(包括核心引擎、UI界面、投研回测等)从诞生之初就可以实现Windows、Linux和Mac系统上的运行,但涉及到C++封装的交易接口部分则由于用户数量的关系许多只提供了Windows支持。
去年12月的时候又组织了一次关于【大家主要用什么操作系统和电脑硬件运行VeighNa平台】的调查投票,投票人数共计637人(不算特别多,但应该比较有代表性了),结果如下:
刚看到这个数据的时候可以说是相当惊讶:
随后的第一反应是:VeighNa社区用户的平均编程开发水平比起几年前已经显著提升,毕竟POSIX体系的操作系统(Linux、Mac)上做开发的门槛还是高于Windows不少,同时愿意花贵得多的成本购买服务器和工作站大概率还是交易方面确实有了刚性需求。
所以今年计划大幅优化VeighNa项目的跨平台支持,目前准备中的内容包括:
提供Linux和Mac上的集成化环境(类似Windows系统上VeighNa Studio),例如:
完善交易接口封装部分的跨平台支持,例如:
围绕Linux和Mac上量化环境搭建和VeighNa使用相关的文章资料和社区活动。
由于团队精力有限,对Linux系统发行版的支持会限制在【Ubuntu 22.04 LTS】,使用其他发行版的同学可以参考后自行修改。
随着VeighNa项目的整体架构趋于稳定,去年版本迭代的过程中比较好的保持了代码兼容性:使用2.9版本开发的策略代码基本可以$改直接迁移到3.0后续新版本上运行。
同样在今年开发工作中也会优先考虑保持兼容性,降低已经进入实盘交易环节的用户向新版迁移的成本。
今年会投入更多精力在VeighNa社区活动组织上:策略研究分享、交易系统架构、量化编程开发等等。非常期待和一年多没见的朋友们重新相聚,明天就会开放首场活动的报名,名额有限,欢迎关注!
发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2023-01-28
一个多月没更新了,先给大家拜个晚年,祝大家2023年兔步青云、前兔似锦、扬眉兔气、大展宏兔!新年公众号的头篇内容,老规矩还是对2022年来做个总结回顾。
先来看一眼2022年VeighNa开源项目的整体数据(虽然统计日期是2023年1月25日):
用户数量
项目开发
社区交流
截至2023年1月25日,VeighNa在Github上累计收获了19806个Star,Fork数量达到7.7k,继续保持线性增长。下图来源于统计工具Star History:
除了Github外,我们在国内代码托管平台Gitee上维护的VeighNa仓库也保持同步更新,累计已经收获1706个Star和755个Fork。
2022年初VeighNa启动了新的3.0大版本开发,核心支持的Python版本升级到了3.10(保持了3.7、3.8、3.9的兼容性),图形库方面则由于PyQt5到PyQt6的API变更太大选择替换为PySide6(提供了更为丰富的开发文档)。
得益于新的项目模块化设计,3.0版本终于恢复了基于pip的安装方式(之前2.0版本糟糕的源码安装体验被大家吐槽许久)。除了必备的核心框架外,用户可以根据自身的需求来灵活选择扩展模块,实现完整的个性化量化交易系统方案。
除了对已有交易接口的更新升级外,2022年新增了以下证券和期货方面的接口:
JeesGateway:杰宜斯资管系统交易接口;
EmtGateway:东方财富证券EMT柜台接口;
RqdataGateway:RQData跨市场实时数据接口;
GmGateway:掘金证券仿真交易接口;
UfGateway:恒生云证券仿真交易接口;
HxGateway:火象期货仿真交易接口;
数据库方面,部分NoSQL数据库由于尚未提供3.10版本支持导致暂时无法使用(DolphinDB、Arctic、LevelDB),新增两个时序类数据库支持:
和社区交流的过程中,发现部分用户目前还停留在某些2.0的老版本,近几个月由于CTP柜台升级、广期所(GFEX)开市等原因遇到了各种问题。尽管对于已经上线实盘交易的量化系统通常建议是不要频繁升级,但当版本落后过多的时候往往不升级的反而风险更大。对比自行修改框架中零星分布的代码细节,定期升级到经过社区系统测试的主线新版本,长期来看可能是更为稳妥的方案(尤其对于金融机构用户)。
2022年由于疫情的反复影响,全年22场分享交流都是线上举办,其中社区活动只有4月的1场线上,创了这几年以来的新低,专题小班特训营也因为同样的原因只举办了4场。
2022年回顾完,接下来就是对2023年的计划了。如果你对VeighNa过去一年有什么想分享的吐槽的,或者对新的一年有什么建议和期望,都在文章下面欢迎留言告诉我们!
发布于veighna社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2022-12-20
《30天精进Python交易GUI》课程更新27-30集,详细讲解了基于Qt表格控件来自定义开发各种交易数据的监控功能,满足量化交易中的行情、委托、策略、算法等的实时跟踪需求,感兴趣的同学请戳这里。
上周发布了VeighNa的3.5.0版本,本次更新的主要内容是优化了PortfolioStrategy模块,增加对目标调仓交易的支持。
对于已经安装了VeighNa Studio的用户,可以使用快速更新功能完成自动升级。对于没有安装的用户,请下载VeighNa Studio-3.5.0,体验一键安装的量化交易Python发行版,下载链接:
https://download.vnpy.com/veighna_studio-3.5.0.exe
许多VeighNa社区的用户对于PortfolioStrategy投资组合策略模块的理解,可能主要停留在【支持同时交易多标的合约的CtaStrategy版本】,但实际上两者的定位有着相当大的区别。
CtaStrategy模块主要针对的是单标的时序类的量化策略(也就是国内俗称的CTA策略),主要的Alpha盈利来源是对买卖点位的择时。因此在CtaTemplate策略模板中,提供了包括本地停止单(StopOrder)、委托更新(on_order)、成交通知(on_trade)等功能,帮助用户实现对交易执行层面比较细致的控制能力。
而PortfolioStrategy模块则针对的是多标的投资组合类的量化策略,这类策略的Alpha盈利来源除了时序上的买卖择时外,还包括截面上的资产配置(或者说大家更习惯的一个词【选股】)。这类策略在执行层面追求的是将策略投资组合的持仓调整到目标状态,而不去过多关注底层的委托交易细节。
之前在PortfolioStrategy自带的策略样例中,已经提供了目标调仓交易的样例,不过从社区反馈来看还是不那么容易理解和掌握。
所以本次3.5.0的更新,在投资组合策略模板层面(StrategyTemplate)增加了对于目标调仓交易的支持,新增的功能函数如下:
set_target
设置某个合约的目标仓位;
参数:
返回:无;
注意:目标仓位是一种持续性的状态,因此设置后在后续时间会持续保持下去,直到被再次设置修改;
get_target
查询某个合约的目标仓位;
参数:
返回:目标仓位(int);
注意:策略的目标仓位状态会在sync_data时(成交、停止等)自动持久化到硬盘文件,并在策略重启后恢复;
rebalance_portfolio
基于目标执行调仓交易;
参数:
返回:无
注意:只有当前bars字典中有K线切片的合约,才会参与本次调仓交易的执行,从而保证非交易时段(没有行情推送)的合约不会错误发出委托;
calculate_price
计算调仓委托价格;
参数:
返回:调仓委托价格(float);
注意:该函数支持重载实现,允许用户按需实现委托价格的计算逻辑(如固定价格超价、固定pricetick超价、百分比超价等),默认直接返回参考价格;
上述函数的具体使用方法,可以参考这里的模块自带策略样例。
本次PortfolioStrategy模块的修改仅在策略模板层面增加了功能,没有破坏老版本兼容性的内容,因此基于之前版本开发的策略代码依旧可以直接使用。
米筐RQData从2.9.38版本开始,就在其rqdatac(RQData的Python客户端库)中提供了LiveMarketDataClient组件,用于订阅获取跨市场实时行情推送。
本次更新中新增了RqdataGateway跨市场行情接口,依旧位于vnpy_rqdata模块下,可以在VeighNa Station界面上直接加载使用。目前RqdataGateway支持了股票、指数、ETF基金、期货的行情订阅获取(需要RQData账号开通了对应权限),后续我们也会根据社区反馈的需求进一步增加,如可转债、期权、黄金TD、逆回购等。
需要注意的是,RqdataGateway本身作为行情接口只提供了合约查询和行情订阅功能。有仿真交易需求的用户(主要可能是为了测试股票、ETF基金相关的策略),可以配合PaperAccount模块来实现本地仿真的跨市场模拟交易:
EMT是由东方财富证券推出面向机构投资者的极速证券柜台,除了提供广泛的交易业务支持外,也提供了EMQ极速行情服务。EMT的官方网站上(emt.18.cn)提供了在线账号开通和权限申请功能(包括测试和实盘),十分方便。
本次更新中新增的vnpy_emt模块基于2.10.0版本的EMT C++ API开发,目前支持了A股现货的行情和交易功能。
HFT是由国泰君安证券推出的统一交易网关,实现了一套API接入多种后端极速柜台的功能,方便用户根据自己每个阶段的需求选择合适的柜台,并在后续需要切换时平滑过渡。
本次更新中将vnpy_hft模块中使用的HFT API版本升级到了2.3.6,同时添加了市价单委托的支持。
新增基于米筐RQData的跨市场行情数据接口RqdataGateway
新增东方财富证券EMT柜台交易接口vnpy_emt
调整vnpy_algotrading模块设计(模板、引擎),只支持单合约算法执行交易
优化vnpy_algotrading的算法状态控制,增加状态枚举值,算法支持暂停和恢复运行
升级vnpy_hft接口支持HFT国泰君安证券统一交易网关的2.0版本API
优化vnpy_portfoliostrategy的策略模板,支持持仓目标调仓交易模式
修复后台线程异常捕捉钩子函数,解决Python 3.7的语法兼容性问题
修复vnpy_mysql加载历史数据时存在时段重复的问题
修复vnpy_ib由于TWS客户端升级导致的委托失败问题
修复vnpy_rest/vnpy_websocket对Python 3.10后asyncio的支持
修复vnpy_sopt由于流控导致的委托失败时,返回【提交中】状态委托的问题