Bootstrap

量化交易学习(10)均线交叉策略

均线介绍

均线计算:

在某一时间段的收盘价之和进行算术平均的方法,并随着时间的推移将这些平均值连成一条线便可得出SMA。

趋势判断

均线在某一时间段里是向上移动的,它表面股票价格处于上升趋势中,即“牛市”,或即将“大涨”的趋势。
相反的,如果SMA向下移动,则是“熊市”或下跌趋势的指示标志。

支持与压力

当股价触及阻力点或支撑位后不再突破,这表明股票价格将不再下跌或上涨,这可能是开始回升或者下跌的信号。
如果它突破了该阻力点或支撑位,则意味着价格会继续向上或向下变动,表明股价很可能持续地大幅上涨或下跌。

均线交叉策略

  • 信号

两条均线形成死叉入场(快sma<慢sam)
两条均线形成金叉平仓 (快sma<慢sam)

回测策略

  • 参数
ItemVale
数据BNBUSDT_1h
时间2017.11.11 - 2022.07.08
快SMA100
慢SMA300
收益率135159.37%
  • 回测结果
    在这里插入图片描述

  • 年化率

  • 在这里插入图片描述

在这里插入图片描述

优化策略参数

ItemVale
数据BNBUSDT_1h
时间2017.11.11 - 2022.07.08
参数空间10-400
快SMA350
慢SMA390
收益率2045148.40%
  • 回测结果

在这里插入图片描述

  • 年化
    在这里插入图片描述

在这里插入图片描述

  • 其他数据表表现
还在测试中

代码

from strategy import *


class SmaCrossStrategy(bt.Strategy):
    params = dict(
        sma1=30,  # 需要优化的参数1,短期均线窗口
        sma2=200,  # 需要优化的参数2,长期均线窗口
        is_log=False  # 是否打印日志
    )

    def log(self, txt, dt=None):
        if self.p.is_log:
            dt = dt or self.datas[0].datetime.date(0)
            print('%s,%s' % (dt.isoformat(), txt))

    def __init__(self):
        sma1 = bt.ind.SMA(period=int(self.params.sma1))  # 用int取整
        sma2 = bt.ind.SMA(period=int(self.params.sma2))  # 用int取整
        self.crossover = bt.ind.CrossOver(sma1, sma2)

        self.order = None

    def get_buy_unit(self):
        size = self.broker.getcash() / self.data.high[0] * 0.5
        if size == 0:
            size = 1
        return size

    def next(self):
        if self.order:
            return
        if not self.position:  # 不在场内,则可以买入
            if self.crossover[0] < 0:  # 死叉
                size = self.get_buy_unit()
                self.order = self.buy(size=size)  # 买入

        else:
            if self.crossover[0] > 0:  # 金叉
                self.close()  # 卖出

    def notify(self, order):
        if order.status in [order.Completed, order.Canceled, order.Margin]:
            if order.isbuy():
                self.log('执行买入, %.2f' % order.executed.price)
            elif order.issell():
                self.log('执行卖出, %.2f' % order.executed.price)

        self.order = None


def create_sma_cross_strategy(params=None):
    c = create_cerebro()
    if params is None:
        c.addstrategy(SmaCrossStrategy)
    else:
        c.addstrategy(SmaCrossStrategy,
                      sma1=int(params["sma1"]),
                      sma2=int(params["sma2"]))
    return c


if __name__ == '__main__':
    path = "D:\\work\\git\\Tools\\static\\data\\BNBUSDT_1h.csv"
    data = get_data(path)
    params = {
        'sma1': "350",
        'sma2': '390'
    }
    run_strategy(create_strategy_func=create_sma_cross_strategy, data=data, params=params, is_show=True)
    path = show_strategy_analyze(data,
                                 create_strategy_func=create_sma_cross_strategy,
                                 params=params,
                                 is_show=True)

    print(path)
    path = show_strategy_pyfolio(data,
                                 create_strategy_func=create_sma_cross_strategy,
                                 params=params,
                                 is_show=True)
    print(path)

总结

目前从回测结果来看,该策略表现还行,把周期调大,减少市场干扰,减少开仓的次数,较小市场的波动,可持续性盈利。未来10年,实现财富自由,加油!!!!

;