【勘误】量化交易学习(六十三)MACD金叉死叉上涨下跌概率回测

周五发了MACD金叉死叉上涨下跌概率回测的这篇文章,当时看了结果还挺高兴,以为找到了MACD金叉死叉有用的证明😅。今天早上有朋友留言问『概率是不是很小,百分之0.几的概率』,我突然发现当时只统计了上涨和下跌的幅度,没有统计上涨下跌的概率。

然后今天就去改了下代码,统计了一下概率。然后就发现,数据不太对啊:
6fbaa1a87441d703a60ee4575af0bf66.png
图片中是近5年的数据,以零上金叉为例,可以看到从一天到三天,这三天的上涨数+下跌数+持平数是不一样的!!!也就是样本中的股票数变化了。

为什么呢,我分析了一下代码,原来代码中统计各天数数据的这段有问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cnt=10
tp=''
base=0
for x in data:
if x['信号类型'] != '-':
cnt=0
base=float(x['收盘价'])
tp=x['信号类型']
else:
if cnt==1:
statistic[tp]['一天'].append((float(x['收盘价'])-base)/base)
if cnt==2:
statistic[tp]['二天'].append((float(x['收盘价'])-base)/base)
if cnt==3:
statistic[tp]['三天'].append((float(x['收盘价'])-base)/base)
cnt+=1

试想一下下面这种情况:
c94a030ce557ea78ddb59525e2b7bafa.png

2021年1月25日金叉,随后26号就死叉了,在原来的这段代码中,这个金叉对应的这三天数据就没有了,因为26号死叉了,上一个信号的数据就清零了。也就是说原来的统计代码会造成幸存者偏差,只有那些持续性好的金叉死叉数据会被统计到。

今天我改了一下代码,改成了每次读取csv文件后就统计金叉死叉后接下来三天的情况:

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
def read_csv_file(file_name,statistic):
"""
读取CSV文件,并返回包含数据的列表。
:param file_name: 文件名
:return: 包含数据的列表
"""
data=[]
# 打开一个文件对象,文件名为"input.csv",模式为读取('r'),并使用'utf-8'编码
with open(file_name, mode="r", encoding="utf-8") as file:
# 创建一个csv读取器对象
csv_reader = csv.reader(file)
# 获取CSV文件的表头
header = next(csv_reader)
# 遍历CSV文件中的每一行数据
for row in csv_reader:
# 将行数据转换为字典,并添加到列表中
data.append(dict(zip(header, row)))
for i in range(len(data)):
# print(data[i])
if data[i]['信号类型'] != '-':
cnt=0
base=float(data[i]['收盘价'])
tp=data[i]['信号类型']
for j in range(3):
if len(data)<=i+j+1:
break
x=data[i+j+1]
if cnt==0:
statistic[tp]['一天'].append((float(x['收盘价'])-base)/base)
if cnt==1:
statistic[tp]['二天'].append((float(x['收盘价'])-base)/base)
if cnt==2:
statistic[tp]['三天'].append((float(x['收盘价'])-base)/base)
cnt+=1

新的结果就没有问题了,不过如果金叉死叉时间离回测结束日期不足3天的话,还是会有少许失真。
下面是新的结果:
6个月:
e6cf954331f7c804a80d50a436fe9880.png

1年:
3023582a6ab33eea5ffe939c6f77ae2f.png

2年:
4f10da6b796547b4370ba2ae3869cfb3.png

3年:
929cca69c667a02d44973ad7d2ba02f4.png

5年:
0be9b09cec454548c45dc7b6c389ea8e.png

从结果上看,金叉之后不一定涨,死叉之后不一定跌😭,金叉后上涨的概率比下跌的概率高,死叉后上涨的概率比下跌的概率低。

所以,MACD金叉死叉有一定的参考作用,它可以用来判断当前行情的好坏,如果有很多ETF在同一时间段金叉说明现在行情比较好,如果有很多死叉说明行情不好,但并不能预测接下来是否真的能上涨或下跌。


希望这篇文章能帮助到大家。如果你有任何问题或建议,欢迎留言讨论,私信。感谢你的阅读,觉得不错,点个赞哦!还没有关注我的朋友可以关注 江达小记

江达小记