
做过币圈网格的人都有过同一个噩梦:网格刚建好,价格一泻千里,仓位全线套牢,追保证金或直接爆仓。币圈的魅力在于涨跌幅没有上限,但这正是网格策略最大的敌人——网格天生是为震荡而生的,单边行情会让它满盘皆输。
那有没有一类资产,既保留足够的日内波动让网格频繁触发,又不会动不动来一波 30%、50% 的暴力拉升或踩踏?答案就是 TradFi 品种。
TradFi(传统金融)衍生品,包括标普 500、纳斯达克、黄金、原油、外汇等传统资产的永续合约,背后有真实的基本面锚定。股票指数受企业盈利、美联储政策约束,大宗商品受供需关系左右,外汇汇率则由两个主权经济体之间的相对关系决定。这些资产不会无缘无故在一夜之间涨 5 倍,也不会因为一条推文崩掉 80%。它们的价格有”重力”——短期可以震荡,但长期会向基本面回归。
这种特性和网格策略几乎是天作之合:日内有 1% 到 3% 的正常波动,足以让格子反复被触发;极端行情下也不会把网格彻底打穿,给止损和资金管理留下足够的缓冲空间。本策略正是建立在这个逻辑之上——自动扫描所有 TradFi 品种,找出当前波动最活跃的几个,在它们身上构建循环网格,并在波动结构发生变化时自动完成品种轮换。
近两年,OKX、Bitget 等头部币圈交易所悄悄上线了大量 TradFi 永续合约产品,覆盖范围从美股指数(标普 500、纳斯达克 100)、个股(苹果、英伟达、特斯拉),到大宗商品(黄金、原油、天然气),再到外汇(欧元、日元)。简单说,你现在可以在币圈交易所里直接炒美股、炒黄金、炒外汇,7×24 小时不间断,还可以加杠杆。
这件事对量化交易者意义重大。一方面,这些品种继承了传统金融资产的基本面属性,价格不会无端暴涨暴跌;另一方面,它们在币圈交易所上挂牌,沿用的是永续合约的交易结构,流动性充足,手续费透明,API 接口和普通币种完全一致,可以无缝接入量化策略。
换句话说,这批产品打开了一个新的套利空间:用炒币的基础设施,去做传统金融资产的震荡套利。本策略正是为这个场景量身定制的——用程序自动筛选其中波动最活跃的品种,在上面跑网格,吃震荡的钱。
网格能不能赚钱,60% 的胜负在选品。选对了品种,格子每天被触发十几次,利润自然积累;选错了品种,格子挂出去一周纹丝不动,资金趴着不动还占用保证金。
本策略的选品标准只有一个维度:过去 N 根日线的平均日振幅。
波动得分 = Σ [ (High_i − Low_i) / Close_i × 100 ] / N
代码实现如下,逻辑一目了然:
def score_symbol(info):
bars = exchange.GetRecords(info["sym"], PERIOD_D1, KLINE_COUNT + 2)
if not bars or len(bars) < 3:
return None
bars = bars[-KLINE_COUNT:]
atr_pcts = [(b["High"] - b["Low"]) / b["Close"] * 100 for b in bars if b["Close"] > 0]
avg_atr = sum(atr_pcts) / len(atr_pcts)
# 日均振幅必须至少是格间距的 1.5 倍,否则直接剔除
if avg_atr < GRID_RATIO * 100 * 1.5:
return None
return {"sym": info["sym"], "atr": round(avg_atr, 3), "price": bars[-1]["Close"]}
策略会定期扫描全部 TradFi 品种并排名,选出振幅最高的 TOP_N 个持仓。准入门槛的设计非常关键:日均振幅必须至少是格间距的 1.5 倍,否则价格一天可能连一个格子都穿不过,直接剔除,避免资金趴在毫无效率的品种上空耗保证金。
品种的识别也需要特别处理。发明者平台上 TradFi 品种通过 instCategory 字段与普通加密货币区分:
def scan_tradfi():
markets = exchange.GetMarkets()
for sym, mkt in markets.items():
if not sym.endswith("USDT.swap"):
continue
info = mkt.get("Info") or {}
# instCategory != 1 才是 TradFi 品种
if int(info.get("instCategory", 1)) == 1:
continue
result.append({"sym": sym, "base": base, "cat": cat})

在选定品种上,以当前价为中心,向上下各延伸一定比例,按固定间距等比切分格子。低于当前价的每一格挂一张买单,等待价格回落成交。
网格的建立核心代码如下:
def build_grid(sym, price):
low = price * (1 - LOWER_RANGE)
high = price * (1 + LOWER_RANGE)
# 等比切格
grids, p = [], low
while p <= high * 1.001:
grids.append(round(p, g_states[sym]["pp"]))
p = p * (1 + GRID_RATIO)
for i in range(len(grids) - 1):
buy_p, sell_p = grids[i], grids[i + 1]
if buy_p < price:
oid = buy_open(sym, buy_p, GRID_VALUE) # 低于现价直接挂买单
g["status"] = "pending_buy" if oid else "skip"
else:
g["status"] = "above" # 高于现价暂不挂单,等价格回落
网格同步是策略运行的核心循环,负责检查每格的订单状态并作出响应:
def sync(sym):
for g in grids:
if g["status"] == "pending_buy":
s, deal, avgp = check_order(g["buy_oid"])
if s == "filled":
# 买单成交 → 立即挂止盈单
oid = sell_close(sym, g["sp"], ct)
g["status"] = "pending_sell"
elif g["status"] == "pending_sell":
s, deal, avgp = check_order(g["sell_oid"])
if s == "filled":
# 止盈成交 → 计算利润,重新挂买单,循环
profit = g["ct"] * cv * (avgp - g["fp"])
g_total_profit += profit
oid = buy_open(sym, g["bp"], GRID_VALUE)
g["status"] = "pending_buy"
运行逻辑清晰:价格下穿格子触发买入,价格上穿上一格触发止盈,止盈后原位重挂买单,周而复始。挂单撤回、止盈单异常等情况均有自动检测与补单机制,策略不会因偶发订单异常中断运行。

