问题描述
macd_dif, macd_dea, macd_macd = MACD(security_list,check_date='2020-07-02', SHORT = 12, LONG = 26, MID = 9,unit='1m')
print(macd_dif[security_list])
print(macd_dea[security_list])
print(macd_macd[security_list])
-1.766704830287381
-2.1573125387208734
0.7812154168669849
怎么能返回当天所有的1分钟macd数据?
解决方案
为什么 jqlib 的 MACD 函数只返回一组数据?
在 JoinQuant 聚宽平台中,jqlib.technical_analysis 库提供的 MACD 函数设计初衷是为了获取指定时间点(check_date)的截面数据。当您传入 check_date='2020-07-02' 且 unit='1m' 时,函数计算的是截至 2020-07-02 最后一分钟(即 15:00:00)的 MACD 值,因此只会返回一个标量结果,而不是一整天的时间序列。
如何获取当天所有的1分钟 MACD 数据?
在量化回测和研究中,如果需要获取一整天(240根1分钟K线)的 MACD 序列,最标准且高效的做法是:先使用 get_price 或 get_bars 获取全天的1分钟 K 线数据,然后使用 talib 库进行批量计算。
Python 实现代码
以下是获取某只股票全天1分钟 MACD 数据的完整代码示例:
import jqdata
import talib
import pandas as pd
# 1. 设定参数
security = '000001.XSHE'
target_date = '2020-07-02'
# 2. 获取当天的1分钟级别收盘价数据
# 注意:为了让当天的第一根K线也能计算出准确的MACD,通常需要往前多取一些数据(例如前几天的1分钟数据)
# 这里为了演示,我们直接取当天的240根K线。实际应用中建议 count 设大一点(如 count=500)
df = get_price(security,
start_date=target_date + ' 09:30:00',
end_date=target_date + ' 15:00:00',
frequency='1m',
fields=['close'])
# 3. 使用 talib 计算 MACD 序列
# talib.MACD 返回三个数组:macd (对应DIF), macdsignal (对应DEA), macdhist (对应MACD柱子)
macd_dif, macd_dea, macd_hist = talib.MACD(df['close'].values,
fastperiod=12,
slowperiod=26,
signalperiod=9)
# 4. 将计算结果拼接到 DataFrame 中
df['DIF'] = macd_dif
df['DEA'] = macd_dea
# 注意:国内炒股软件的 MACD 柱子通常是 (DIF - DEA) * 2,而 talib 默认没有乘 2,所以这里乘以 2 保持一致
df['MACD'] = macd_hist * 2
# 5. 打印结果(去除前面因为周期不足导致计算为 NaN 的行)
print(df.dropna())
核心优化建议
- 数据预热(Warm-up):MACD 是基于 EMA(指数移动平均)计算的,EMA 具有长记忆性。如果您只取当天的 240 根 1 分钟 K 线,开盘前几十根 K 线的 MACD 值会因为初始数据不足而显示为
NaN或与行情软件有误差。建议在get_price时往前多取 2-3 天的 1 分钟数据,计算完 MACD 后,再截取您真正需要的2020-07-02当天的数据。 - MACD 乘 2 问题:
talib.MACD计算出的macdhist是DIF - DEA。国内同花顺、通达信等软件显示的 MACD 红绿柱通常是(DIF - DEA) * 2。如果您需要与国内软件对齐,记得将结果乘以 2。