问题描述
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' 报错,通常是因为函数导入来源错误或参数传递不符合该函数的定义。以下是详细的原因分析与解决方案:
原因分析
-
导入了错误的 MACD 函数(最常见原因)
Python 中有多个库提供MACD函数(例如著名的talib库)。如果你在代码顶部使用了import talib并调用了talib.MACD,它的标准参数是价格序列(如close数组)以及时间周期,并没有check_date和security_list这两个参数。只有聚宽官方封装的技术指标库jqlib.technical_analysis中的MACD才使用check_date。 -
传入了不支持的额外参数
观察你的代码: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 导入,请改用方法二传入价格序列进行计算。