惊呆了,探究如果机器用MACD法对股票进行做套的胜率,竟高达%80

本文通过Python实现了一个简单的股票交易策略,利用MACD指标进行买卖决策。实验结果显示,该策略的胜率高达80%。文章详细介绍了MACD的原理,以及如何构造计算MACD的函数,最后通过实际数据验证了策略的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做套:惊呆了!探究如果机器用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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linxinloningg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值