原创文章第74篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。

前面系列文章,把backtrader的方方面面介绍了一下,如何使用,内部运作机制,如何扩展。

客观讲,熟悉了bt之后,发现这个框架着实易用,易扩展。更重要的是,对于实战有很多贴心的考量,是可以应用于生产环境的”工业级“应用。

我们今天来实战几个策略。

01 双均线——信号策略

自定义一个信号,这个信号比较简单,就是短周期与长周期两条均线”交叉“作为信号signal。

注意:这里包含”金叉“和”死叉“

import backtrader as bt# 自定义信号指标
class SignalDoubleSMA(bt.Indicator):lines = ('signal',)  # 声明 signal 线,交易信号放在 signal line 上params = dict(short_period=5,long_period=20)def __init__(self):self.s_ma = bt.ind.SMA(period=self.p.short_period)self.l_ma = bt.ind.SMA(period=self.p.long_period)# 短期均线上穿长期均线,取值为1;反之,短期均线下穿长期均线,取值为-1self.lines.signal = bt.ind.CrossOver(self.s_ma, self.l_ma)

我们看下CrossOver这个指标,它是upcross -  downcross。也就是”上穿”值为1,下窗值为-1。

02 三均线多头策略

三条均线,短,中,长三期,短期>中期>长期,即呈现“多头排列”时买入,而短线下穿中线时平仓。

import backtrader as bt# 自定义信号指标
class SignalTripleSMA(bt.Indicator):lines = ('signal',)  # 声明 signal 线,交易信号放在 signal line 上params = dict(short_period=5,median_period=20,long_period=60)def __init__(self):self.s_ma = bt.ind.SMA(period=self.p.short_period)self.m_ma = bt.ind.SMA(period=self.p.median_period)self.l_ma = bt.ind.SMA(period=self.p.long_period)# 短期均线在中期均线上方,且中期均线也在长期均线上方,三线多头排列,取值为1;反之,取值为0self.signal1 = bt.And(self.m_ma > self.l_ma, self.s_ma > self.m_ma)# 求上面 self.signal1 的环比增量,可以判断得到第一次同时满足上述条件的时间,第一次满足条件为1,其余条件为0self.buy_signal = bt.If((self.signal1 - self.signal1(-1)) > 0, 1, 0)# 短期均线下穿长期均线时,取值为1;反之取值为0self.sell_signal = bt.ind.CrossDown(self.s_ma, self.m_ma)# 将买卖信号合并成一个信号self.lines.signal = bt.Sum(self.buy_signal, self.sell_signal * (-1))

03 海龟策略

