双均线策略

Posted 杨东冀@pku

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双均线策略相关的知识,希望对你有一定的参考价值。

双均线策略中,如果两根均线的周期接近,比如5日线,10日线,这种非常容易缠绕,不停的产生买点卖点,会有大量的无效交易,交易费用很高。如果两根均线的周期差距较大,比如5日线,60日线,这种交易周期很长,趋势性已经不明显了,趋势转变以后很长时间才会出现买卖点。也就是说可能会造成很大的亏损。所以两个参数选择的很重要,趋势性越强的品种,均线策略越有效。


双均线策略,通过建立m天移动平均线,n天移动平均线,则两条均线必有交点。若m>n,n天平均线“上穿越”m天均线则为买入点,反之为卖出点。该策略基于不同天数均线的交叉点,抓住股票的强势和弱势时刻,进行交易。
一、均线
均线嘛,就是均线嘛。
对于每一个交易日,都可以计算出前N天的移动平均值,然后把这些移动平均值连起来,成为一条线,就叫做N日移动平均线。
比如前5个交易日的收盘价分别为10,9,9,10,11元,那么,5日的移动平均股价为9.8元。同理,如果下一个交易日的收盘价为12,那么在下一次计算移动平均值的时候,需要计算9,9,10,11,12元的平均值,也就是10.2元。
将这平均值连起来,就是均线。
如下图所示,收盘价是蓝线,橙色的线表示5日的移动平均线。


可以看到股票价格的波动比5天均线的波动要大,这是因为5天均线取的是前5个交易日的均值,相当于做了一个平滑。

二、双均线
顾名思义就是两条天数不同的移动平均线,比如说,一条是5天的移动平均线,另一条是10天的移动平均线。如图,蓝色的是5天均线,黄色的是10天均线。

三、金叉和死叉
由时间短的均线(如上图蓝色的线)在下方向上穿越时间长一点的均线(如上图黄色的线),为“金叉”,反之为“死叉”。
好了,现在可以构建一个简单的策略:我们认为,双均线金叉的时候,表明股票很强势,反之很弱势,我们就在强势的时候买一个好了,弱势的时候卖掉好了。
说了这么多,下面我们开始实战!

'''
双均线策略,当五日均线位于十日均线上方则买入,反之卖出。
'''

## 初始化函数,设定要操作的股票、基准等等
def initialize(context):
    # 定义一个全局变量, 保存要操作的股票
    # 000002(股票:万科A)
    g.security = '601000.XSHG'
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # True为开启动态复权模式,使用真实价格交易
    set_option('use_real_price', True) 
    # 设定成交量比例
    set_option('order_volume_ratio', 1)
    # 股票类交易手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
    set_order_cost(OrderCost(open_tax=0, close_tax=0.001, \\
                             open_commission=0.0003, close_commission=0.0003,\\
                             close_today_commission=0, min_commission=5), type='stock')
    # 运行函数
    run_daily(trade, 'every_bar')

## 交易程序
def trade(context):
    security = g.security
    # 设定均线窗口长度
    n1 = 5
    n2 = 10
    # 获取股票的收盘价
    close_data = attribute_history(security, n2+2, '1d', ['close'],df=False)
    # 取得过去 ma_n1 天的平均价格
    ma_n1 = close_data['close'][-n1:].mean()
    # 取得过去 ma_n2 天的平均价格
    ma_n2 = close_data['close'][-n2:].mean()
    # 取得当前的现金
    cash = context.portfolio.cash

    # 如果当前有余额,并且n1日均线大于n2日均线
    if ma_n1 > ma_n2:
        # 用所有 cash 买入股票
        order_value(security, cash)
        # 记录这次买入
        log.info("Buying %s" % (security))

    # 如果n1日均线小于n2日均线,并且目前有头寸
    elif ma_n1 < ma_n2 and context.portfolio.positions[security].closeable_amount > 0:
        # 全部卖出
        order_target(security, 0)
        # 记录这次卖出
        log.info("Selling %s" % (security))

    # 绘制n1日均线价格
    record(ma_n1=ma_n1)
    # 绘制n2日均线价格
    record(ma_n2=ma_n2)

老师,可以了嘛?
当然不行,有时候我们也许会根据自己的需要对一些现有的策略进行改造,比如说,我想对均线进行加权呢?我想改造一个指数均线呢?
那我们得自己实现一下均线函数。方法不难,获得前N天的收盘价,然后计算一个算术平均数就可以了,各位读者可以先自己进行尝试,也可以参考回测代码块5(里面有代码和注释)
接下来,如果你想挑战更高难度,可以试一下计算指数移动平均的函数。
指数移动平均和算术平均或者加权平均的主要区别在于指数移动平均需要进行一个迭代,因此这可能是个有点挑战的地方:

其中pi表示前一天的收盘价,且
α=(N-1)/(N+1)
写出来没?如果没写出来的话可以参考回测代码块3和4(里面有代码和注释)
怎么样?是不是有点挑战性?如果写出这样的子函数,那么在主程序里面只要改一下函数输入参数,就可以轻松的在不同的参数之间来回切换,比较收益。

四、多股票
除了改为指数移动平均线以外,还加入多股票实现方法。
在交易日前,同时对多个股票进行判断,哪只金叉了就买入,死叉了就卖出,按日进行判断和交易。最大可以同时持有N只股票,用于实现这个策略的主函数可以参考回测代码块1和2。

以上是关于双均线策略的主要内容,如果未能解决你的问题,请参考以下文章

WeQuant交易策略—简单均线

开发一组交易信号--K线与10均线的关系

WeQuant交易策略—5日均线

量化交易——双均线策略(金叉死叉)

Python量化交易策略--双均线策略及代码

双均线策略