Python新手学量化:我测试了20个指标,发现鳄鱼线指标真香!
同一段行情,MACD 还在水下磨,RSI 已经喊超买,KDJ 更离谱,前一天刚金叉,第二天又死叉。
我测到第十几个指标的时候,已经有点烦了。
不是指标没用,是新手一上来就拿震荡指标去追趋势,很容易被来回打脸。最后反而是鳄鱼线这个看起来有点土的指标,表现最稳。
鳄鱼线不是一根线,它有三根:
Jaw,下颚线,周期偏长; Teeth,牙齿线,周期中等; Lips,嘴唇线,周期最短。
它判断的不是“今天涨不涨”,而是行情有没有从一团乱麻里走出来。
我测指标的时候,不太喜欢一上来就看收益率。收益率这个东西太容易被某几次行情拉歪。新手更应该先看两件事:
第一,信号是不是太碎。
第二,信号出现的时候,价格是不是已经有点趋势样子了。
鳄鱼线让我觉得顺手,就在这。
很多指标一碰到横盘,信号跟打地鼠一样。鳄鱼线在横盘区间里三根线会缠在一起,这时候我一般直接不做。
先把指标算出来。
import pandas as pd
defsmma(s: pd.Series, n: int) -> pd.Series:
"""
Bill Williams 常用的是平滑均线,不是普通 ma。
这里不用 ewm 糊弄,按递推方式写清楚一点。
"""
out = pd.Series(index=s.index, dtype="float64")
seed = s.rolling(n).mean()
for i in range(len(s)):
if i < n - 1:
continue
if i == n - 1:
out.iloc[i] = seed.iloc[i]
else:
out.iloc[i] = (out.iloc[i - 1] * (n - 1) + s.iloc[i]) / n
return out
defadd_alligator(df: pd.DataFrame) -> pd.DataFrame:
data = df.copy()
price = (data["high"] + data["low"]) / 2
data["jaw"] = smma(price, 13).shift(8)
data["teeth"] = smma(price, 8).shift(5)
data["lips"] = smma(price, 5).shift(3)
return data
这里我多说一句,别小看这个 shift。
很多人写量化脚本,最容易在这里写出未来函数。你肉眼看图的时候,鳄鱼线是往后错开的,但回测的时候不能拿未来的数据做今天的判断。
所以我后面下单信号还会再错一天,用昨天收盘后确认的信号,去决定下一根 K 线要不要持仓。
规则我没写复杂。
三根线多头排列,嘴唇线在上,牙齿线中间,下颚线在下,认为鳄鱼张嘴向上。
三根线缠在一起,不动。
defbuild_signal(df: pd.DataFrame) -> pd.DataFrame:
data = df.copy()
up = (
(data["lips"] > data["teeth"]) &
(data["teeth"] > data["jaw"]) &
(data["close"] > data["lips"])
)
down_or_mess = (
(data["lips"] < data["teeth"]) |
(data["teeth"] < data["jaw"])
)
data["signal"] = 0
data.loc[up, "signal"] = 1
data.loc[down_or_mess, "signal"] = 0
# 昨天出信号,今天才持仓,少一点自欺欺人
data["pos"] = data["signal"].shift(1).fillna(0)
return data
我当时把 RSI、MACD、KDJ、BOLL、CCI、WR、ATR、OBV、EMA 这些都跑了一遍。
有些指标不是不好,而是对新手太不友好。
比如 RSI,看着很灵敏,但横盘的时候它特别爱来回抽你。 比如 MACD,趋势里能用,但启动慢,等它确认完,有时候肉都被别人夹走了。 比如 BOLL,震荡行情挺舒服,一旦单边走出来,逆着轨道抄底摸顶,心态很容易崩。
鳄鱼线的好处是,它不鼓励你天天交易。
三根线趴在一起的时候,行情没睡醒,别碰。 嘴唇线往上穿,牙齿线跟上,下颚线也开始抬,才算有点东西。
简单跑个回测,不搞手续费、滑点那些复杂东西,先看信号干不干净。
defrough_check(df: pd.DataFrame) -> pd.DataFrame:
data = df.copy()
data["ret"] = data["close"].pct_change()
data["strategy_ret"] = data["pos"] * data["ret"]
data["equity"] = (1 + data["strategy_ret"].fillna(0)).cumprod()
data["buy_hold"] = (1 + data["ret"].fillna(0)).cumprod()
data["trade"] = data["pos"].diff().abs().fillna(0)
print("交易次数:", int(data["trade"].sum()))
print("策略净值:", round(data["equity"].iloc[-1], 4))
print("持有净值:", round(data["buy_hold"].iloc[-1], 4))
return data
这段代码不负责让你发财。
它负责让你少犯一个低级错误:看到指标金叉就冲进去,看到死叉又割出来,最后交易记录密密麻麻,账户没怎么动,手续费先动了。
鳄鱼线更像一个过滤器。
它不预测顶部,也不预测底部,它只告诉你:这段行情现在是不是有趋势的样子。
新手学量化,我反而建议先从这种“慢一点”的指标开始。慢有慢的好处,它不会天天诱惑你下手。
真正麻烦的不是错过一两根阳线。
是你在一段没方向的行情里,被一堆漂亮指标骗着来回折腾。鳄鱼线至少在这件事上,没那么烦人。