research(wave-0822): DEALER-GAMMA scartato — e dealer_net_gamma e' il GEX col segno invertito
This commit is contained in:
@@ -182,6 +182,7 @@ def extract(asset: str, off: int) -> dict:
|
||||
ts_close=ltf["timestamp"].values.astype(np.int64) + LTF_MIN * 60_000,
|
||||
day_ent=idx[idxE].floor("D") if len(idxE) else pd.DatetimeIndex([], tz="UTC"),
|
||||
)
|
||||
out["base_daily"] = equity_daily(out, size_flat(out)) # riusata da VTL/§9: calcolarla 1 volta
|
||||
R._CACHE.clear() # ent = 18k dict per chiave: non accumulare
|
||||
return out
|
||||
|
||||
@@ -413,8 +414,7 @@ def main() -> None:
|
||||
for o in offs:
|
||||
sz = {}
|
||||
for a in ASSETS:
|
||||
base_a = equity_daily(EX[o][a], size_flat(EX[o][a]))
|
||||
sz[a] = sizes_from_L(EX[o][a], leverage_series(base_a, **sp))
|
||||
sz[a] = sizes_from_L(EX[o][a], leverage_series(EX[o][a]["base_daily"], **sp))
|
||||
SLE[nm][o] = leg_daily(EX[o], sz)
|
||||
BK[nm][o] = book(TP, SLE[nm][o])
|
||||
MTP[nm][o] = 1.0
|
||||
@@ -546,6 +546,13 @@ def main() -> None:
|
||||
print(f" {n:<28} IS {is_med[n]:>7.3f} HOLD {ho_med[n]:>7.3f} FULL {fu_med[n]:>7.3f}")
|
||||
best = max(CAUSAL, key=lambda x: is_med[x])
|
||||
print(f"\n cella scelta AL BUIO: {best} (IS {is_med[best]:.3f} vs baseline {base_is:.3f})")
|
||||
iso_is = {n: float(np.median([sh(ins(BK[n][o])) - sh(ins(CTRL[n][o])) for o in offs]))
|
||||
for n in CAUSAL}
|
||||
best_iso = max(CAUSAL, key=lambda x: iso_is[x])
|
||||
print(f" cella scelta AL BUIO **a ISO-PESO**: {best_iso} (dIS iso {iso_is[best_iso]:+.3f})")
|
||||
print(f" la stessa cella a iso-peso: dShFULL {RES[best]['iF']:+.3f} "
|
||||
f"({RES[best]['niF']}/{len(offs)}), dShHOLD {RES[best]['iH']:+.3f} "
|
||||
f"({RES[best]['niH']}/{len(offs)})")
|
||||
trials = [fu_med[n] for n in CAUSAL] + [med_F]
|
||||
dsr, sr0 = A.deflated_sharpe(fu_med[best], trials, BK[best][can])
|
||||
dsr_b, _ = A.deflated_sharpe(med_F, trials, base_b[can])
|
||||
@@ -599,9 +606,9 @@ def main() -> None:
|
||||
f"attive {imp.get('active_frac', 0)*100:.1f}% perdite/attive "
|
||||
f"{imp.get('loss_frac', 0)*100:.1f}% Calmar {imp.get('calmar', 0):.1f}")
|
||||
cols = {"TP01": TP, "SKH01": SLE["BASE"][can]}
|
||||
for nm in [best_sleeve, list(BVT)[0]]:
|
||||
m = vol(SLE[nm][can]) / vol(SLE["BASE"][can])
|
||||
wp = {"TP01": W_TP, "SKH01": W_SKH * m}
|
||||
for nm in [best, best_sleeve] + list(BVT)[:2]:
|
||||
m_s = vol(SLE[nm][can]) / vol(SLE["BASE"][can])
|
||||
wp = {"TP01": W_TP * MTP[nm][can], "SKH01": W_SKH * m_s}
|
||||
g = weights_tilt_null(cols, {"TP01": W_TP, "SKH01": W_SKH}, wp,
|
||||
caps={"SKH01": 0.5}, floor=0.05, n=300, k_seen=len(ALL))
|
||||
print(f" tilt-null {nm:<26} peso equiv SKH {wp['SKH01']/sum(wp.values()):.3f} "
|
||||
@@ -634,6 +641,57 @@ def main() -> None:
|
||||
print(f" {label:<28}{tm:>10.3f}{tr:>10.3f}{tm-tr:>9.3f}{no:>13}{ns:>11}{tu:>12.1f}")
|
||||
print(" 'ordini eseg' e 'sotto-min' sono sui due asset sommati, su tutta la storia 1h.")
|
||||
|
||||
# ------------------------------------------------------------------ §9 per anno + deriva
|
||||
print("\n" + "-" * 112)
|
||||
print(" 9. SCOMPOSIZIONE PER ANNO del dSharpe a ISO-PESO (regola codificata dopo SOL, 22/08:")
|
||||
print(" un contributo positivo si scompone per ANNO prima di crederci) + deriva della size")
|
||||
print("-" * 112)
|
||||
yrs = sorted({int(y) for y in BK["BASE"][can].index.year})
|
||||
top = [best, best_iso] + [max(BVT, key=lambda x: RES[x]["iF"])]
|
||||
top = list(dict.fromkeys(top))
|
||||
print(f" {'variante':<28}" + "".join(f"{y:>8}" for y in yrs))
|
||||
for nm in top:
|
||||
cells = []
|
||||
for y in yrs:
|
||||
v = []
|
||||
for o in offs:
|
||||
a_ = BK[nm][o][BK[nm][o].index.year == y]
|
||||
c_ = CTRL[nm][o][CTRL[nm][o].index.year == y]
|
||||
if len(a_) > 20:
|
||||
v.append(sh(a_) - sh(c_))
|
||||
cells.append(float(np.median(v)) if v else float("nan"))
|
||||
npos = int(np.nansum(np.asarray(cells) > 0))
|
||||
print(f" {nm:<28}" + "".join(f"{c:>+8.2f}" for c in cells) +
|
||||
f" anni positivi {npos}/{len(yrs)}")
|
||||
print()
|
||||
for nm in top:
|
||||
if nm in SZ:
|
||||
szs = np.concatenate([SZ[nm](EX[can][a]) for a in ASSETS])
|
||||
dys = pd.DatetimeIndex(np.concatenate([EX[can][a]["day_ent"].values for a in ASSETS]))
|
||||
elif nm in VTL:
|
||||
szs, dys = [], []
|
||||
for a in ASSETS:
|
||||
szs.append(sizes_from_L(EX[can][a],
|
||||
leverage_series(EX[can][a]["base_daily"], **VTL[nm])))
|
||||
dys.append(EX[can][a]["day_ent"].values)
|
||||
szs = np.concatenate(szs); dys = pd.DatetimeIndex(np.concatenate(dys))
|
||||
else:
|
||||
L = leverage_series(BK["BASE"][can], BVT[nm]["tv"], BVT[nm]["w"], BVT[nm]["cap"])
|
||||
szs, dys = [], []
|
||||
for a in ASSETS:
|
||||
szs.append(sizes_from_L(EX[can][a], L))
|
||||
dys.append(EX[can][a]["day_ent"].values)
|
||||
szs = np.concatenate(szs); dys = pd.DatetimeIndex(np.concatenate(dys))
|
||||
s = pd.Series(szs, index=dys)
|
||||
med = s.groupby(s.index.year).median()
|
||||
rho = float(np.corrcoef(np.arange(len(med)), med.values)[0, 1]) if len(med) > 2 else float("nan")
|
||||
print(f" size mediana per anno — {nm:<22}" +
|
||||
"".join(f"{med.get(y, float('nan')):>8.2f}" for y in yrs) +
|
||||
f" corr col tempo {rho:+.2f}")
|
||||
print(" ⚠️ una size che DERIVA col tempo non e' controllo del rischio: e' un tilt temporale")
|
||||
print(" (la vol crypto e' scesa lungo il campione -> qualunque 1/vol pesa di piu' il")
|
||||
print(" periodo recente, che e' anche l'hold-out). La riga 'corr col tempo' la misura.")
|
||||
|
||||
print("\n" + "=" * 112)
|
||||
print(f" fatto in {time.time()-t0:.0f}s")
|
||||
print("=" * 112)
|
||||
@@ -652,8 +710,7 @@ def netted_target(asset: str, ex: dict, nm, SZ, VTL, BVT, SLE, TP, can, df1h) ->
|
||||
elif nm in SZ:
|
||||
sizes = SZ[nm](ex)
|
||||
elif nm in VTL:
|
||||
base_a = equity_daily(ex, size_flat(ex))
|
||||
sizes = sizes_from_L(ex, leverage_series(base_a, **VTL[nm]))
|
||||
sizes = sizes_from_L(ex, leverage_series(ex["base_daily"], **VTL[nm]))
|
||||
else: # BOOKVT
|
||||
L = leverage_series(book(TP, SLE["BASE"][can]), BVT[nm]["tv"], BVT[nm]["w"], BVT[nm]["cap"])
|
||||
sizes = sizes_from_L(ex, L)
|
||||
|
||||
Reference in New Issue
Block a user