量化策略百战案例 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()
open | high | low | close | volume | |
---|---|---|---|---|---|
datetime | |||||
2023-07-24 04:00:00 | 193.410004 | 194.910004 | 192.250000 | 192.750000 | 45377800 |
2023-07-25 04:00:00 | 193.330002 | 194.440002 | 192.919998 | 193.619995 | 37283200 |
2023-07-26 04:00:00 | 193.669998 | 195.639999 | 193.320007 | 194.500000 | 47471900 |
2023-07-27 04:00:00 | 196.020004 | 197.199997 | 192.550003 | 193.220001 | 47460200 |
2023-07-28 04:00:00 | 194.669998 | 196.630005 | 194.139999 | 195.830002 | 48291400 |
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()
open | high | low | close | volume | |
---|---|---|---|---|---|
datetime | |||||
2023-06-26 | 30467.6 | 30661.0 | 29913.2 | 30267.6 | 11178.157336 |
2023-06-27 | 30267.7 | 30999.0 | 30230.1 | 30692.9 | 11143.359314 |
2023-06-28 | 30693.0 | 30708.9 | 29843.0 | 30073.0 | 10040.239880 |
2023-06-29 | 30072.9 | 30839.9 | 30047.3 | 30453.5 | 8671.248612 |
2023-06-30 | 30453.6 | 31290.0 | 29419.0 | 30475.5 | 27585.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()
open | high | low | close | volume | |
---|---|---|---|---|---|
datetime | |||||
2023-06-25 16:00:00 | 1694.102160 | 1703.842639 | 1669.371834 | 1683.160156 | 2399268 |
2023-06-26 16:00:00 | 1684.135169 | 1693.698316 | 1674.384831 | 1685.179199 | 1517446 |
2023-06-27 16:00:00 | 1687.277062 | 1707.782214 | 1685.129970 | 1702.247192 | 1857356 |
2023-06-28 16:00:00 | 1704.827567 | 1708.757229 | 1687.109582 | 1687.798950 | 1423116 |
2023-06-29 16:00:00 | 1700.000000 | 1708.989990 | 1686.479980 | 1691.000000 | 2045869 |
#计算平均线的周期。
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
策略逻辑
价格上下穿过均线时,发出买卖入信号
- 初始化策略,设置移动均线周期;
- 在每个时间步骤中,检查当前价格是否上穿或下穿移动均线;
- 当价格上穿均线时,发出买入信号;
- 当价格下穿均线时,发出卖出信号;
- 再次进入下一个时间步骤,重复上述步骤。
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 date | 2019-05-20 | |
---|---|---|
End date | 2023-06-29 | |
Total months | 47 | |
Backtest | ||
Annual return | -0.01% | |
Cumulative returns | -0.041% | |
Annual volatility | 0.329% | |
Sharpe ratio | -0.03 | |
Calmar ratio | -0.02 | |
Stability | 0.11 | |
Max drawdown | -0.592% | |
Omega ratio | 0.99 | |
Sortino ratio | -0.04 | |
Skew | 0.42 | |
Kurtosis | 6.90 | |
Tail ratio | 0.86 | |
Daily value at risk | -0.042% | |
Gross leverage | 0.01 | |
Daily turnover | 21.197% |
Worst drawdown periods | Net drawdown in % | Peak date | Valley date | Recovery date | Duration |
---|---|---|---|---|---|
0 | 0.59 | 2019-07-23 | 2021-01-31 | 2021-08-19 | 543 |
1 | 0.42 | 2022-10-30 | 2023-02-19 | NaT | NaN |
2 | 0.34 | 2022-03-14 | 2022-09-26 | 2022-10-26 | 163 |
3 | 0.17 | 2021-08-19 | 2021-12-29 | 2022-01-12 | 105 |
4 | 0.12 | 2022-01-16 | 2022-01-20 | 2022-03-06 | 35 |
Stress Events | mean | min | max |
---|---|---|---|
Covid | 0.00% | -0.11% | 0.12% |
Top 10 long positions of all time | max |
---|
Top 10 short positions of all time | max |
---|---|
Symbol | -2.07% |
Top 10 positions of all time | max |
---|---|
Symbol | 2.07% |
策略优缺
优点:
- 简单易懂:均线策略基于移动平均线的交叉,概念简单,容易理解和实施。
- 定义趋势:均线策略可以帮助识别市场趋势,例如通过短期均线上穿长期均线来确认上升趋势,或者下穿来确认下降趋势。
- 适应市场:均线策略对于不同市场和品种通常都适用,无论是股票、外汇、期货等,都可以使用均线策略进行分析和交易。
缺点:
- 延迟性:均线策略的一个主要缺点是其延迟性,由于使用历史价格数据计算移动平均线,因此策略的信号通常滞后于价格变动。这可能导致错过部分行情或产生过多的交易信号。
- 假信号:在市场没有明确趋势时,均线策略可能会产生一些假信号,导致频繁交易和亏损。
- 无法适应非趋势市场:当市场处于横盘或震荡行情时,均线策略往往无法有效应对,容易产生错误的交易信号。
均线策略具有简单易懂、定义趋势和适应市场的优点,但也存在延迟性、假信号、无法适应非趋势市场和需要适当参数设置等弊端。
在实践中,可以结合其他技术指标和策略进行综合分析和决策。
培训支持
谢谢参与!
ByQuant量化策略培训系列课程