vnpy怎么创建策略并回测_一步一步学vnpy

  • 登录实盘账户

在安装完vnpy1.8.1版本之后,在Pycharm中启动examples/VnTrader/文件夹中的run.py,会出现如下错误:

89a351abd4485b4a682d6dba2307df6f.png

需要注释掉两处与futuquant相关的代码,

if system == 'Linux': from vnpy.trader.gateway import xtpGateway elif system == 'Windows':
'''
from vnpy.trader.gateway import (femasGateway, xspeedGateway,
futuGateway, secGateway)
''' from vnpy.trader.gateway import (femasGateway, xspeedGateway,
secGateway)
第二处为 if system == 'Windows':
me.addGateway(femasGateway)
me.addGateway(xspeedGateway)
me.addGateway(secGateway)
# me.addGateway(futuGateway)

正常启动,跳出界面。如何连接CTP?进入CTP_connect.json,设置相关参数

88040f3f9dfdbbbda7c2cff704c4eaf3.png

ff46c664713c70e694dc9ccd2ab5146f.png

实盘的这些参数可以咨询开户期货公司,在vnpy的qq群文件里也会有所有brokers信息的压缩包,打开某个期货公司的文件,结构是这样的,照着填就好了。

81c2f5390e2dcad0b51ee6047c4aa42a.png

启动run.py后,在弹出的界面中的左上角,点击 系统--连接CTP,顺利连接

  • 合约订阅

a1a873d615de1f7cde890104496f3ced.png

在“合约代码”位置输入想要交易的合约代码,回车键,则会在界面右侧出现该合约的行情信息,就这么简单。

8a51b9fcd116e61d7d04f58532b81c25.png
  • 策略

策略在vnpy/trader/app/ctaStrategy/strategy 路径下面

f340890c704d6811ab1acf2de9f199ff.png

找到其中一个,认真学习一下结构。你会发现每个策略是一个:类

ae353f100f7d8935f8e6a495f8400b47.png

这个类是怎么被调用的呢?选择这个类名,右键,然后点击 Find Usages

bff3c3bac9ead1bc6ff8facd1e49064f.png

没找到哪个程序引用了,应该有案例,点击主界面的‘功能’按钮,下拉菜单点击‘CTA策略’,弹出对话框,点击‘加载策略’,发现有个策略案例,双均线策略。

69ee26c442771068ea1942a478c57e60.png

不过,用Find Usages还是没找到这个类在哪里被调用。

188ca1bcc20d7b912254dd0a4c75ad0f.png

好像只有“方法”才能反着查到引用,所以“类”是找不到调用的。找不到就先学习一下这个类的具体内容吧!

DoubleMaStrategy继承了CtaTemplate,又得详细学习CtaTemplate类:

44b5431ffe9b4df46e89627eddde2100.png

这个类有600多行,慢慢看吧

69b932206b8fd0c159edb45c395ad2fb.png

从 vtObject import VtBarData,需要熟悉vtObject中的内容,主要是行情数据,成交数据等的数据结构

ee53b7bef8fb9d969f2854c73f22699e.png

在ctaTemplate.py文件中,出现了@property ,Python内置的@property装饰器就是负责把一个方法变成属性调用的

  • 一张图看懂VnTrader的数据流
用Python的交易员:一张图看懂VnTrader的数据流​zhuanlan.zhihu.com
c3ee8b88cec301f050b9bedc9d92fac4.png

要快速上手,还是得先清晰的了解vnpy的结构,详见上面的链接原文,下面搬砖过来:

033c1caab40183d92ca33766e7eb1dfe.png

这里也结合图表,以CTP行情Tick为例, 说明下Python部分的数据流的整体步骤(忽略C++封装部分的)。

主动订阅端

  1. 用户发起调用mainEngine.subscribe函数
  2. mainEngine.subscribe中调用ctpGateway.subscribe函数
  3. ctpGateway.subscribe中调用ctpMdApi.subscrbie函数
  4. ctpMdApi.subscribe中调用C++封装的MdApi.subscribeMarketData函数,将订阅行情的请求最终通过底层C++ CTP API发出

回调推送端

  1. ctaEngine对象向eventEngine中注册EVENT_TICK类型事件的处理函数句柄ctaEngine.processTickEvent
  2. C++ CTP API收到Tick推送,自动回调MdApi.onRtnDepthMarketData函数推送行情数据字典data
  3. MdApi.onRtnDepthMarketData中将data里的数据读取并转化成VtTickData对象,并调用ctpGateway.onTick函数
  4. ctpGateway.onTick函数将VtTickData对象包装成类型为EVENT_TICK的行情事件对象Event,并调用eventEngine.put函数,放入事件引擎的缓冲队列
  5. 事件引擎的工作线程,从缓冲队列中读取出最新的行情事件后,根据EVENT_TICK事件类型去查找缓存在内部字典中的处理函数列表,并将事件对象作为入参,遍历调用到列表中的处理函数ctaEngine.processTickEvent
  6. ctaEngine.processTickEvent中查看Tick的代码vtSymbol,并调用交易该代码合约的策略对象strategy.onTick函数,最终去运行策略中的逻辑
  • CTA策略模块

