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

4 月 16 日
 matters

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

结果就是:

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

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

我现在的做法:

流程一直没变:

  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"\])

重点就两个:

一些坑~~~

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

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

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

1482 次点击
所在节点    分享发现
2 条回复
940i3s34v4F1HW41
4 月 16 日
有一个角度是回测比较垃的因子反而会在实盘里有出人意料的表现
Sawyerhou
4 月 16 日
分组和 IC 是在截面上计算的,如果你是在时序方向上计算的,那维度就错了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1206367

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX