V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
matters

用回测筛选因子的一点经验分享

  •  
  •   matters · 1 天前 · 483 次点击

    我在做量化交易,也自己做因子回测,前前后后试过不少因子,真正能长期用的,其实不多。刚入门的时候很简单:

    • 看别人说动量有效 → 做动量

    • 看研报说低波动好 → 加低波动

    结果就是:

    回测看着还行,一实盘就不稳定。

    后来才明白,因子不是“看起来对”,而是“数据上成立”。

    我现在的做法:

    流程一直没变:

    1. 拉数据

    2. 算因子

    3. 分组

    4. 看未来收益

    5. 算 IC

    方法很朴素,甚至有点老,但一直够用。

    数据

    import requests
    
    import pandas as pd
    
    def get\_kline(symbol):
    
        url = "https://api.alltick.co/v1/market/kline"
    
        params = {
    
            "symbol": symbol,
    
            "interval": "1d",
    
            "apikey": "your\_api\_key"
    
        }
    
        data = requests.get(url, params=params).json()\["data"\]
    
        return pd.DataFrame(data)
    

    最简单的因子:动量

    def momentum(df, n=20):
    
        df\["ret"\] = df\["close"\].pct\_change(n)
    
        return df
    

    这个东西现在看挺基础的,但不影响用。

    回测:分组 + IC

    def backtest(df):
    
        df = df.dropna()
    
        df\["rank"\] = pd.qcut(df\["ret"\], 5, labels=False)
    
        return df.groupby("rank")\["close"\].pct\_change().shift(-1).mean()
    
    def ic(df):
    
        df\["fut"\] = df\["close"\].pct\_change().shift(-1)
    
        return df\["ret"\].corr(df\["fut"\])
    

    重点就两个:

    • 高分组是不是更赚钱

    • IC 是否稳定

    一些坑~~~

    1. 未来函数:这个很致命,看起来没问题,其实已经作弊了。

    2. 过拟合:调参数调到“完美”,换一段时间直接失效。

    3. 因子失效:长期是可能有效的,但短期完全不一定。我也经历过刚上线就连续回撤的阶段。如果你正好在因子失效期开始用,很容易直接放弃。

    2 条回复    2026-04-16 19:00:59 +08:00
    sddyzm
        1
    sddyzm  
    PRO
       1 天前 via iPhone
    有一个角度是回测比较垃的因子反而会在实盘里有出人意料的表现
    Sawyerhou
        2
    Sawyerhou  
       1 天前
    分组和 IC 是在截面上计算的,如果你是在时序方向上计算的,那维度就错了。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2770 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 15:15 · PVG 23:15 · LAX 08:15 · JFK 11:15
    ♥ Do have faith in what you're doing.