research(skyhook): inline lever-scout -> shorts essential, regime gate matters, ptn_n=55/vol_lo=40/wider-stops lift hold-out
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
"""Fast inline lever-scout for Skyhook before the agent wave. One fee (0.10% RT), both assets,
|
||||
min-asset FULL & HOLD-OUT Sharpe. Maps which knobs move the honest hold-out."""
|
||||
import sys
|
||||
from dataclasses import replace
|
||||
|
||||
sys.path.insert(0, "/opt/docker/PythagorasGoal/scripts/research/skyhook")
|
||||
import skyhooklib as sk
|
||||
from src.strategies.skyhook import SkyhookParams
|
||||
|
||||
|
||||
def quick(p: SkyhookParams) -> dict:
|
||||
rs = {a: sk.run_asset(a, p, sk.FEE_RT) for a in sk.CERTIFIED}
|
||||
mf = min(rs[a]["full"]["sharpe"] for a in rs)
|
||||
mh = min(rs[a]["holdout"]["sharpe"] for a in rs)
|
||||
mt = min(rs[a]["full"]["n_trades"] for a in rs)
|
||||
avg_dd = sum(rs[a]["full"]["maxdd"] for a in rs) / 2
|
||||
return dict(minFull=mf, minHold=mh, minTr=mt, dd=round(avg_dd, 3),
|
||||
btc=rs["BTC"]["full"]["sharpe"], eth=rs["ETH"]["full"]["sharpe"],
|
||||
btcH=rs["BTC"]["holdout"]["sharpe"], ethH=rs["ETH"]["holdout"]["sharpe"])
|
||||
|
||||
|
||||
base = SkyhookParams()
|
||||
GRID = {
|
||||
"long_only": [dict(long_only=True), dict(long_only=False)],
|
||||
"ptn_n": [dict(ptn_n=n) for n in (8, 13, 20, 34, 55)],
|
||||
"RR(sl,tp)": [dict(sl_atr=s, tp_atr=t) for s, t in
|
||||
((1.5, 4.0), (2.0, 5.0), (2.5, 6.0), (3.0, 4.0), (2.0, 8.0), (3.0, 9.0))],
|
||||
"exitbars": [dict(uscitalong=l, uscitashort=s) for l, s in
|
||||
((12, 9), (24, 18), (36, 24), (48, 36))],
|
||||
"vola_band": [dict(vola_lo=lo, vola_hi=hi) for lo, hi in
|
||||
((0, 100), (35, 95), (50, 100), (50, 90), (20, 80))],
|
||||
"vol_band": [dict(vol_lo=lo, vol_hi=hi) for lo, hi in
|
||||
((0, 100), (50, 100), (60, 100), (40, 100), (50, 80))],
|
||||
}
|
||||
|
||||
print(f"{'param':<14s} {'value':<28s} {'minF':>6s} {'minH':>6s} {'btc/eth F':>12s} {'btc/eth H':>12s} {'tr':>5s} {'dd':>5s}")
|
||||
print(f" BASELINE: {quick(base)}")
|
||||
print("-" * 100)
|
||||
for fam, variants in GRID.items():
|
||||
for v in variants:
|
||||
p = replace(base, **v)
|
||||
q = quick(p)
|
||||
tag = "PASS" if (q["minFull"] >= 0.5 and q["minHold"] >= 0.2) else ""
|
||||
print(f"{fam:<14s} {str(v):<28s} {q['minFull']:>+6.2f} {q['minHold']:>+6.2f} "
|
||||
f"{q['btc']:>+5.2f}/{q['eth']:>+5.2f} {q['btcH']:>+5.2f}/{q['ethH']:>+5.2f} "
|
||||
f"{q['minTr']:>5d} {q['dd']*100:>4.0f}% {tag}")
|
||||
Reference in New Issue
Block a user