修掉 gzip 追加会毁掉整个文件的数据丢失,并分开买卖两侧的成交分布曲线
两件事,都是「静默出错」那一类。 一、BookLog/TapeLog 追加到同一个 .gz,进程被 SIGKILL 时当前成员停在 deflate 块中间,下一轮追加的新成员接在垃圾字节之后。顺序解压在损坏点抛 invalid block type,该点之后全部读不出来——包括后续每轮写进去的。而读侧的异常处理 把这个当成「正常的尾部截断」静默跳过,于是只读出 21 行还不报错。 原 docstring 里写的「只丢最后一个缓冲块,不会毁掉整个文件」是错的,已证伪。 写侧改成每轮运行一个文件;读侧按 gzip 成员边界扫描、坏成员单独跳过并出声 报告,同时把同前缀的多轮文件一并读入。旧损坏文件因此多恢复出 31/21 条 (tape)与 132/95 条(books)。 二、tape_shape 只统计主动买、只自区间顶部累积,这条曲线只适用于多头止盈。 exit_fill 两侧共用它,等于把空头的可成交量按多头分布高估。实测二者不对称: 主动买在顶部 20% 内已占 40%,主动卖在底部 20% 内只有 18%。分成 SHAPE_F 与 SHAPE_F_SHORT,avail_at 按方向查各自曲线。 两条曲线只有 45 根成交流样本,所以补了 --sensitivity:把空头可成交量砍一半, 10 万仓位下 BTC/ETH 预算完全不动、SOL 动 0.07bp。结论不依赖这 45 根样本。 顺带撤掉 step43 docstring 里已作废的「成交率 30%/16%/1.5%」。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,17 +1,29 @@
|
||||
"""Step 43:把「限价单全额成交」的假设换成按成交量结算,重算滑点预算。
|
||||
|
||||
step42 的预算(BTC 8.58 / ETH 20.64 / SOL 16.83bp)建立在一个假设上:挂在
|
||||
3ATR 与 8ATR 的止盈限价单全额成交在目标价。影子交易的成交流数据推翻了它——
|
||||
真实仓位下全额成交率只有 30%/16%/1.5%(32 万仓位)。
|
||||
step42 的预算建立在一个假设上:挂在 3ATR 与 8ATR 的止盈限价单全额成交在目标
|
||||
价。本脚本把它换成按成交流实测的成交量结算,让预算变成**仓位规模的函数**。
|
||||
|
||||
预算因此不再是一个常数,而是**仓位规模的函数**。规模越大,止盈越难成交,
|
||||
越多仓位被拖到止损或超时(taker,且吃滑点),预算越低。这条曲线与「冲击
|
||||
反推的容量」是两个不同的约束,而后者宽松得多(100~500 万 vs 数万)。
|
||||
## 结论(2026-08-28)
|
||||
|
||||
**主口径 10 万 USDT 下成交率不是绑定约束。** 预算相对全额成交假设的降幅:
|
||||
BTC 0% / ETH 0% / SOL 1.1%;即便到 100 万也只有 2.6% / 0.9% / 8.0%。
|
||||
|
||||
⚠ 此前一版本文档写「真实仓位下全额成交率只有 30%/16%/1.5%」,那是
|
||||
shadow_depth.composite_fill 的口径——只算首次触及那一根的可成交量,而真实
|
||||
挂单在那儿常驻最多 48 根、每根都在成交。该数系统性偏悲观,已撤回。
|
||||
|
||||
另一个约束是冲击反推的容量上限(100~500 万),比成交率宽松得多。两者都不
|
||||
绑定,所以 10 万仓位上限制来自别处,不是流动性。
|
||||
|
||||
结论对成交分布曲线**不敏感**:把空头侧可成交量砍一半,10 万仓位下 BTC/ETH
|
||||
预算完全不动、SOL 动 0.07bp。见 `--sensitivity`。这一点重要,因为那两条曲线
|
||||
目前只有 45 根成交流样本。
|
||||
|
||||
数据用 Bitget 210 天 1m,与影子测量同源同交易所。全量 366 万根峰值 24.5GB,
|
||||
本机 15GB 跑不动;210 天 30 万根峰值约 2GB。
|
||||
|
||||
python research/step43_fill_aware_budget.py --syms BTC,ETH,SOL
|
||||
python research/step43_fill_aware_budget.py --sensitivity
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -92,13 +104,55 @@ def signals_for(sym: str, cache: Path) -> tuple[pd.DataFrame, pd.DataFrame]:
|
||||
return cdf, sig
|
||||
|
||||
|
||||
def sensitivity(syms: list[str], cache: Path, notional: float = 1e5) -> None:
|
||||
"""预算对成交分布曲线的敏感性。
|
||||
|
||||
SHAPE_F / SHAPE_F_SHORT 只有 45 根成交流样本,数值精度很低。所以必须先
|
||||
证明结论对它们不敏感,否则整条预算曲线都建立在 45 根样本上。
|
||||
|
||||
三档:两侧共用买盘曲线(旧口径,空头偏乐观)/实测的方向各异曲线/把
|
||||
空头可成交量再砍一半的悲观上界。
|
||||
"""
|
||||
from lib.exit_fill import SHAPE_F, SHAPE_F_SHORT, budget_bp, walk_filled
|
||||
|
||||
half = np.clip(SHAPE_F_SHORT * 0.5, 0.0, 1.0)
|
||||
half[-1] = 1.0
|
||||
cases = [("对称(旧口径)", SHAPE_F, SHAPE_F),
|
||||
("实测不对称", SHAPE_F, SHAPE_F_SHORT),
|
||||
("悲观:空头量减半", SHAPE_F, half)]
|
||||
|
||||
print(f"\n{'=' * 74}\n成交分布曲线敏感性 · 仓位 {notional:,.0f} USDT\n")
|
||||
print(f" {'币':<5}" + "".join(f"{n:>18}" for n, _, _ in cases))
|
||||
for sym in syms:
|
||||
try:
|
||||
cdf, sig = signals_for(sym, cache)
|
||||
except Exception as e:
|
||||
print(f" {sym}: 跳过 {e!r}")
|
||||
continue
|
||||
row = f" {sym:<5}"
|
||||
for _, fl, fs in cases:
|
||||
r = walk_filled(cdf, sig, notional, SL, SCALE_AT, RUNNER,
|
||||
RUNNER_STOP, MAXB, f=fl, f_short=fs)
|
||||
row += f"{budget_bp(r):>13.2f}bp " if not r.empty \
|
||||
else f"{'—':>18}"
|
||||
print(row)
|
||||
del cdf
|
||||
print("\n 2026-08-28 实测三档差异 ≤ 0.07bp,结论对曲线不敏感。")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--syms", default="BTC,ETH,SOL")
|
||||
ap.add_argument("--cache", default="research/live/cache")
|
||||
ap.add_argument("--save", default="research/out/step43_fill_budget.csv")
|
||||
ap.add_argument("--sensitivity", action="store_true",
|
||||
help="只跑成交分布曲线的敏感性检查")
|
||||
a = ap.parse_args()
|
||||
|
||||
if a.sensitivity:
|
||||
sensitivity(a.syms.split(","), Path(a.cache))
|
||||
return
|
||||
|
||||
from lib.exit_fill import (assert_converges, budget_bp, net_bp,
|
||||
walk_filled)
|
||||
from lib.exit_model import cfg_name, slip_budget
|
||||
|
||||
Reference in New Issue
Block a user