把tushare_datafeed的127行的“output(f"发生输入/输出错误:{ex}")”改成“output(f"发生输入/输出错误:{ex.strerror}")”试试看
支持,但是股票程序化交易需要走三方采购的
https://www.vnpy.com/forum/topic/1947-vn-pykuai-su-ru-men-5-agu-zheng-quan-xtp
发布于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版仍处于免费内测阶段,内测账号可以通过提供量化私募机构的投研人员名片申请,感兴趣的同学请扫码添加小助手:
免责声明
文章中的信息或观点仅供参考,作者不对其准确性或完整性做出任何保证。读者应以其独立判断做出投资决策,作者不对因使用本报告的内容而引致的损失承担任何责任。
这里是限价单委托,应该收到信号就下单了,可以自己在策略里打印排查看看
感觉是没触发委托条件,不能保证收到合成的bar的时间的
这个是五分钟推一次不是像on_tick收到tick就推一次
公众号【vnpy-community】里【进阶课程】的课时02【策略模板】里有对template的介绍,感兴趣的话可以去看一下
可以贴一下报错信息截图
database.db是默认数据库sqlite的数据库,mysql配置可参考https://www.vnpy.com/docs/cn/database.html#id10
本地停止单要盘口价格触发委托价格才能超价发出的
历史数据不够am初始化吧,am的size是100,10个自然日的小时K线不到100根吧
发布于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交易接口的过程中也踩了不少的坑,包括:
如果对上述内容感兴趣的话也请在评论区告诉我们,后面考虑做一期专门的技术分享文章!
降级一下pyside6吧, 6.3.0和6.2.3都可以试一下
这个只是没有配置数据服务的提示,不是报错
影响不大,下午收盘和晚上收盘之后记得关闭软件即可
添加一个变量,on_trade收到成交推送的时候缓存一下即可
ibapi更新导致的一个兼容性BUG,vnpy_ib 9.81.1.6已经修复了,会随3.6.0发布的
是给哪个版本的api做穿透式测试呢?
vnpy_ctptest版本是?
说明环境没提供对应行情,是在做穿透式测试吗?