import backtrader as bt
from engine.strategy.strategy_base import StrategyBaseclass TurtleTradingStrategy(StrategyBase):params = dict(N1=20,  # 唐奇安通道上轨的tN2=10,  # 唐奇安通道下轨的t)def __init__(self):self.order = Noneself.buy_count = 0  # 记录买入次数self.last_price = 0  # 记录买入价格# 准备第一个标的沪深300主力合约的close、high、low 行情数据self.close = self.datas[0].closeself.high = self.datas[0].highself.low = self.datas[0].low# 计算唐奇安通道上轨:过去20日的最高价self.DonchianH = bt.ind.Highest(self.high(-1), period=self.p.N1, subplot=True)# 计算唐奇安通道下轨:过去10日的最低价self.DonchianL = bt.ind.Lowest(self.low(-1), period=self.p.N2, subplot=True)# 生成唐奇安通道上轨突破:close>DonchianH,取值为1.0;反之为 -1.0self.CrossoverH = bt.ind.CrossOver(self.close(0), self.DonchianH, subplot=False)# 生成唐奇安通道下轨突破:self.CrossoverL = bt.ind.CrossOver(self.close(0), self.DonchianL, subplot=False)# 计算 ATRself.TR = bt.ind.Max((self.high(0) - self.low(0)),  # 当日最高价-当日最低价abs(self.high(0) - self.close(-1)),  # abs(当日最高价−前一日收盘价)abs(self.low(0) - self.close(-1)))  # abs(当日最低价-前一日收盘价)self.ATR = bt.ind.SimpleMovingAverage(self.TR, period=self.p.N1, subplot=False)# 计算 ATR,直接调用 talib ,使用前需要安装 python3 -m pip install TA-Lib# self.ATR = bt.talib.ATR(self.high, self.low, self.close, timeperiod=self.p.N1, subplot=True)def next(self):# 如果还有订单在执行中,就不做新的仓位调整if self.order:return# 如果当前持有多单if self.position.size > 0:# 多单加仓:价格上涨了买入价的0.5的ATR且加仓次数少于等于3次if self.datas[0].close > self.last_price + 0.5 * self.ATR[0] and self.buy_count <= 4:print('if self.datas[0].close >self.last_price + 0.5*self.ATR[0] and self.buy_count <= 4:')print('self.buy_count', self.buy_count)# 计算建仓单位:self.ATR*期货合约乘数300*保证金比例0.1self.buy_unit = max((self.broker.getvalue() * 0.005) / (self.ATR * 300 * 0.1), 1)self.buy_unit = int(self.buy_unit)  # 交易单位为手# self.sizer.p.stake = self.buy_unitself.order = self.buy(size=self.buy_unit)self.last_price = self.position.price  # 获取买入价格self.buy_count = self.buy_count + 1# 多单止损:当价格回落2倍ATR时止损平仓elif self.datas[0].close < (self.last_price - 2 * self.ATR[0]):print('elif self.datas[0].close < (self.last_price - 2*self.ATR[0]):')self.order = self.sell(size=abs(self.position.size))self.buy_count = 0# 多单止盈:当价格突破10日最低点时止盈离场 平仓elif self.CrossoverL < 0:print('self.CrossoverL < 0')self.order = self.sell(size=abs(self.position.size))self.buy_count = 0# 如果当前持有空单elif self.position.size < 0:# 空单加仓:价格小于买入价的0.5的ATR且加仓次数少于等于3次if self.datas[0].close < self.last_price - 0.5 * self.ATR[0] and self.buy_count <= 4:print('self.datas[0].close<self.last_price-0.5*self.ATR[0] and self.buy_count <= 4')# 计算建仓单位:self.ATR*期货合约乘数300*保证金比例0.1self.buy_unit = max((self.broker.getvalue() * 0.005) / (self.ATR * 300 * 0.1), 1)self.buy_unit = int(self.buy_unit)  # 交易单位为手# self.sizer.p.stake = self.buy_unitself.order = self.sell(size=self.buy_unit)self.last_price = self.position.price  # 获取买入价格self.buy_count = self.buy_count + 1# 空单止损:当价格上涨至2倍ATR时止损平仓elif self.datas[0].close < (self.last_price + 2 * self.ATR[0]):print('self.datas[0].close < (self.last_price+2*self.ATR[0])')self.order = self.buy(size=abs(self.position.size))self.buy_count = 0# 多单止盈:当价格突破20日最高点时止盈平仓elif self.CrossoverH > 0:print('self.CrossoverH>0')self.order = self.buy(size=abs(self.position.size))self.buy_count = 0else:  # 如果没有持仓,等待入场时机# 入场: 价格突破上轨线且空仓时,做多if self.CrossoverH > 0 and self.buy_count == 0:print('if self.CrossoverH > 0 and self.buy_count == 0:')# 计算建仓单位:self.ATR*期货合约乘数300*保证金比例0.1self.buy_unit = max((self.broker.getvalue() * 0.005) / (self.ATR * 300 * 0.1), 1)self.buy_unit = int(self.buy_unit)  # 交易单位为手self.order = self.buy(size=self.buy_unit)self.last_price = self.position.price  # 记录买入价格self.buy_count = 1  # 记录本次交易价格# 入场: 价格跌破下轨线且空仓时,做空elif self.CrossoverL < 0 and self.buy_count == 0:print('self.CrossoverL < 0 and self.buy_count == 0')# 计算建仓单位:self.ATR*期货合约乘数300*保证金比例0.1self.buy_unit = max((self.broker.getvalue() * 0.005) / (self.ATR * 300 * 0.1), 1)self.buy_unit = int(self.buy_unit)  # 交易单位为手self.order = self.sell(size=self.buy_unit)self.last_price = self.position.price  # 记录买入价格self.buy_count = 1  # 记录本次交易价格
  • 指标计算:

    • 用 20 日的最高、最低、收盘价计算平均真实波幅 ATR;

    • 计算出近 20 日的最高与 20 日最低价,构建唐奇安通道。

  • 交易信号:

    • 入场:价格突破 20 日价格高点时,入场;

    • 加仓:价格继续上涨至 0.5 倍 ATR ,再次加仓,加仓次数不超过 3 次;

    • 止损:价格回落 2 倍 ATR 时止损离场;

    • 止盈:价格突破 10 日最低点时止盈离场;

    • 做空与做多的逻辑相反。

本篇主要演示bt框架里,指标如何计算,尤其是一些复合的向量计算,以及策略如何写,包括止损、止盈,仓位管理等。

传统量化策略其实就是一个小交易系统,包括了选股、择时与仓位管理。而机器学习模型应该更接近是一个择时过程,应当是系统中的一个环节。而qlib的TopK回测,分高就all in,显然是不够“科学”,只是一种学术上的论证。

均线交叉策略、海龟策略:基于backtrader框架的实现相关推荐

  1. 1-2 移动均线交叉策略1

    第一阶段.一个简单策略入门量化投资 1-2 移动均线交叉策略1 第一阶段一个简单策略入门量化投资 1-2 移动均线交叉策略1 前言 获取数据 移动均线交叉策略 数据可视化 绘制折线图 绘制K线图 绘制 ...

  2. Python量化交易学习笔记(14)——均线交叉策略

    本文使用均线交叉策略,对平安银行自2018年1月1日至2020年2月28日的日线数据进行回测分析. 策略会用到短期移动均线及长期移动均线两个技术指标,在backtrader自定义策略init方法中,添 ...

  3. python 策略回测期货_量化投资实战教程(1)—基于backtrader的简单买入卖出策略

    都说Python可以用于量化投资,但是很多人都不知道该怎么做,甚至觉得是非常高深的知识,其实并非如此,任何人都可以在只有一点Python的基础上回测一个简单的策略. Backtrader是一个基于Py ...

  4. 量化投资实战教程(1)—基于backtrader的简单买入卖出策略

    都说Python可以用于量化投资,但是很多人都不知道该怎么做,甚至觉得是非常高深的知识,其实并非如此,任何人都可以在只有一点Python的基础上回测一个简单的策略. Backtrader是一个基于Py ...

  5. 用 Pandas 分析均线交叉策略收益率

    在这篇文章中,我们会利用上一篇文章中的均线交叉策略回测中获得的结果(<用 Python 基于均线交叉策略进行回测>),并花一些时间更深入地挖掘权益曲线并生成一些关键绩效指标和一些有趣的数据 ...

  6. 基于backtrader的唐奇安结合ADX策略实现(自动多参数调优和回测)

    基于backtrader的唐奇安结合ADX策略实现(自动多参数调优和回测) ##导入相关包 优化jupyter画图设置 from datetime import datetime,timedelta ...

  7. 基于backtrader的唐奇安通道策略实现

    基于backtrader的唐奇安通道策略实现 代码实现 ##导入相关包 优化jupyter画图设置 from datetime import datetime,timedelta import bac ...

  8. 1-3移动均线交叉策略2

    第一阶段.一个简单策略入门量化投资 1-3移动均线交叉策略2 上一篇文章1-2 移动均线交叉策略1中我们最后提到: 如果我们从第一天买入股票,一直持有股票,最后一天卖出,获得的收益是每股124.02美 ...

  9. 量化交易学习(10)均线交叉策略

    均线交叉策略 均线介绍 均线交叉策略 回测策略 优化策略参数 代码 总结 均线介绍 均线计算: 在某一时间段的收盘价之和进行算术平均的方法,并随着时间的推移将这些平均值连成一条线便可得出SMA. 趋势 ...

最新文章

  1. K8s 1.14 发布了,Release Note 该怎么读?
  2. 关于Java函数传参以及参数在函数内部改变的问题——JAVA值传递与引用最浅显的说明!...
  3. java 基于tcp客户端服务端发送接收数据
  4. [ARC055D]隠された等差数列
  5. redis数据类型为key的常用命令
  6. 生命不能承受之轻——沉重的眼泪
  7. Python学习教程:Python3内置模块之base64编解码方法小结
  8. 敏捷开发一千零一问系列之十一:需求谁做主?
  9. Linux -单用户模式(忘记Linux的root密码)
  10. 30万美元:Zerodium 出3倍价格求 WordPress RCE exploit
  11. python编程语言继承_如何使用Python继承机制(子类化内置类型)
  12. 破解StarUML4.1.6
  13. 光伏窗性能研究(2)——光伏窗性能研究方法和过程
  14. O2O(online to offline)营销模式
  15. 【STM32F429】第27章 ThreadX GUIX炫酷实用的时钟表盘设计,结合硬件RTC实时时钟
  16. 异步实现商品详情页查询
  17. Android 11 功能和 API 概览
  18. 如何正确与 HR 谈薪资?
  19. 洛谷 P2884 【[USACO07MAR]每月的费用Monthly Expense】
  20. 决战面试(二)智力题考察

热门文章

  1. 阿里云的oss删除低频访问的文件处理方式
  2. android 适配工具
  3. OpenHarmony音量管理开发
  4. 利用 Javascript 通过几个循环操作打印一个棱形
  5. 微信小程序之提示框弹框
  6. spacedesk-笔记本、平板、扩展屏幕-解决平板字体太小的问题
  7. SpringBoot自定义banner小彩蛋
  8. chromedriver SSL报错解决方案
  9. 蓝欣投票软件自助投票器_为什么我们不能开发有效的投票软件
  10. python open函数默认路径_Python open函数打开文件路径