You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TA-Lib生成不同周期MACD数据框时结果重复的问题

问题原因
  • Python 里的 DataFrame 是引用类型,你在循环中每次直接修改的都是同一个原始df对象,随后把这个对象的引用存入df_dict。无论循环多少次,字典里所有键最终指向的都是同一个df实例——也就是最后一次循环修改后的结果,所以所有参数组合的输出看起来完全相同。
  • 直白点说:你没为每个参数组合创建独立的 DataFrame,所有操作都在同一个df上反复覆盖 MACD 列,最后字典里存的全是这个df的引用,自然内容完全一致。
解决办法

每次循环时,先通过df.copy()复制原始数据框得到独立副本,再在副本上计算对应参数的 MACD,最后把副本存入字典。这样每个参数组合都会对应一个独立的 DataFrame,不会互相覆盖。

修改后的代码示例
import yfinance as yf
import pandas as pd
import talib

code = '2800'
para_dict = {
    'sample_period_list': [200],
    'fastperiod_list': [12, 16],
    'slowperiod_list': [26, 30],
    'signalperiod_list': [8, 12],
    'higher_percentile_list': [0.8],
    'profit_target': [0.04],
    'stop_loss': [-0.04]
}

start_date = '2020-01-01'
end_date = '2022-10-10'

df_dict = {}

# 预处理原始数据,只执行一次
original_df = yf.Ticker(code + '.HK').history(start=start_date, end=end_date)
original_df = original_df[original_df['Volume'] > 0]
original_df = original_df[['Open', 'High', 'Low', 'Close']]
original_df = original_df.reset_index()

for fastperiod in para_dict['fastperiod_list']:
    for slowperiod in para_dict['slowperiod_list']:
        for signalperiod in para_dict['signalperiod_list']:
            macd_key = f"{fastperiod}_{slowperiod}_{signalperiod}"
            # 创建原始数据的独立副本
            current_df = original_df.copy()
            # 在副本上计算对应参数的MACD
            current_df['macd'], current_df['macdsignal'], current_df['macdhist'] = talib.MACD(
                current_df['Close'], 
                fastperiod=fastperiod, 
                slowperiod=slowperiod, 
                signalperiod=signalperiod
            )
            # 将独立副本存入字典
            df_dict[macd_key] = current_df

# 可验证不同参数组合的结果已不同
print(df_dict['12_26_8']['macd'].head())
print(df_dict['16_30_12']['macd'].head())

内容的提问来源于stack exchange,提问作者Ho Chuen Cheung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:50:30