使用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
相关产品推荐
相关产品推荐

