打造属于自己的量化投资系统3——利用backtrader创建加权移动平均线策略

1.加权移动平均线定义

加权移动平均线 (Weigted Moving Average,WMA ) 将过去某特定时间内的价格取其平均值,它比重以平均线的长度设定,愈近期的收市价,对市况影响愈重要。计算方式是基于加权移动平均线日数,将每一个之前日 数比重提升。每一价格会乘以一个比重,最新的价格会有最大的比重,其之前的每一日的比重将会递减。

2.加权移动平均线的加权方式

加权的原因是基于移动平均线中,最近一日的收盘价对未来价格波动的影响最大,因此赋予它较大的权值。加权方式分为四种:

a.末日加权移动平均线:

计算公式:
在这里插入图片描述

b.线性加权移动平均线:

计算公式:
在这里插入图片描述
  =(c11+c22+…+cn*n)/((1+n)*n/2)=2/((1+n)*n)

'''#加权移动平均线策略(线性加权移动平均线)
        公式:2/((1+n)*n)*(c1*1+c2*2+....+cn*n)
      - weights = range(1, period + 1)
      - coef = 2 / (period * (period + 1))=
      - movav = coef * Sum(weight[i] * data[period - i] for i in range(period))
     
  '''
    
    def __init__(self):
        #wma源码位于indicators\wma.py
        #指标必须要定义在策略类中的初始化函数中
        #加权移动平均线
        self.wma=bt.ind.WeightedMovingAverage(period=15)
        
    def next(self):
        #self.data.close是表示收盘价
        #收盘价大于wma,买入
        if self.data.close>self.wma:
            self.buy()
        
        #收盘价小于等于wma,卖出
        if self.data.close<=self.wma:
            self.sell()
c.梯型加权移动平均线:

计算方法(以5日为例):
[(第1日收盘价+第2日收盘价)×1+(第2日收盘价+第3日收盘价)×2+(第3日收盘价+第4日收盘价)×3+(第4日收盘价+第5日收盘价)×4]/(2×1+2×2+2×3+2×4),即为第五日的阶梯加权移动平均线。

d.平方系数加权移动平均线:

公式(以5日为例):
MA=[(第1日收盘价×1×1)+( 第2日收盘价×2×2)+( 第3日收盘价×3×3)+( 第4日收盘价×4×4)+( 第5日收盘价×5×5)]/(1×1+2×2+3×3+4×4+5×5)

3.加权移动平均线的公式

在这里插入图片描述
W(t)=weight factor Close(t)=收盘价

4.加权移动平均线案例
# -*- coding: utf-8 -*-
"""
Created on Wed May 13 14:37:09 2020

@author: 觉醒2020
"""


from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import datetime
import backtrader as bt # 引入backtrader框架


#加权移动平均线策略
#买入与卖出算法:
#   收盘价大于wma,买入
#   收盘价小于等于wma,卖出


class StrategyClass(bt.Strategy):
    '''#加权移动平均线策略(线性加权移动平均线)
        公式:2/((1+n)*n)*(c1*1+c2*2+....+cn*n)
      - weights = range(1, period + 1)
      - coef = 2 / (period * (period + 1))=
      - movav = coef * Sum(weight[i] * data[period - i] for i in range(period))
     
    '''
    
    def __init__(self):
        #wma源码位于indicators\wma.py
        #指标必须要定义在策略类中的初始化函数中
        #加权移动平均线
        self.wma=bt.ind.WeightedMovingAverage(period=15)
        
    def next(self):
        #self.data.close是表示收盘价
        #收盘价大于wma,买入
        if self.data.close>self.wma:
            self.buy()
        
        #收盘价小于等于wma,卖出
        if self.data.close<=self.wma:
            self.sell()
            

cerebro=bt.Cerebro()
datapath=".\\datas\\test\\000001.XSHE"
data=bt.feeds.GenericCSVData(dataname=datapath,
                             fromdate = datetime.datetime(2018, 1, 1),
                             todate = datetime.datetime(2020, 3, 20),
                             nullvalue=0.0,
                             dtformat=('%Y-%m-%d'),
                             datetime=0,
                             high=3,
                             low=4,
                             open=1,
                             close=2,
                             volume=5,
                             openinterest=-1)
cerebro.adddata(data)

cerebro.addstrategy(StrategyClass)
#设置金额,默认是100000
cerebro.broker.set_cash(200000)
cerebro.run(maxcpu=1)
cerebro.plot()

运行结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值