做套:惊呆了!探究如果机器用MACD法对股票进行做套的胜率,竟高达%80。
前言:
今天在整理自研量化系统的代码屎山时,无意间想记录一下如果仅仅严格按照MACD法对买入的股票进行做套,胜率将会是多少呢?
接下来就来尝试一下,首先得简单了解一下什么是MACD,这个我也不多解释了,“dddd”,所以简单百度百科一下:MACD称为异同移动平均线,是从双指数移动平均线发展而来的,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA)得到MACD柱。MACD的意义和双移动平均线基本相同,即由快、慢均线的离散、聚合表征当前的多空状态和股价可能的发展变化趋势,但阅读起来更方便。MACD的变化代表着市场趋势的变化,不同K线级别的MACD代表当前级别周期中的买卖趋势。
简单了解完之后就可以开始实现了:
-
第一步导入数据:
df = pd.read_csv("2021-11-19.csv")
这里用一下2021年11月19号的上证A股所有股票的日分钟数据
忽略’code’列股票代码显示不全的问题,从数据库备份转csv时没注意code特征列数值的属性,但对这次实验不造成影响,后期把“0”补回去就好了,就是csv保存时把前面的“0”都去掉了,数据量有54w条,足够大了。
-
构造计算MACD的函数
这里就需要用到macd的公式了
-
12日EMA的算式为
EMA(12)=前一日EMA(12)×11/13+今日收盘价×2/13
26日EMA的算式为
EMA(26)=前一日EMA(26)×25/27+今日收盘价×2/27
-
DIF=今日EMA(12)-今日EMA(26)
-
今日DEA(MACD)=前一日DEA×8/10+今日DIF×2/10
主要是计算EMA和DIF,EMA我使用pandas的ewm函数来计算
def EMA(arr): """ :param arr:价格列表 :return: """ df = pd.DataFrame(arr) return df.ewm(span=len(arr), min_periods=len(arr)).mean().values[-1]
完整的计算MACD函数的代码为:
def CalculateMACD(price_list, _dea): """ :param price_list: 包含26个数据的列表 :param _dea: 值 例如:11 :return: """ def EMA(arr): """ :param arr: :return: """ df = pd.DataFrame(arr) return df.ewm(span=len(arr), min_periods=len(arr)).mean().values[-1] EMA_12 = int(EMA(price_list[:12]).flat[-1]) EMA_26 = int(EMA(price_list[12:26]).flat[-1]) DIF = EMA_12 - EMA_26 DEA = _dea * 8 / 10 + DIF * 2 / 10 BAR = 2 * (DIF - DEA) MACD = [round(DIF, 2), round(DEA, 2), round(BAR, 2)] return MACD
-
-
此外,还利用sklearn的线性模型库linear_model构造一个可以计算一段时间内价格变动趋势的函数,其实就是分析线性方程组的斜率,从而得知在这段时间,价格变动的趋势
def CalculateTrend(price_list): """ :param price_list: 包含26个数据的列表 :return: """ regr = linear_model.LinearRegression() X = list() for x in range(1, len(price_list