相关知识
数据来源
现在暂时使用了聚宽的数据。相关的日K和小时K的拉取在API文档里面可以找到,也可以在我的GitHub里面找到拉取的代码,代码很乱,随便看看就好。
具体公式
主要是三个计算:
- 12日的EMA
- 26日的EMA
- 9日的MACD
从EMA(指数移动平均)公式可以看到:
S
t
=
{
Y
1
,
t = 1
α
∗
Y
t
+
(
1
−
α
)
∗
Y
t
−
1
,
t > 1; while
α
=
2
N
+
1
S_t = \begin{cases} Y_1, & \text {t = 1} \\ \alpha*Y_t + (1 - \alpha) * Y_{t-1}, & \text {t > 1; while } \alpha = \frac{2}{N+1} \end {cases}
St={Y1,α∗Yt+(1−α)∗Yt−1,t = 1t > 1; while α=N+12
其中,N就代表的是12和26
我们就可以用这个公式把周期为12(代称为快线)和周期为26(慢线)的K线EMA算出来,为什么说周期K线而不是日K,因为K线还有其他的周期,比如短线的分钟线,和中线的周线,长线的月线,季线。所以应该说是[60min | 日 | 周 | 月 | 季]的K线的快\慢线。
然后可以用快慢线来计算出DIFF
D
I
F
F
=
E
M
A
(
C
,
12
)
−
E
M
A
(
C
,
26
)
DIFF = EMA(C, 12) - EMA(C, 26)
DIFF=EMA(C,12)−EMA(C,26)
最后算出DIFF9日的DEA线:
D
E
A
=
E
M
A
(
D
I
F
F
,
9
)
DEA = EMA(DIFF, 9)
DEA=EMA(DIFF,9)
实现
实现部分具体可以看代码,在strategy里面,Python和C++的都有,用C++再写一遍主要是Python实在慢,一只票还好,3600只就有点扛不住了,但是具体逻辑是一样的:主要就是逐行读csv文件,然后计算DIFF线和MACD线,并且求出它们的交叉情况。
简单策略
根据MACD的金死叉规则,然后写了一个tracker来跟踪具体的Profit and Lost,代码里面有一个pnl_tracker,可以自行设置初始资金,手续费,每次信号来临时买入的手数,回测07年到现在的数据。
结论
光根据MACD线来当作交易信号不太理想,特别是在盘整行情中频繁出现交易信号的时候,MACD只能作为一个参考指标来使用。