量化策略百战案例 ByQuant.com
ByQuant量化策略之动量策略
策略介绍
动量策略基于市场上的动量效应进行交易决策。
该策略的核心理念是,过去表现好的资产会继续表现良好,而过去表现差的资产则会继续表现糟糕。
动量策略的目标是通过买入过去表现好的资产并卖出过去表现差的资产来获取超额收益。
算法公式
MACD指标由两条移动均线和一条信号线组成。计算MACD指标的公式如下:
- 计算短期移动平均线(Short Moving Average,SMA)
SMA(短期)= (最近n天的收盘价之和)/ n - 计算长期移动平均线(Long Moving Average,LMA)
LMA(长期)= (最近m天的收盘价之和)/ m - 计算离差值(DIF)
DIF = SMA(短期)- LMA(长期) - 计算DIF的n天移动平均线,即MACD线
MACD = (DIF的n天移动平均) - 计算信号线(Signal Line):
Signal Line = MACD的n天移动平均线
import byquant as by
data = by.data.quote('标的代码',start='2021-01-01',end='2023-06-30', freq='1d', limit=100)
data.tail()
open | high | low | close | volume | |
---|---|---|---|---|---|
datetime | |||||
2023-06-23 04:00:00 | 185.550003 | 187.559998 | 185.009995 | 186.679993 | 53079300 |
2023-06-26 04:00:00 | 186.830002 | 188.050003 | 185.229996 | 185.270004 | 48088700 |
2023-06-27 04:00:00 | 185.889999 | 188.389999 | 185.669998 | 188.059998 | 50730800 |
2023-06-28 04:00:00 | 187.929993 | 189.899994 | 187.600006 | 189.250000 | 51216800 |
2023-06-29 04:00:00 | 189.080002 | 190.070007 | 188.940002 | 189.589996 | 46347300 |
shortdata=data.copy()[-280:]
macd = by.ta.MACD(shortdata,fastperiod=12,slowperiod=26,signalperiod=9)
macd0=macd[0]
macd1=macd[1]
macd2=macd[2]
print(macd0)
datetime
2023-02-06 05:00:00 NaN
2023-02-07 05:00:00 NaN
2023-02-08 05:00:00 NaN
2023-02-09 05:00:00 NaN
2023-02-10 05:00:00 NaN
...
2023-06-23 04:00:00 3.655196
2023-06-26 04:00:00 3.505754
2023-06-27 04:00:00 3.571282
2023-06-28 04:00:00 3.676852
2023-06-29 04:00:00 3.744785
Length: 100, dtype: float64
by.chart.line(data=macd0, label="MACD")
by.chart.line(data=macd1, label="Signal")
by.chart.line(data=macd2, label="Histogram")
MACD指标输出数据的解读:
-
MACD线(MACD Line):MACD线是通过计算两个不同期间的指数移动平均线之间的差异得出的。通常是短期指数移动平均线(EMA)减去长期指数移动平均线(EMA)。MACD线的数值可以为正数、负数或零。当MACD线从负数变为正数时,通常被视为买入信号;而从正数变为负数时,通常被视为卖出信号。
-
信号线(Signal Line):信号线是MACD线的指数移动平均线,它帮助确定买入和卖出的时机。通常是MACD线的9日EMA。当MACD线上穿信号线时,通常被视为买入信号;而下穿信号线时,通常被视为卖出信号。
-
柱状图(Histogram):柱状图是MACD线和信号线之间的差异,用于衡量市场的动能。柱状图为正数表示MACD线高于信号线,为负数表示MACD线低于信号线。当柱状图从负数变为正数时,通常被视为买入信号;而从正数变为负数时,通常被视为卖出信号。//
一般来说,MACD指标输出的数据是以时间序列的形式呈现的,每个时间点都有对应的MACD线、信号线和柱状图的数值。通过观察这些数据,可以判断市场的趋势以及买卖信号。
策略逻辑
计算MACD快线、慢线计算差离值均线,然后判断交叉点
- 计算MACD指标的快线(一般为12天移动平均线)和慢线(一般为26天移动平均线);
- 计算MACD指标的差离值(快线与慢线之间的差异);
- 计算差离值的移动平均线(一般为9天移动平均线),称为信号线;
- 当差离值上穿信号线时,产生买入信号;
- 当差离值下穿信号线时,产生卖出信号。
策略回测
class MACDStrategy(by.Strategy):
params = (
('fastperiod', 12),
('slowperiod', 26),
('signalperiod', 9)
)
def __init__(self):
self.macd = by.ta.MACD(
self.datas[0],
fastperiod=self.p.fastperiod,
slowperiod=self.p.slowperiod,
signalperiod=self.p.signalperiod,
)
def next(self):
try:
if self.macd.macd[0] > self.macd.signal[0] and self.macd.macd[-1] < self.macd.signal[-1]: # MACD线上穿信号线
self.order = self.buy()
if self.macd.macd[0] < self.macd.signal[0] and self.macd.macd[-1] > self.macd.signal[-1]: # MACD线下穿信号线
self.order = self.sell()
except Exception as e:
print(e.args)
pass
by.Backtest(data,strategy=MACDStrategy,out='a').byrun()
策略优缺
优点:
-
趋势判断:MACD策略可以帮助判断市场的趋势,通过计算短期和长期指数移动平均线的差异,可以发现价格的变化趋势,包括上升趋势、下降趋势和震荡市场。
-
买入与卖出信号:MACD策略使用短期和长期指数移动平均线的交叉点来产生买入和卖出信号。当短期线上穿长期线时,产生买入信号;当短期线下穿长期线时,产生卖出信号。
-
适用性广泛:MACD策略适用于多种交易市场和品种,包括股票、外汇、期货等。它不限于特定的市场条件,可以用于不同的交易场景。
缺点:
-
延迟性:与其他基于移动平均线的策略类似,MACD策略存在延迟性。由于使用历史价格数据计算指数移动平均线,策略的信号通常滞后于市场价格的实际变动。这可能导致错过一部分行情或产生一些假信号。
-
假信号:在市场没有明确趋势时,MACD策略可能会产生一些假信号,导致频繁交易和亏损。特别是在震荡市场中,指标的交叉可能会频繁发生,但并不一定代表真实的买入或卖出机会。
-
参数选择:MACD策略的性能很大程度上取决于所选择的参数设置。选择不恰当的参数可能导致信号太频繁或太稀少,从而影响策略的有效性。
-
单一指标:MACD策略仅仅依赖于移动平均线的交叉来产生信号,缺乏其他技术指标的辅助,可能无法全面反映市场的复杂变化。
MACD策略具有趋势判断、买入与卖出信号的优点,但也存在延迟性、假信号、参数选择和单一指标等缺点。
在实际应用中,可以结合其他技术指标和策略进行综合分析和决策。
录播课程
量化策略百战案例之动量策略
培训支持
QQ群:691277892
谢谢参与!
ByQuant量化策略培训系列课程