失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 量化交易入门之vnpy简单策略编写

量化交易入门之vnpy简单策略编写

时间:2021-07-25 14:32:23

相关推荐

量化交易入门之vnpy简单策略编写

本篇博客将介绍量化交易框架vnpy的简单策略编写。在阅读本博客前的环境准备请看我的上一篇博客。传送门如下:

零基础搭建量化交易框架

一、开发环境

因为python版本兼容有点差,且源码功能都有所变化,所以没有环境信息的教程就是刷流氓。

windows10

python3.7

Miniconda3-py37_4.12.0-Windows-x86_64

vnpy源码2.7.0

本文的教程适用vnpy2.7.0 -3.3.0版本

二、vnpy策略编写

首先,要编写策略,在vnpy框架中只需继承CtaTemplate这个类,并重写其中的方法即可。

下面介绍下CtaTemplate重要的一些函数及参数

class CtaTemplate(ABC):def on_init(self):#策略初始化函数,用作参数的初始化,如加载bar数据def on_start(self):#策略启动def on_tick(self, tick: TickData):#接收tick数据def on_stop(self):#策略停止,销毁进程或数据def on_bar(self, bar: BarData):#将tick数据按周期(1分钟、5分钟等……周期)合成一个柱图数据,可以理解为蜡烛图def buy(self,price: float,volume: float,stop: bool = False,lock: bool = False,net: bool = False):#执行买入操作,注意,这里的买入开仓,方向是多def cover(self,price: float,volume: float,stop: bool = False,lock: bool = False,net: bool = False):#执行平仓操作,注意,这里的买入平仓,方向是多def short(self,price: float,volume: float,stop: bool = False,lock: bool = False,net: bool = False):#执行卖出操作,注意,这里的卖出开仓。方向是空def sell(self,price: float,volume: float,stop: bool = False,lock: bool = False,net: bool = False):#执行平仓操作,注意,这里的卖出平仓。方向是空

熟悉这个类之后我们开始以一个简单的策略案例来用代码实现。

策略案例:双均线策略

使用移动平均线MA10、MA20组合来进行交易

当MA10由下往上穿过MA20均线时执行为金叉,此时平空(如有)开多,

当MA10由上往下穿过MA20均线时执行为死叉,此时平多(如有)开空

代码实现如下:

from vnpy_ctastrategy import (CtaTemplate,BarGenerator,ArrayManager)from typing import Any, Callablefrom vnpy.trader.object import BarData, TickDataclass DemoStrategy(CtaTemplate):""""""""# 作者author = "zjs"# 定义参数fast_window = 10slow_window = 20# 定义变量fast_ma0 = 0.0fast_ma1 = 0.0slow_ma0 = 0.0slow_ma1 = 0.0parameters = ["fast_window", "slow_window"]variables = ["fast_ma0", "fast_ma1", "slow_ma0", "slow_ma1"]def __init__(self,cta_engine: Any,strategy_name: str,vt_symbol: str,setting: dict, ):""""""""# 调用父类构造函数初始化super().__init__(cta_engine, strategy_name, vt_symbol, setting)self.bg = BarGenerator(self.on_bar)self.am = ArrayManager(100)# 重写父类函数def on_init(self):self.write_log("demo策略初始化###")self.load_bar(10)def on_start(self):self.write_log("demo策略启动##")def on_tick(self, tick: TickData):# tick更新self.bg.update_tick(tick)def on_stop(self):self.write_log("demo策略停止")def on_bar(self, bar: BarData):# K线更新am = self.amam.update_bar(bar)if not am.inited:returnfast_ma = am.sma(self.fast_window, array=True)fast_ma0 = fast_ma[-1]fast_ma1 = fast_ma[-2]slow_ma = am.sma(self.slow_window, array=True)slow_ma0 = slow_ma[-1]slow_ma1 = slow_ma[-2]# 判断均线交叉cross_over = fast_ma0 >= slow_ma0 and fast_ma1 < slow_ma1cross_below = fast_ma0 <= slow_ma0 and fast_ma1 > slow_ma1##如果是金叉,则执行买入操作if cross_over:# 定义交易价格(滑点),当前价格+5price = bar.close_price + 5if not self.pos:self.buy(price, 1)elif self.pos < 0:self.cover(price, 1)self.buy(price, 1)##如果是死叉,则执行卖出/开空elif cross_below:price = bar.close_price - 5if not self.pos:self.short(price, 1)elif self.pos > 0:self.sell(price, 1)self.short(price, 1)# 更新图形self.put_event()

如果觉得《量化交易入门之vnpy简单策略编写》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。