Bootstrap

量化策略百战案例之均线策略

量化策略百战案例 ByQuant.com

ByQuant量化策略之均线策略

策略介绍

均线策略基于价格与移动均线之间的关系来判断买卖时机。
移动均线策略采用均线指标,简单移动均线指标只使用一个均线周期或多个来产生买卖信号。策略基于价格与移动均线之间的关系来判断买卖时机。

算法公式

简单移动平均线(SMA)的计算公式如下:

SMA = (P1 + P2 + P3 + … + Pn) / n

其中,P1、P2、P3等表示某一时期的价格,n表示计算移动平均的周期。

import byquant as by
alldata = by.data.quote('美股代码',start='2001-01-01',end='2023-07-30', freq='1d',cachetime=0)
data=alldata.copy()[-2080:]
data.tail()
openhighlowclosevolume
datetime
2023-07-24 04:00:00193.410004194.910004192.250000192.75000045377800
2023-07-25 04:00:00193.330002194.440002192.919998193.61999537283200
2023-07-26 04:00:00193.669998195.639999193.320007194.50000047471900
2023-07-27 04:00:00196.020004197.199997192.550003193.22000147460200
2023-07-28 04:00:00194.669998196.630005194.139999195.83000248291400
import byquant as by
alldata = by.data.quote('数字代码',start='2001-01-01',end='2023-06-30', freq='1d',cachetime=0)
data=alldata.copy()[-2080:]
data.tail()
openhighlowclosevolume
datetime
2023-06-2630467.630661.029913.230267.611178.157336
2023-06-2730267.730999.030230.130692.911143.359314
2023-06-2830693.030708.929843.030073.010040.239880
2023-06-2930072.930839.930047.330453.58671.248612
2023-06-3030453.631290.029419.030475.527585.731305
import byquant as by
alldata = by.data.quote('沪深代码',start='2001-01-01',end='2023-06-30', freq='1d',cachetime=0)
data=alldata.copy()[-2080:]
data.tail()
openhighlowclosevolume
datetime
2023-06-25 16:00:001694.1021601703.8426391669.3718341683.1601562399268
2023-06-26 16:00:001684.1351691693.6983161674.3848311685.1791991517446
2023-06-27 16:00:001687.2770621707.7822141685.1299701702.2471921857356
2023-06-28 16:00:001704.8275671708.7572291687.1095821687.7989501423116
2023-06-29 16:00:001700.0000001708.9899901686.4799801691.0000002045869
#计算平均线的周期。
period = 20
#表示计算a的b日移动平均
sma = by.ta.SMA(data,period = period)
print(sma)
datetime
2019-05-20 16:00:00            NaN
2019-05-21 16:00:00            NaN
2019-05-22 16:00:00            NaN
2019-05-23 16:00:00            NaN
2019-05-26 16:00:00            NaN
                          ...     
2023-06-25 16:00:00    1669.717548
2023-06-26 16:00:00    1670.726556
2023-06-27 16:00:00    1672.665790
2023-06-28 16:00:00    1674.902448
2023-06-29 16:00:00    1679.238885
Length: 1000, dtype: float64

策略逻辑

价格上下穿过均线时,发出买卖入信号

  1. 初始化策略,设置移动均线周期;
  2. 在每个时间步骤中,检查当前价格是否上穿或下穿移动均线;
  3. 当价格上穿均线时,发出买入信号;
  4. 当价格下穿均线时,发出卖出信号;
  5. 再次进入下一个时间步骤,重复上述步骤。
by.chart.line(data=data['close'], label="Close")
by.chart.line(data=sma, label="SMA")
<Axes: xlabel='datetime', ylabel='close'>

在这里插入图片描述

by.chart.close()

策略回测

class SMAStrategy(by.Strategy):
    params = (
        ('sma_period', 20),  # 移动均线周期
    )
    def __init__(self):
        self.sma = by.ta.SMA(self.data.close, period=self.p.sma_period)

    def next(self):
        #self.log(f"short_ma:{self.short_ma[0]}")
        if self.data.close[0] > self.sma[0] and self.data.close[-1] < self.sma[-1]:
            # 执行买入操作
            self.buy()
        elif self.data.close[0] < self.sma[0] and self.data.close[-1] > self.sma[-1]:
            # 执行卖出操作
            self.sell()

by.Backtest(data,strategy=SMAStrategy,out='p').byrun() 
Start date2019-05-20
End date2023-06-29
Total months47
Backtest
Annual return-0.01%
Cumulative returns-0.041%
Annual volatility0.329%
Sharpe ratio-0.03
Calmar ratio-0.02
Stability0.11
Max drawdown-0.592%
Omega ratio0.99
Sortino ratio-0.04
Skew0.42
Kurtosis6.90
Tail ratio0.86
Daily value at risk-0.042%
Gross leverage0.01
Daily turnover21.197%
Worst drawdown periodsNet drawdown in %Peak dateValley dateRecovery dateDuration
00.592019-07-232021-01-312021-08-19543
10.422022-10-302023-02-19NaTNaN
20.342022-03-142022-09-262022-10-26163
30.172021-08-192021-12-292022-01-12105
40.122022-01-162022-01-202022-03-0635
Stress Eventsmeanminmax
Covid0.00%-0.11%0.12%
Top 10 long positions of all timemax
Top 10 short positions of all timemax
Symbol-2.07%
Top 10 positions of all timemax
Symbol2.07%

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

策略优缺

优点:

  1. 简单易懂:均线策略基于移动平均线的交叉,概念简单,容易理解和实施。
  2. 定义趋势:均线策略可以帮助识别市场趋势,例如通过短期均线上穿长期均线来确认上升趋势,或者下穿来确认下降趋势。
  3. 适应市场:均线策略对于不同市场和品种通常都适用,无论是股票、外汇、期货等,都可以使用均线策略进行分析和交易。

缺点:

  1. 延迟性:均线策略的一个主要缺点是其延迟性,由于使用历史价格数据计算移动平均线,因此策略的信号通常滞后于价格变动。这可能导致错过部分行情或产生过多的交易信号。
  2. 假信号:在市场没有明确趋势时,均线策略可能会产生一些假信号,导致频繁交易和亏损。
  3. 无法适应非趋势市场:当市场处于横盘或震荡行情时,均线策略往往无法有效应对,容易产生错误的交易信号。

均线策略具有简单易懂、定义趋势和适应市场的优点,但也存在延迟性、假信号、无法适应非趋势市场和需要适当参数设置等弊端。

在实践中,可以结合其他技术指标和策略进行综合分析和决策。

培训支持

谢谢参与!

ByQuant量化策略培训系列课程

;