经典策略分析03(SuperMind&backtrader)

用户头像股市不死小强ZHH
2023-04-28 发布

单均线策略(SuperMind云回测)

一、均线原理

单均线策略的核心指标是简单移动平均线,简称均线。

均线由美国投资专家葛兰威尔所创立,由道氏股价分析理论的“三种趋势说”演变而来,从数字的变动中去预测股价未来短期、中期、长期的变动方向,为投资决策提供依据。

按照周期长短划分,均线可以分为短期均线、中期均线、长期均线三种基本类型。

  1. 短期均线:5、7、10,用于预测短期走势,MA5 和 MA10 又称为短期监测线;

  2. 中期均线:20、30、60,用于预测中期走势,MA20 和 MA30 又称为警戒线, MA60 则称之为生死线;

  3. 长期均线: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('一天结束')

三、回测结果

评论

需要帮助?

试试AI小助手吧