出场模型改为按成交量结算止盈限价单,并出预算对仓位规模的曲线

exit_model.walk_exits 给止盈记的毛收益是 target*a/entry,即假定限价单全额
成交在目标价。新增 lib/exit_fill.py:两张挂单常驻(半仓 3ATR、半仓 8ATR),
每根按该根在限价之上的可成交量逐步吃进,未成交部分继续持有,止损触发时
市价平掉剩余。可成交量 = 形状函数 f(k) × 该根主动买成交额,f 由影子成交流
实测(近似线性,即区间内均匀分布,故结论对形状假设不敏感)。

结果:预算对仓位规模远比预期稳健。到 100 万名义额,BTC 10.97→10.69、
ETH 15.34→15.20、SOL 17.21→15.83bp。原因是挂单常驻多根而非只在首次触及
那一根成交,且价格决定性穿过限价时整根成交量都可用。

首版实现有个静默 bug 值得记:avail_above 里有个 `hi <= 0` 的守卫,而空头
用「价格取负」处理,负价格空间里 hi 恒为负——所有空头挂单的可成交量一律
判 0,空头全被拖到 48 根超时收盘。下跌段里那比 3ATR 目标赚得多,于是预算
反而偏高 0.76bp,表现为「一个看似合理的模型差异」。已改为显式方向参数,
并加 assert_converges:仓位趋近 0 时必须逐笔收敛到 walk_exits,不符即抛错。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jack
2026-08-28 02:39:47 +08:00
co-authored by Cursor
parent 181bca303f
commit 28075173af
3 changed files with 407 additions and 0 deletions
+28
View File
@@ -0,0 +1,28 @@
sym,notional,budget_bp,budget_bp_old,maker_share,w_stop,w_time,net_bp,n
BTC,5000.0,10.971497515124305,10.971497515124295,0.4230769230769231,0.3516483516483517,0.22527472527472528,15.724284543080632,91
BTC,10000.0,10.971497515124305,10.971497515124295,0.4230769230769231,0.3516483516483517,0.22527472527472528,15.724284543080632,91
BTC,20000.0,10.971497515124305,10.971497515124295,0.4230769230769231,0.3516483516483517,0.22527472527472528,15.724284543080632,91
BTC,50000.0,10.971497515124305,10.971497515124295,0.4230769230769231,0.3516483516483517,0.22527472527472528,15.724284543080632,91
BTC,100000.0,10.971497515124305,10.971497515124295,0.4230769230769231,0.3516483516483517,0.22527472527472528,15.724284543080632,91
BTC,200000.0,10.971497515124305,10.971497515124295,0.4230769230769231,0.3516483516483517,0.22527472527472528,15.724284543080632,91
BTC,320000.0,10.971497515124305,10.971497515124295,0.4230769230769231,0.3516483516483517,0.22527472527472528,15.724284543080632,91
BTC,530000.0,10.908448857487189,10.971497515124295,0.4214204503001539,0.3524912405185926,0.22608830918125347,15.641274735676083,91
BTC,1000000.0,10.690710190313572,10.971497515124295,0.41456048099090254,0.35467750033199696,0.23076201867710053,15.36403490298731,91
ETH,5000.0,15.336810540229132,15.336810540229127,0.4722222222222222,0.3253968253968254,0.20238095238095238,21.90346054757228,126
ETH,10000.0,15.336810540229132,15.336810540229127,0.4722222222222222,0.3253968253968254,0.20238095238095238,21.90346054757228,126
ETH,20000.0,15.336810540229132,15.336810540229127,0.4722222222222222,0.3253968253968254,0.20238095238095238,21.90346054757228,126
ETH,50000.0,15.336810540229132,15.336810540229127,0.4722222222222222,0.3253968253968254,0.20238095238095238,21.90346054757228,126
ETH,100000.0,15.336810540229132,15.336810540229127,0.4722222222222222,0.3253968253968254,0.20238095238095238,21.90346054757228,126
ETH,200000.0,15.336810540229132,15.336810540229127,0.4722222222222222,0.3253968253968254,0.20238095238095238,21.90346054757228,126
ETH,320000.0,15.336810540229132,15.336810540229127,0.4722222222222222,0.3253968253968254,0.20238095238095238,21.90346054757228,126
ETH,530000.0,15.336810540229132,15.336810540229127,0.4722222222222222,0.3253968253968254,0.20238095238095238,21.90346054757228,126
ETH,1000000.0,15.19839735083419,15.336810540229127,0.46778822061185865,0.3266775971833763,0.20553418220476508,21.75495166938152,126
SOL,5000.0,17.20729581305582,17.207295813055815,0.49310344827586206,0.2655172413793103,0.2413793103448276,24.42271817346687,145
SOL,10000.0,17.20729581305582,17.207295813055815,0.49310344827586206,0.2655172413793103,0.2413793103448276,24.42271817346687,145
SOL,20000.0,17.20729581305582,17.207295813055815,0.49310344827586206,0.2655172413793103,0.2413793103448276,24.42271817346687,145
SOL,50000.0,17.12169148018871,17.207295813055815,0.49112524587410755,0.26723407222095347,0.24164068190493895,24.325613268263233,145
SOL,100000.0,17.024617862994077,17.207295813055815,0.4874068783573466,0.2680997947311664,0.24449332691148706,24.238726756516837,145
SOL,200000.0,16.83524812354264,17.207295813055815,0.4813611824188418,0.26935037627246794,0.24928844130869035,24.048022486441045,145
SOL,320000.0,16.524586307202075,17.207295813055815,0.4732031722818229,0.27277272324336915,0.254024104474808,23.702889125473174,145
SOL,530000.0,16.275686387067427,17.207295813055815,0.4660589094844057,0.2753631016069268,0.2585779889086674,23.432003034952427,145
SOL,1000000.0,15.829170691791866,17.207295813055815,0.4547125585779213,0.27881565544002057,0.2664717859820582,22.915331236730324,145
1 sym notional budget_bp budget_bp_old maker_share w_stop w_time net_bp n
2 BTC 5000.0 10.971497515124305 10.971497515124295 0.4230769230769231 0.3516483516483517 0.22527472527472528 15.724284543080632 91
3 BTC 10000.0 10.971497515124305 10.971497515124295 0.4230769230769231 0.3516483516483517 0.22527472527472528 15.724284543080632 91
4 BTC 20000.0 10.971497515124305 10.971497515124295 0.4230769230769231 0.3516483516483517 0.22527472527472528 15.724284543080632 91
5 BTC 50000.0 10.971497515124305 10.971497515124295 0.4230769230769231 0.3516483516483517 0.22527472527472528 15.724284543080632 91
6 BTC 100000.0 10.971497515124305 10.971497515124295 0.4230769230769231 0.3516483516483517 0.22527472527472528 15.724284543080632 91
7 BTC 200000.0 10.971497515124305 10.971497515124295 0.4230769230769231 0.3516483516483517 0.22527472527472528 15.724284543080632 91
8 BTC 320000.0 10.971497515124305 10.971497515124295 0.4230769230769231 0.3516483516483517 0.22527472527472528 15.724284543080632 91
9 BTC 530000.0 10.908448857487189 10.971497515124295 0.4214204503001539 0.3524912405185926 0.22608830918125347 15.641274735676083 91
10 BTC 1000000.0 10.690710190313572 10.971497515124295 0.41456048099090254 0.35467750033199696 0.23076201867710053 15.36403490298731 91
11 ETH 5000.0 15.336810540229132 15.336810540229127 0.4722222222222222 0.3253968253968254 0.20238095238095238 21.90346054757228 126
12 ETH 10000.0 15.336810540229132 15.336810540229127 0.4722222222222222 0.3253968253968254 0.20238095238095238 21.90346054757228 126
13 ETH 20000.0 15.336810540229132 15.336810540229127 0.4722222222222222 0.3253968253968254 0.20238095238095238 21.90346054757228 126
14 ETH 50000.0 15.336810540229132 15.336810540229127 0.4722222222222222 0.3253968253968254 0.20238095238095238 21.90346054757228 126
15 ETH 100000.0 15.336810540229132 15.336810540229127 0.4722222222222222 0.3253968253968254 0.20238095238095238 21.90346054757228 126
16 ETH 200000.0 15.336810540229132 15.336810540229127 0.4722222222222222 0.3253968253968254 0.20238095238095238 21.90346054757228 126
17 ETH 320000.0 15.336810540229132 15.336810540229127 0.4722222222222222 0.3253968253968254 0.20238095238095238 21.90346054757228 126
18 ETH 530000.0 15.336810540229132 15.336810540229127 0.4722222222222222 0.3253968253968254 0.20238095238095238 21.90346054757228 126
19 ETH 1000000.0 15.19839735083419 15.336810540229127 0.46778822061185865 0.3266775971833763 0.20553418220476508 21.75495166938152 126
20 SOL 5000.0 17.20729581305582 17.207295813055815 0.49310344827586206 0.2655172413793103 0.2413793103448276 24.42271817346687 145
21 SOL 10000.0 17.20729581305582 17.207295813055815 0.49310344827586206 0.2655172413793103 0.2413793103448276 24.42271817346687 145
22 SOL 20000.0 17.20729581305582 17.207295813055815 0.49310344827586206 0.2655172413793103 0.2413793103448276 24.42271817346687 145
23 SOL 50000.0 17.12169148018871 17.207295813055815 0.49112524587410755 0.26723407222095347 0.24164068190493895 24.325613268263233 145
24 SOL 100000.0 17.024617862994077 17.207295813055815 0.4874068783573466 0.2680997947311664 0.24449332691148706 24.238726756516837 145
25 SOL 200000.0 16.83524812354264 17.207295813055815 0.4813611824188418 0.26935037627246794 0.24928844130869035 24.048022486441045 145
26 SOL 320000.0 16.524586307202075 17.207295813055815 0.4732031722818229 0.27277272324336915 0.254024104474808 23.702889125473174 145
27 SOL 530000.0 16.275686387067427 17.207295813055815 0.4660589094844057 0.2753631016069268 0.2585779889086674 23.432003034952427 145
28 SOL 1000000.0 15.829170691791866 17.207295813055815 0.4547125585779213 0.27881565544002057 0.2664717859820582 22.915331236730324 145