🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant 因子BIAS5在钢铁股票池回测效果异常好?如何排查未来函数

joinquant | 发布时间: 2026/6/1
以下内容由 EasyQuant 生成。

问题描述

因子BIAS5在指定的钢铁股票池里回测,为啥效果那么好

我就用了一个简单的因子BIAS5(5日乖离率)在指定的钢铁行业股票池里回测,为啥效果那么好?

我是不是用了未来函数了,如何知道呢,怎么解决呢,心虚着呢,我研究了各种行业指标,结果不如一个简单的技术指标...心里几匹马奔腾而过。
烦请各位高手指教...

解决方案

遇到这种情况,心里“几匹马奔腾而过”是非常真实的量化研究体验。简单技术指标在特定行业表现优异是完全有可能的,但也确实需要高度警惕“未来函数”和“过拟合”。以下为您详细剖析原因并提供排查未来函数的具体方法。### 一、 为什么BIAS5在钢铁股表现可能很好?1. 钢铁行业的周期与均值回归特性:钢铁属于典型的强周期行业,股价往往呈现宽幅震荡。BIAS(乖离率)本质上是一个“均值回归”指标。当股价偏离5日均线过大时,在震荡市或周期股中,极易发生向均线靠拢的修正。这种特性使得BIAS在钢铁股中可能比在单边成长股(如科技股)中更有效。2. 特定时间段的契合:如果您回测的时间段正好是钢铁股的震荡期或某波行情的特定阶段,BIAS5的参数(5日)可能恰好捕捉到了该阶段的波动节奏。3. 幸存者偏差与过拟合:指定的股票池是否是“事后”选出的表现较好的钢铁股?如果是,这本身就是一种宏观上的未来函数。### 二、 如何排查是否使用了未来函数?在JoinQuant中,未来函数通常指在T时刻使用了T+1或之后的数据。排查方法如下:#### 1. 开启JoinQuant的防未来函数利器在 initialize 函数中加入以下两行代码,这是排查未来函数最直接的方法:set_option('use_real_price', True) (开启真实价格回测,避免使用未来的前复权因子导致价格失真)。set_option('avoid_future_data', True) (开启避免未来数据模式,如果代码尝试获取未来数据,系统会报错或自动剔除)。#### 2. 检查交易信号与执行时间的错位这是最常见的未来函数陷阱。例如:您在 handle_data(盘中或收盘)中计算当天的BIAS5(用到了当天的收盘价 close),然后以当天的收盘价或均价买入。在实际交易中,您无法在收盘前确切知道收盘价,也无法以收盘价成交。正确做法:在T日收盘后(或T+1日开盘前)计算T日的BIAS5,然后在T+1日开盘时(market_open)以开盘价或市价单买入。#### 3. 检查数据获取API的参数使用 get_pricehistory 时,注意 end_datecount 的设置。如果在日线回测中,盘中获取了包含当天的数据,就可能引入未来函数。JoinQuant的 history 函数在按天回测时,默认是不包含当天数据的,这是一种保护机制。但如果您使用 get_price 并将 end_date 设为 context.current_dt,则可能拿到未来的收盘价。### 三、 怎么解决和验证?1. 严格分离信号计算与下单执行:建议使用定时运行函数。例如,在 before_trading_start 中计算昨天的BIAS5并生成交易信号,在 market_open 中执行买卖操作。2. 样本外测试(Out-of-Sample Testing):将您的策略应用到其他周期性行业(如煤炭、有色),或者将回测时间段平移到您未曾测试过的历史区间。如果效果依然稳健,说明策略逻辑有效;如果业绩崩溃,说明大概率是过拟合。3. 检查滑点与手续费:简单的反转指标往往交易频繁。请确保您设置了合理的滑点(set_slippage)和手续费(set_order_cost)。很多高频技术策略在扣除千分之二的滑点和手续费后,超额收益会瞬间归零。### 四、 为什么费尽心思的行业指标不如简单技术指标?这在量化界很常见。基本面/行业指标(如库存、利润率)通常是低频数据,反映的是长期的企业价值,适合做长周期的选股(Alpha);而技术指标(如BIAS)是高频的量价数据,反映的是短期的市场情绪和交易博弈,适合做短期的择时。在短周期的回测中,量价指标往往能提供更显著的短期收益。总结:先用 set_option('avoid_future_data', True)set_option('use_real_price', True) 跑一遍,检查信号是否错位,加上合理的滑点和手续费。如果依然赚钱,恭喜您,您可能找到了一个适合钢铁股的优秀短期择时因子!