TradFi 品种的波动节奏会随宏观事件、财报季、政策变化而转移。某段时间黄金最活跃,过一阵可能变成原油或者标普期货。固定死一个品种跑网格,迟早会遇到那个品种进入低波动期、格子一周都不动的困境。
本策略每隔固定小时数(默认 48 小时)重新对全部 TradFi 品种评分排名,判断是否需要替换当前持仓品种。为了避免因微小差异频繁换仓带来的手续费损耗,引入了磁滞机制:
def needs_rebalance(new_selected):
cur_scores = {s["sym"]: s["atr"] for s in g_score_log if s["sym"] in g_active}
for s in new_selected:
if s["sym"] in g_active:
continue
weakest_atr = min(cur_scores.values())
threshold = weakest_atr * (1 + HYSTERESIS) # 必须高出 20% 才触发换仓
if s["atr"] >= threshold:
Log(f"{s['base']} ATR={s['atr']:.2f}% > 阈值={threshold:.2f}%,触发换仓")
else:
Log(f"{s['base']} ATR={s['atr']:.2f}% < 阈值={threshold:.2f}%,磁滞保持")
只有当新候选品种的日均振幅比当前最弱持仓品种高出 20% 以上,才真正触发换仓。换仓流程为:先撤掉旧品种的全部挂单,平掉所有持仓,再在新品种上重新建立完整的网格,整个过程自动完成。
– TOP_N 控制同时持有的品种数量,默认为 3,即资金同时分散在波动最高的 3 个品种上。 – GRID_RATIO 是格间距比例,默认 1.5%,代表每格的止盈幅度。 – GRID_VALUE 是每格固定投入的 USDT 金额,默认 50,不随价格高低调整。 – LOWER_RANGE 决定网格覆盖的价格范围,默认当前价上下各 10%。 – REBALANCE_HOURS 是换仓评估周期,默认 48 小时。 – HYSTERESIS 是磁滞阈值,默认 20%,防止频繁换仓。 – LEVERAGE 是杠杆倍数,建议不超过 3 倍。 – STOP_LOSS_RATIO 是全局止损线,账户亏损超过该比例时自动平仓停止,默认 30%。 – KLINE_COUNT 是评分用的日线根数,默认取过去 20 根。 – EXCLUDE_SYMBOLS 是黑名单,填入不希望策略触碰的品种代码,多个用逗号分隔。
全局止损是策略的最后一道防线,当账户权益亏损超过初始值的设定比例时,自动撤单、平仓并停止所有后续操作:
def check_stop():
acc = exchange.GetAccount()
loss = (g_init_equity - acc.Equity) / g_init_equity
if loss >= STOP_LOSS_RATIO:
Log(f"触发止损!亏损={loss*100:.1f}% → 全部平仓停止")
for sym in list(g_active):
close_all(sym)
g_state = "STOP"
选品阶段的准入过滤剔除了波动不足的品种,确保进入策略的每一个品种都有足够的日内振幅驱动网格运转。黑名单机制允许手动排除流动性差、点差异常或行为不稳定的品种。所有下单的价格和数量均严格对齐交易所的精度要求,从源头消除因精度不符导致的拒单问题。各品种资金平均分配,单一品种的亏损不会牵连整体仓位结构。
本策略在震荡行情中表现最佳。当目标品种在区间内反复横跳时,格子被高频触发,收益随时间线性积累,策略几乎不需要人工介入。
需要注意的是,若价格持续单边下行并跌穿网格下边界,所有买单将被套牢,需等待价格回归或触发全局止损。部分 TradFi 品种在非交易时段(如美股休市期间)流动性大幅下降,挂单可能长时间无法成交,属于正常现象。格间距 GRID_RATIO 的设置应参考目标品种的日均振幅,建议控制在日均振幅的 1⁄3 到 1⁄2 之间,太大则触发频率低,太小则手续费侵蚀利润。杠杆建议保持在 3 倍以内,过高的杠杆在极端行情下会加速亏损,在止损触发前已难以控制。
本策略的核心逻辑可以用一句话概括:把资金始终放在波动最大的 TradFi 品种上,让网格做时间的朋友。选品、建格、换仓、风控四个模块环环相扣,全程自动运行。TradFi 品种的基本面属性提供了价格不会无限偏移的底层保障,而程序化的波动率筛选则确保资金始终配置在效率最高的品种上。参数设置合理时,策略可以在多数市场环境下产生稳定的网格收益,同时通过止损和磁滞机制将下行风险控制在可接受范围内。
本文为发明者量化平台原创策略说明,仅供学习交流,不构成任何投资建议。