• 量化交易学习(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%
    • 回测结果

    在这里插入图片描述

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

    在这里插入图片描述

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

    代码

    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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    总结

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

  • 相关阅读:
    藏在 Java 数组的背后,你可能忽略的知识点
    xdebug 远程调试 vsCode
    小程序使用腾讯位置插件获取当前位置
    最护眼的灯是白炽灯吗?专业的护眼台灯推荐
    QTday2
    【MindSpore】【BatchNorm1d】Fused batchnorm only support nchw input!
    vim 实用快捷键
    Windows系统下部署分布式SSM架构JAVA程序
    档案数字化管理能够带来哪些好处
    java毕业生设计医院管理系统计算机源码+系统+mysql+调试部署+lw
  • 原文地址:https://blog.csdn.net/weixin_43688870/article/details/126183579