🚀 AI 一键生成 joinquant 策略代码

JoinQuant 聚宽 MACD 函数报错 "unexpected keyword argument 'check_date'" 的原因与解决方法

joinquant | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

MACD函数报错

File "/tmp/strategy/user_code.py", line 131, in main_stock_pick

macd_dif11, macd_dea11, macd_macd11 = MACD(security_list = stock_list_10, check_date = prev_trade_day, SHORT = 12, LONG = 26, MID = 9, unit = '1d')

TypeError: MACD() got an unexpected keyword argument 'check_date'

各位,请问知道这个'check_date'参数为什么不对吗?

解决方案

在 JoinQuant(聚宽)量化平台中遇到 TypeError: MACD() got an unexpected keyword argument 'check_date' 报错,通常是因为函数导入来源错误参数传递不符合该函数的定义。以下是详细的原因分析与解决方案:

原因分析

  1. 导入了错误的 MACD 函数(最常见原因)
    Python 中有多个库提供 MACD 函数(例如著名的 talib 库)。如果你在代码顶部使用了 import talib 并调用了 talib.MACD,它的标准参数是价格序列(如 close 数组)以及时间周期,并没有 check_datesecurity_list 这两个参数。只有聚宽官方封装的技术指标库 jqlib.technical_analysis 中的 MACD 才使用 check_date

  2. 传入了不支持的额外参数
    观察你的代码:MACD(..., unit = '1d')。聚宽官方的 MACD 函数签名通常只包含 security_list, check_date, SHORT, LONG, MID。传入未定义的 unit 参数也可能引发底层解析错误或版本兼容问题。


解决方案

方法一:确保正确导入聚宽官方技术指标库

如果你希望使用带有 check_date 参数的官方封装函数,请确保在代码顶部正确导入了 jqlib.technical_analysis,并且移除不支持的 unit 参数

# 1. 正确导入聚宽技术指标库
from jqlib.technical_analysis import MACD

# 2. 正确调用(去掉 unit='1d')
macd_dif11, macd_dea11, macd_macd11 = MACD(
    security_list=stock_list_10, 
    check_date=prev_trade_day, 
    SHORT=12, 
    LONG=26, 
    MID=9
)

提示:如果不确定当前环境中该函数的准确参数,可以在聚宽的“研究环境”中新建一个 Notebook,输入 MACD?help(MACD) 运行,即可查看官方最新的函数签名。

方法二:使用 talib 手动计算(推荐,更灵活高效)

在实盘或复杂策略中,直接获取历史价格数据并使用 talib 计算 MACD 往往执行效率更高,且不容易受到平台封装接口版本变动的影响。

import talib
import numpy as np

# 1. 获取历史收盘价数据(假设获取过去 100 天的数据以确保 MACD 计算的平滑准确性)
# 注意:MACD 需要较长的数据预热期,建议获取的数据长度远大于 LONG 周期(如 100 天)
hist_data = history(100, '1d', 'close', stock_list_10, df=True)

macd_dif_dict = {}
macd_dea_dict = {}
macd_macd_dict = {}

# 2. 遍历股票池计算 MACD
for stock in stock_list_10:
    close_prices = hist_data[stock].values
    # 剔除 NaN 值
    close_prices = close_prices[~np.isnan(close_prices)]
    
    if len(close_prices) > 30:
        # 调用 talib.MACD
        dif, dea, macd = talib.MACD(close_prices, fastperiod=12, slowperiod=26, signalperiod=9)
        # 取最新一天的值
        macd_dif_dict[stock] = dif[-1]
        macd_dea_dict[stock] = dea[-1]
        macd_macd_dict[stock] = macd[-1] * 2  # 注意:talib 计算的 macd 柱状图通常需要乘以 2 才能与国内行情软件一致
    else:
        macd_dif_dict[stock] = np.nan
        macd_dea_dict[stock] = np.nan
        macd_macd_dict[stock] = np.nan

总结

请先检查代码顶部的 import 语句,确认 MACD 是从哪里导入的。如果是从 jqlib.technical_analysis 导入,请删掉 unit='1d' 参数;如果是从 talib 导入,请改用方法二传入价格序列进行计算。