看别人说动量有效 → 做动量
看研报说低波动好 → 加低波动
结果就是:
回测看着还行,一实盘就不稳定。
后来才明白,因子不是“看起来对”,而是“数据上成立”。
我现在的做法:
流程一直没变:
[ol]
拉数据
算因子
分组
看未来收益
算 IC
[/ol]
方法很朴素,甚至有点老,但一直够用。
数据
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. 因子失效:长期是可能有效的,但短期完全不一定。我也经历过刚上线就连续回撤的阶段。如果你正好在因子失效期开始用,很容易直接放弃。

