VeighNa量化社区
你的开源社区量化交易平台
xiaohe's Avatar
Member
离线
4300 帖子
声望: 268

把tushare_datafeed的127行的“output(f"发生输入/输出错误:{ex}")”改成“output(f"发生输入/输出错误:{ex.strerror}")”试试看

发布于veighna社区公众号【vnpy-community】
 
原文作者:用Python的交易员 | 发布时间:2023-3-1
 

失踪系列回归

 

VeighNa平台面向专业量化交易用户的Elite(菁英版)从2022年10月开始内测以来,经过5个月时间的迭代目前已经到了0.9.0版本,预计将在3月底之前正式上线发布。

前期VeighNa Elite在开发上主要专注于交易系统性能方面的优化,如:

  • 低延时事件引擎:实现更高速率的系统事件处理;
  • 前后端分离架构:分离前端UI界面的运行时开销;
  • 多进程策略并发:突破GIL带来的CPU单核算力上限。

后续根据内测用户的反馈,开始增加交易和策略相关的功能扩展,交易方面的内容包括:市场深度委托、多账户组合交易、标准化执行算法等。策略方面推出的则是更加针对量化私募机构策略开发需求的EliteCtaStrategy和ElitePortfolioStrategy模块。

翻了下公众号的历史记录,【VeighNa量化策略实验室】系列的上一篇文章更新已经是2021年9月的事情。时隔一年半再次回归,升级为基于VeighNa Elite版的【Elite量化策略实验室】,同样希望能够在量化策略研究方面给大家带来更多的灵感。

本文分享的RUMI策略来自于VeighNa社区用户推荐的互联网资料,原作者已经很难确定,甚至我们连RUMI具体是什么的缩写也不清楚(如果有知道的欢迎评论区留言)。

为了吊起大家的胃口,先来看一下螺纹钢期货上经过各种细节优化的结果:

description

description

 

策略基本信息

 

description

 

策略核心原理

 

移动平均线(Moving Average)作为一种大家非常熟悉的技术指标,由于其非平稳性时间序列的特征(即均值并不围绕固定中枢波动),本身并不适合作为CTA策略的核心信号使用。

而简单的使用双均线金死叉作为交易信号,尽管能够在大趋势中捕捉相当一部分行情,但在均线缠绕出现的震荡类行情中则会遭遇来回打脸的问题。

因此RUMI策略采用了对均线偏离度平滑处理的方式,来更好的识别趋势机会:

  • 快速均线:使用SMA(简单移动平均)计算
  • 慢速均线:使用WMA(加权移动平均)计算
  • DIFF:计算快慢均线的偏离度(两者相减)
  • RUMI:对偏离度使用SMA进行平滑处理

有了RUMI指标后,交易信号则是十分简单:

  • RUMI上穿0轴,买入做多
  • RUMI下穿0轴,卖出做空

看到这里不难发现,本质上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()

在上文代码中,交易执行的步骤可以分解为:

  1. 通过get_target函数,获取策略当前T时刻的目标仓位数值last_target;
  2. 结合策略核心逻辑判断,计算生成新的目标仓位数值new_target;
  3. 调用set_target函数,设置策略T+1时刻的目标仓位数值;
  4. 调用execute_trading函数,计算目标持仓target和实际持仓pos的差值执行委托交易;

同时除了RUMI策略本身的多空交易逻辑外,我们出于实盘交易中的谨慎风险管理原则,额外添加了两块平仓出场逻辑:

  1. 总持仓时间限制的出场:

    a. 使用bar_since_entry函数,获取开仓以来经过的K线总数量;
    b. 当总数量超过一个上限值,认为趋势已经衰减结束,平仓离场;

  2. 保护性止损位平仓出场:

    a. 在多空持仓场景下,分别使用long_average_price和short_average_price函数获取开仓成本价;
    b. 以做多为例:当价格跌破多头开仓成本价一个固定百分比,则止损离场

在实盘交易中,目标交易执行模式的主要优势包括:

  • 策略逻辑围绕目标持仓展开,开盘初始化时可以直接通过历史数据回放来恢复正确的策略状态,无需再依赖昨日收盘时的策略变量缓存(如基于实际仓位跟踪的移动止损高低点),减少在实盘运维中的出错风险;
  • 用户不再需要为繁琐的委托下单代码头疼(尤其是某些比较复杂策略中的交易状态机管理),当执行数量较大时可以由策略引擎自动调用平台内置的执行算法(TWAP、Sniper、BestLimit等)来进行拆单交易,降低整体的交易成本。

 

回测结果

 

回测数据上,本文中选择使用米筐RQData提供的rb99连续指数合约数据(rb888连续主力合约数据由于长期的换月升贴水平滑,较早时期的价格已变为负数),在后续的篇幅中我们会尝试更多的品种,回测配置如下:

  • 本地代码:rb99.SHFE
  • K线周期:1分钟
  • 开始日期:2010-1-1
  • 结束日期:2023-2-3
  • 手续费率:0.0001
  • 交易滑点:1
  • 合约乘数:10
  • 价格跳动:1
  • 回测资金:1000W

作为原始版本策略的源码复现,初步回测结果勉强过得去:

description

策略回测的关键统计结果:

  • 总交易日:3226
  • 盈利交易日:1425
  • 总收益率:338.81%
  • 年化收益:25.21%
  • 百分比最大回撤:-32.80%

下一篇文章中,将会详细讲解如何使用EliteCtaStrategy实现基于稳健统计指标R-Cubed的参数优化,以及分享RumiStrategy在更多品种上的回测绩效。

 

当前VeighNa Elite版仍处于免费内测阶段,内测账号可以通过提供量化私募机构的投研人员名片申请,感兴趣的同学请扫码添加小助手:

description

 

免责声明

文章中的信息或观点仅供参考,作者不对其准确性或完整性做出任何保证。读者应以其独立判断做出投资决策,作者不对因使用本报告的内容而引致的损失承担任何责任。

 

这里是限价单委托,应该收到信号就下单了,可以自己在策略里打印排查看看
感觉是没触发委托条件,不能保证收到合成的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版本的目标用户和核心定位
    • 更低的交易延时:引擎层优化
    • 更高的策略并发:多进程架构
  • Elite CtaStrategy模块

    • 针对中国市场的策略引擎
    • 高性能数据缓存HistoryManager
    • 目标仓位算法交易执行
    • 策略交易行为跟踪函数
    • 稳健优化指标R-Cubed
  • Elite版CTA策略分享

    • RUMI策略:RumiStrategy
    • 开盘动量策略:OpenMomentumStrategy
    • 缠论分型策略:ChanStrategy
  • QA问答和交流环节

 
时间:3月18日 14:00-17:00

地点:深圳

报名费:99元(Elite会员免费参加)

报名方式:扫描下方二维码报名,报名时请填写手机号并注明线上还是线下参加,我们会在会场地址确认后发送短信通知线下参加的同学!

description

 

发布于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

 

Mac系统的CTP接口支持

 

得益于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安装流程

 

目前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

这里的例子中包括(具体可以根据自己的需求调整):

  • CTA策略实盘和回测模块:vnpy_ctastrategy、vnpy_ctabacktester
  • 历史数据管理模块:vnpy_datamanager
  • SQLite数据库驱动:vnpy_sqlite
  • RQData数据服务适配器:vnpy_rqdata

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平台的截图:

description

description

description

如果大家在安装过程中遇到任何问题,欢迎在本文评论区留言交流!

本次在Mac上开发CTP交易接口的过程中也踩了不少的坑,包括:

  • 头文件和Windows/Linux定义不一致
  • GBK到UTF-8的中文编码转换出错
  • Clang的专属编译和链接配置参数
  • Mac版本开发包中使用.a静态链接库

如果对上述内容感兴趣的话也请在评论区告诉我们,后面考虑做一期专门的技术分享文章!

 

CHANGELOG

 

新增

  1. 新增vnpy_ctp的Mac系统支持(M1/M2)

调整

  1. BaseDatafeed的相关功能函数增加output入参用于输出日志
  2. 修改相关数据服务模块适配output参数:vnpy_rqdata/vnpy_ifind/vnpy_wind/vnpy_tushare
  3. 修改相关策略应用模块适配output参数:vnpy_ctastrategy/vnpy_ctabacktester/vnpy_portfoliostrategy/vnpy_spreadtrading/vnpy_datamanager
  4. OffsetConverter增加对于SHFE/INE合约的锁仓模式支持
  5. 在OmsEngine中添加全局的OffsetConverter功能,不再需要各AppEngine自行维护
  6. 添加CTA策略模块在执行参数优化时的进程数量限制参数:vnpy_ctastrategy/vnpy_ctabacktester
  7. 增加穷举优化算法运行过程中基于tqdm的进度条输出
  8. 增加遗传优化算法运行过程中的迭代次数进度输出
  9. 增加vnpy_optionmaster模块的期权产品对应标的合约的匹配函数,不再限制产品范围
  10. 升级vnpy_tts的dll链接库,解决openctp升级导致的资金不显示的问题
  11. 修改vnpy_ctastrategy使用vnpy.trader.database中统一定义的时区来加载数据
  12. 增加vnpy_ctastrategy策略模板的合约乘数查询函数get_size
  13. 增加vnpy_spreadtrading回测中统计绩效时对于爆仓情况的检查
  14. 增加vnpy_scripttrader基于vt_symbol和direction查询持仓数据的函数
  15. 修改vt_positionid的字符串内容,增加gateway_name前缀标识

修复

  1. 修复异常捕捉钩子threading_excepthook的参数错误问题
  2. 修复vnpy_ib获取历史数据时的异常失败问题
  3. 修复vnpy_rest/vnpy_websocket中aiohttp的代理参数proxy传空时必须为None的问题
  4. 修复vnpy_optionmaster模块的Greeks监控表行数设置不足的问题
  5. 修复vnpy_rqdata查询股票期权数据报错的问题
  6. 修复vnpy_rqdata中RqdataGateway获取期货指数和连续合约信息时错误的问题
  7. 修复vnpy_portfoliostrategy中,从缓存文件恢复数据,导致defaultdict变成dict的问题
     

降级一下pyside6吧, 6.3.0和6.2.3都可以试一下

这个只是没有配置数据服务的提示,不是报错

影响不大,下午收盘和晚上收盘之后记得关闭软件即可

添加一个变量,on_trade收到成交推送的时候缓存一下即可

ibapi更新导致的一个兼容性BUG,vnpy_ib 9.81.1.6已经修复了,会随3.6.0发布的

是给哪个版本的api做穿透式测试呢?
vnpy_ctptest版本是?

说明环境没提供对应行情,是在做穿透式测试吗?

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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