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()
运行结果