流程搞清楚后就直接上策略吧,也许能行呢?

用Python的交易员:vn.py发布v1.7.1 - CTA策略模块升级版​zhuanlan.zhihu.com
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要安装好vnpy库,并在vnpy的安装目录下找到vn.trader\app\cta_strategy\strategy_template.py文件,这是vnpy策略模板文件。 接下来,我们根据期货套利策略的需求,对策略模板进行修改。具体而言,我们需要重写以下方法: 1. on_init(self): 用于策略初始化,包括设置参数、订阅合约等。 2. on_start(self): 策略启动时执行的方法。 3. on_stop(self): 策略停止时执行的方法。 4. on_tick(self, tick: TickData): 处理行情数据的方法,用于更新策略的状态。 5. on_trade(self, trade: TradeData): 处理成交数据的方法。 6. on_order(self, order: OrderData): 处理委托数据的方法。 7. on_bar(self, bar: BarData): 处理K线数据的方法,用于实现基于K线的策略。 下面是一个简单的期货套利策略示例,以两个相同品种但不同到期日的期货合约为例。假设当前时间为t,合约A的到期日为t1,合约B的到期日为t2,我们的策略目标是通过买入A合约,卖出B合约来实现套利。当t1-t2的时间差小于某个阈值时,我们就认为A和B之间存在套利机会,此时我们就执行套利交易。 ```python from vnpy.app.cta_strategy import ( CtaTemplate, StopOrder, TickData, BarData, TradeData, OrderData, Direction ) class FuturesArbitrageStrategy(CtaTemplate): """""" author = "Your name" strategy_name = "FuturesArbitrageStrategy" # 策略参数 spread_threshold = 5 # 时间差阈值,以分钟为单位 # 策略变量 long_pos = 0 # 多头持仓 short_pos = 0 # 空头持仓 last_tick_A = None # A合约最新tick数据 last_tick_B = None # B合约最新tick数据 last_trade_A = None # A合约最新成交数据 last_trade_B = None # B合约最新成交数据 parameters = ["spread_threshold"] variables = [ "long_pos", "short_pos", "last_tick_A", "last_tick_B", "last_trade_A", "last_trade_B" ] def on_init(self): """ 策略初始化 """ self.write_log("策略初始化") # 订阅合约 self.subscribe(self.symbol_A, "") self.subscribe(self.symbol_B, "") def on_start(self): """ 策略启动 """ self.write_log("策略启动") def on_stop(self): """ 策略停止 """ self.write_log("策略停止") def on_tick(self, tick: TickData): """ 处理行情数据 """ if tick.vt_symbol == self.symbol_A: self.last_tick_A = tick else: self.last_tick_B = tick # 如果A和B的最新tick数据都存在,就进行套利判断 if self.last_tick_A is not None and self.last_tick_B is not None: t1 = self.last_tick_A.datetime t2 = self.last_tick_B.datetime if abs((t1 - t2).total_seconds() / 60) < self.spread_threshold: self.arbitrage() def on_trade(self, trade: TradeData): """ 处理成交数据 """ if trade.vt_symbol == self.symbol_A: self.last_trade_A = trade else: self.last_trade_B = trade def on_order(self, order: OrderData): """ 处理委托数据 """ pass def on_bar(self, bar: BarData): """ 处理K线数据 """ pass def arbitrage(self): """ 套利交易 """ # 如果A和B的最新成交数据都存在,就进行套利交易 if self.last_trade_A is not None and self.last_trade_B is not None: price_A = self.last_trade_A.price price_B = self.last_trade_B.price if price_A > price_B: # A合约价格高于B合约,执行买入A合约,卖出B合约 self.buy(self.symbol_A, 1, price_A) self.short(self.symbol_B, 1, price_B) else: # A合约价格低于B合约,执行卖出A合约,买入B合约 self.short(self.symbol_A, 1, price_A) self.buy(self.symbol_B, 1, price_B) ``` 以上就是一个简单的期货套利策略的实现,可以使用vnpy回测引擎进行回测。需要注意的是,这个策略只是一个示例,实际的套利策略需要根据具体的市场情况和交易规则进行设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值