FinRL实例化FeatureEngineer时报use_technical_indicator参数多传错误
运行FinRL代码触发参数重复传入报错
问题背景
项目为包含7个模块的量化交易代码片段,代码取自FinRL官方站点示例,运行环境为Python 3.7、Mac OS系统,执行特征工程代码段时触发报错:__init__() got multiple values for argument 'use_technical_indicator'

触发报错的关联代码片段如下:
# Perform Feature Engineering: df = FeatureEngineer(df.copy(), use_technical_indicator=True, use_turbulence=False).preprocess_data() # add covariance matrix as states df=df.sort_values(['date','tic'],ignore_index=True) df.index = df.date.factorize()[0] cov_list = [] # look back is one year lookback=252 for i in range(lookback,len(df.index.unique())): data_lookback = df.loc[i-lookback:i,:] price_lookback=data_lookback.pivot_table(index = 'date',columns = 'tic', values = 'close') return_lookback = price_lookback.pct_change().dropna() covs = return_lookback.cov().values cov_list.append(covs) df_cov = pd.DataFrame({'date':df.date.unique()[lookback:],'cov_list':cov_list}) df = df.merge(df_cov, on='date') df = df.sort_values(['date','tic']).reset_index(drop=True) df.head()
报错核心原因
该报错为Python类实例化时的参数传值冲突,位置参数与关键字参数对同一形参重复赋值,结合FinRL的API版本差异,常见触发场景为本地安装的FinRL版本与示例代码适配版本不匹配:
不同版本的FeatureEngineer类构造函数形参顺序存在调整:
- 旧版示例适配的签名顺序为:
def __init__(self, df, use_technical_indicator, use_turbulence, ...),第一个位置形参为待处理的DataFrame - 部分新版本的签名顺序调整为:
def __init__(self, use_technical_indicator, use_turbulence, df=None, ...),前两个位置形参为布尔开关参数
此时如果仍按旧版写法将df.copy()作为第一个位置参数传入,程序会把这个DataFrame对象赋值给第一个形参use_technical_indicator,后续又通过关键字参数传入use_technical_indicator=True,直接触发同一参数被多次赋值的报错。
排查与解决指引
- 第一步:查看本地安装的FinRL版本,执行命令
pip show finrl获取版本号,对齐官方示例对应的适配版本 - 第二步:根据安装版本调整
FeatureEngineer的实例化参数传值逻辑,避免参数冲突:- 若为新版API:将待处理的DataFrame作为关键字参数传入,调整后示例代码为:
df = FeatureEngineer( use_technical_indicator=True, use_turbulence=False, df=df.copy() ).preprocess_data() - 若为旧版API:可保持原有位置参数写法,确认没有额外重复传入
use_technical_indicator参数即可
- 若为新版API:将待处理的DataFrame作为关键字参数传入,调整后示例代码为:
- 第三步:重新运行代码段,验证参数冲突报错是否消除
内容的提问来源于stack exchange,提问作者xanstorm
相关产品推荐
相关产品推荐

