周五发了MACD金叉死叉上涨下跌概率回测的这篇文章,当时看了结果还挺高兴,以为找到了MACD金叉死叉有用的证明😅。今天早上有朋友留言问『概率是不是很小,百分之0.几的概率』,我突然发现当时只统计了上涨和下跌的幅度,没有统计上涨下跌的概率。
然后今天就去改了下代码,统计了一下概率。然后就发现,数据不太对啊:
图片中是近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
试想一下下面这种情况:
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=[] with open (file_name, mode="r" , encoding="utf-8" ) as file: csv_reader = csv.reader(file) header = next (csv_reader) for row in csv_reader: data.append(dict (zip (header, row))) for i in range (len (data)): 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个月:
1年:
2年:
3年:
5年:
从结果上看,金叉之后不一定涨,死叉之后不一定跌😭,金叉后上涨的概率比下跌的概率高,死叉后上涨的概率比下跌的概率低。
所以,MACD金叉死叉有一定的参考作用,它可以用来判断当前行情的好坏,如果有很多ETF在同一时间段金叉说明现在行情比较好,如果有很多死叉说明行情不好,但并不能预测接下来是否真的能上涨或下跌。
希望这篇文章能帮助到大家。如果你有任何问题或建议,欢迎留言讨论,私信。感谢你的阅读,觉得不错,点个赞哦!还没有关注我的朋友可以关注 江达小记