打造属于自己的量化投资系统4——利用backtrader创建指数平均数指标

1.指数平均数指标(EXPMA或EMA)

指数平均数指标(Exponential Moving Average,EXPMA或EMA) EXPMA=(当日或当期收盘价-上一日或上期EXPMA)/N+上一日或上期EXPMA,其中,首次上期EXPMA值为上一期收盘价,N为天数。

从EXPMA指标的构造原理和它的使用原则来看,这一指标更接近于均线指标,而且由于EXPMA指标通过对参数进行有效地设定,可以发挥出比均线指标更为直观和有用的信息。

 '''#指数平均数指标
       公式:EXPMA=(当日或当期收盘价-上一日或上期EXPMA)/N+上一日或上期EXPMA,其中,首次上期EXPMA值为上一期收盘价,N为天数
           self.smfactor -> 2 / (1 + period)
           self.smfactor1 -> `1 - self.smfactor`
           movav = prev * (1.0 - smoothfactor) + newdata * smoothfactor
    '''
    
    def __init__(self):
        #ema源码位于indicators\ema.py
        #指标必须要定义在策略类中的初始化函数中
        self.ema=bt.ind.MovingAverageExponential(period=15)
        
    def next(self):
        #self.data.close是表示收盘价
        #收盘价大于ema,买入
        if self.data.close>self.ema:
            self.buy()
        
        #收盘价小于等于ema,卖出
        if self.data.close<=self.ema:
            self.sell()
2.EXPMA指标应用原则
a.在上升行情中,K线、短期EXPMA线、长期EXPMA线从高到低依次排列时,视为多头特征;在下调行情中,长期EXPMA线、短期EXPMA线、K线从高到低依次排列时,视为空头特征。

b.当短期EXPMA线从下而上穿越长期EXPMA线时,一般视其为买入信号,此时短期EXPMA线对价格走势将起到助涨的作用。当短期EXPMA线从上而下穿越长期EXPMA线时,一般视其为卖出信号,此时长期EXPMA线对价格走势将起到助跌的作用。

3.EXPMA指标的市场意义

a. 该指标一般为中短线选股指标,比较符合以中短线为主的投资者,据此信号买入者均有获利机会,但对中线投资者来说,其参考意义似乎更大,主要是因为该指标稳定性大,波动性小。

b. 若白线和黄线始终保持距离地上行,则说明该股后市将继续看好,每次股价回落至白线附近,只要不击穿黄线,则这种回落现象便是良好的买入时机。

c、对于卖出时机而言,还是不要以EXPMA指标形成死叉为根据,因为该指标有一定的滞后性,可以超级短线指标为依据,一旦某只个股形成死叉时,则是中线离场信号。

# -*- 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框架

#指数平均数指标
#买入与卖出算法:
#   收盘价大于ema,买入
#   收盘价小于等于ema,卖出


class StrategyClass(bt.Strategy):
    '''#指数平均数指标
       公式:EXPMA=(当日或当期收盘价-上一日或上期EXPMA)/N+上一日或上期EXPMA,其中,首次上期EXPMA值为上一期收盘价,N为天数
           self.smfactor -> 2 / (1 + period)
           self.smfactor1 -> `1 - self.smfactor`
           movav = prev * (1.0 - smoothfactor) + newdata * smoothfactor
    '''
    
    def __init__(self):
        #sma源码位于indicators\ema.py
        #指标必须要定义在策略类中的初始化函数中
        self.ema=bt.ind.MovingAverageExponential(period=15)
        
    def next(self):
        #self.data.close是表示收盘价
        #收盘价大于ema,买入
        if self.data.close>self.ema:
            self.buy()
        
        #收盘价小于等于ema,卖出
        if self.data.close<=self.ema:
            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()

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值