单均线策略(SuperMind云回测)
一、均线原理
单均线策略的核心指标是简单移动平均线,简称均线。
均线由美国投资专家葛兰威尔所创立,由道氏股价分析理论的“三种趋势说”演变而来,从数字的变动中去预测股价未来短期、中期、长期的变动方向,为投资决策提供依据。
按照周期长短划分,均线可以分为短期均线、中期均线、长期均线三种基本类型。
短期均线:5、7、10,用于预测短期走势,MA5 和 MA10 又称为短期监测线;
中期均线:20、30、60,用于预测中期走势,MA20 和 MA30 又称为警戒线, MA60 则称之为生死线;
长期均线:120、250,用于长期走势,MA120 又称为确认线,MA250 则通常被看做反转线,又称为牛熊分界线。
计算均线的价格常常会用到股票收盘价
计算均线需要先设置均线周期,将均线周期设置为20日,就能进入下面的计算:
(1)将第 1-20个交易日的收盘价求和,除以 20,就能得到第一个均价;
(2)向后移动一个交易日,再将第 2-21 个交易日的收盘价求和,除以 20,得到第二个均价;
(3)重复以上步骤,将得到的所有均价连成一条线,就生成了 上图中的20日均线。
均线计算:
(1) pandas: df[MA20] = df['Close'].rolling(20).mean()
(2) talib:df["SMA20"]=talib.SMA(df['close'],timeperiod=20)
(3) SuperMind:
close_data = get_price(security, count=g.d20, unit='1d', fields=['close']) MA20 = close_data['close'].mean() (4) backtrader:
self.ma20 = bt.indicators.MovingAverageSimple(self.datas[0], period=self.params.maperiod) 单均线策略核心内容 单均线策略核心内容就是「简单判断股票价格的趋势以及买入、卖出的时间点」。 理论依据是:葛兰威尔买卖八大法则
1买: 平均线从下降逐渐走平转为上升,而股价从平均线的下方突破平均线时,为买进信号。
1卖: 平均线走势从上升逐渐走平转为下跌,而股价从平均线的上方往下跌破平均线时,是卖出信号。
将以20日均线为例。
买点:昨天 20 日均价小于今日 20 日均价(20 日均线向上),收盘价上穿今日 20 日均价,则大概率认为股票价格在未来一段时间内上涨;如果没有持仓,第二天开盘买入。
卖点:昨天 20 日均价大于今日 20 日均价(20 日均线向下),收盘价下穿今日 20 日均价,则大概率认为股票价格在未来一段时间内下跌;如果持仓,第二天开盘卖出。
二、 策略源代码:
'''
5日和10日双均线策略:
如果5日均线大于20日均线,且账户当前无持仓,则全仓买入股票
如果5日均线小于20日均线,且账户当前有股票市值,则清仓股票
'''
# 初始化函数,全局只运行一次
def init(context):
# 设置基准收益:沪深上证
set_benchmark('000001.SH')
# 打印日志
log.info('策略开始运行,初始化函数全局只运行一次')
# 设置股票每笔交易的手续费为万分之二(手续费在买卖成交后扣除,不包括税费,税费在卖出成交后扣除)
set_commission(PerShare(type='stock',cost=0.0002))
# 设置股票交易滑点0.5%,表示买入价为实际价格乘1.005,卖出价为实际价格乘0.995
set_slippage(PriceSlippage(0.005))
# 设置日级最大成交比例25%,分钟级最大成交比例50%
# 日频运行时,下单数量超过当天真实成交量25%,则全部不成交
# 分钟频运行时,下单数量超过当前分钟真实成交量50%,则全部不成交
set_volume_limit(0.25,0.5)
# 设置要操作的股票:比亚迪
g.security = '002594.SZ'
# 回测区间、初始资金、运行频率请在右上方设置
g.d5 = 5
g.d20 = 20
#每日开盘前9:00被调用一次,用于储存自定义参数、全局变量,执行盘前选股等
def before_trading(context):
# 获取日期
date = get_datetime().strftime('%Y-%m-%d %H:%M:%S')
# 打印日期
log.info('{} 盘前运行'.format(date))
## 开盘时运行函数
def handle_bar(context, bar_dict):
# 获取时间
time = get_datetime().strftime('%Y-%m-%d %H:%M:%S')
# 打印时间
log.info('{} 盘中运行'.format(time))
# 获取股票过去20天的收盘价数据
closeprice = history(g.security, ['close'], g.d20, '1d', False, 'pre', is_panel=1)
# 计算20日均线
MA20 = closeprice['close'].mean()
# 计算5日均线
MA5 = closeprice['close'].iloc[-g.d5:].mean()
# 获取当前账户当前持仓市值
market_value = context.portfolio.stock_account.market_value
# 获取账户持仓股票列表
stocklist = list(context.portfolio.stock_account.positions)
# 如果5日均线大于10日均线,且账户当前无持仓,则全仓买入股票
if MA5 > MA20 and len(stocklist) ==0 :
# 记录这次买入
log.info("5日均线大于20日均线, 买入 %s" % (g.security))
# 按目标市值占比下单
order_target_percent(g.security, 1)
# 如果5日均线小于10日均线,且账户当前有股票市值,则清仓股票
elif MA20 > MA5 and market_value > 0:
# 记录这次卖出
log.info("5日均线小于10日均线, 卖出 %s" % (g.security))
# 卖出所有股票,使这只股票的最终持有量为0
order_target(g.security, 0)
## 收盘后运行函数,用于储存自定义参数、全局变量,执行盘后选股等
def after_trading(context):
# 获取时间
time = get_datetime().strftime('%Y-%m-%d %H:%M:%S')
# 打印时间
log.info('{} 盘后运行'.format(time))
log.info('一天结束')
三、回测结果