Python技术迷

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

这段代码不负责让你发财。

它负责让你少犯一个低级错误:看到指标金叉就冲进去,看到死叉又割出来,最后交易记录密密麻麻,账户没怎么动,手续费先动了。

鳄鱼线更像一个过滤器。

它不预测顶部,也不预测底部,它只告诉你:这段行情现在是不是有趋势的样子。

新手学量化,我反而建议先从这种“慢一点”的指标开始。慢有慢的好处,它不会天天诱惑你下手。

真正麻烦的不是错过一两根阳线。

是你在一段没方向的行情里,被一堆漂亮指标骗着来回折腾。鳄鱼线至少在这件事上,没那么烦人。