research(wave-0822): GROWTH-POLICY — il libro gira al 7% di Kelly, e ogni gate del progetto e' cieco alla scala
This commit is contained in:
@@ -115,7 +115,10 @@ def load_quoted_chain() -> pd.DataFrame:
|
||||
df = pd.concat(parts, ignore_index=True)
|
||||
del parts
|
||||
df = df.drop_duplicates(subset=["ts", "asset", "strike", "option_type", "exp"], keep="last")
|
||||
df["hr"] = df["ts"].dt.floor("h")
|
||||
# ⚠️ le quote di bite sono datetime64[us], il feed certificato e' [ns]: un join fra
|
||||
# DatetimeIndex di unita' diverse degrada a Index generico e rompe ogni resample a valle.
|
||||
df["hr"] = df["ts"].dt.floor("h").dt.as_unit("ns")
|
||||
df["exp"] = df["exp"].dt.as_unit("ns")
|
||||
df["dte"] = (df["exp"] - df["ts"]).dt.total_seconds() / 86400.0
|
||||
df["quoted"] = (df["bid"] > 0) & (df["ask"] > 0) & df["iv"].notna() & df["delta"].notna()
|
||||
return df
|
||||
@@ -290,7 +293,9 @@ def sezione1(curve: pd.DataFrame) -> dict:
|
||||
# SEZIONE 2 — Q1: LEAD-LAG. La pendenza precede o segue?
|
||||
# ===========================================================================================
|
||||
def slope_hourly(curve: pd.DataFrame, a: str) -> pd.Series:
|
||||
s = curve[curve.asset == a].set_index("hr")
|
||||
s = curve[curve.asset == a].copy()
|
||||
s["hr"] = pd.to_datetime(s["hr"], utc=True).dt.as_unit("ns")
|
||||
s = s.set_index("hr")
|
||||
return (s[f"iv_{BACK}"] - s[f"iv_{FRONT}"]).dropna().sort_index()
|
||||
|
||||
|
||||
@@ -356,7 +361,9 @@ def sezione2(curve: pd.DataFrame) -> dict:
|
||||
print("\n (c) IL CONFOUND DI QUESTO FILONE — la pendenza e' informazione NUOVA o RV riciclata?")
|
||||
rvp = (r1.rolling(24).std() * np.sqrt(24 * 365) * 100).reindex(idx)
|
||||
rvf = (r1.shift(-24).rolling(24).std().shift(-23) * np.sqrt(24 * 365) * 100).reindex(idx)
|
||||
ivf = curve[curve.asset == a].set_index("hr")[f"iv_{FRONT}"].reindex(idx)
|
||||
cf = curve[curve.asset == a].copy()
|
||||
cf["hr"] = pd.to_datetime(cf["hr"], utc=True).dt.as_unit("ns")
|
||||
ivf = cf.set_index("hr")[f"iv_{FRONT}"].reindex(idx)
|
||||
c_pp = float(j.slope.corr(rvp))
|
||||
c_pf = float(j.slope.corr(rvf))
|
||||
print(f" corr(pendenza, RV 24h PASSATA) {c_pp:+.3f} <-- quanto e' termometro")
|
||||
@@ -400,8 +407,14 @@ def sezione2(curve: pd.DataFrame) -> dict:
|
||||
x, y = sld[m].to_numpy(), fwd[m].to_numpy()
|
||||
c = float(np.corrcoef(x, y)[0, 1])
|
||||
p = _block_pctl(x, y, c, L=max(3 * h, 7))
|
||||
print(f" h={h}g n={m.sum():3d} corr={c:+.3f} pctl vs null a blocchi={p:.3f}")
|
||||
TRIALS.append((f"Q1 {a}: 3 orizzonti giornalieri", 3))
|
||||
c7 = float(np.corrcoef(x[:-7], y[:-7])[0, 1]) if len(x) > 20 else np.nan
|
||||
c7b = float(np.corrcoef(x[7:], y[7:])[0, 1]) if len(x) > 20 else np.nan
|
||||
print(f" h={h}g n={m.sum():3d} corr={c:+.3f} pctl vs null a blocchi={p:.3f}"
|
||||
f" | senza ultima settimana {c7:+.3f} | senza prima settimana {c7b:+.3f}")
|
||||
print(" ^ le due colonne di destra sono il test di RISOLUZIONE: se togliere 7")
|
||||
print(" giorni su 74 sposta la correlazione di piu' di quanto la correlazione")
|
||||
print(" valga, il campione non sta misurando, sta oscillando.")
|
||||
TRIALS.append((f"Q1 {a}: 3 orizzonti giornalieri x 3 sottocampioni", 9))
|
||||
return res
|
||||
|
||||
|
||||
@@ -600,6 +613,7 @@ def sezione4(curve: pd.DataFrame) -> None:
|
||||
sub("(b) ridondanza, per quel che il campione consente")
|
||||
for a in ASSETS:
|
||||
sl = slope_hourly(curve, a).resample("1D").last().dropna()
|
||||
sl.index = pd.DatetimeIndex(sl.index).as_unit("ns")
|
||||
j = pd.concat({"slope": sl, "tp": pos[a]}, axis=1, join="inner").dropna()
|
||||
for qq in (0.10, 0.25, 0.40):
|
||||
th = j.slope.quantile(qq)
|
||||
@@ -704,6 +718,7 @@ def sezione5(curve: pd.DataFrame) -> None:
|
||||
sub("(a) quanto e' buono il proxy (misurato sulla finestra vera, non assunto)")
|
||||
for a in ASSETS:
|
||||
sl = slope_hourly(curve, a).resample("1D").last().dropna()
|
||||
sl.index = pd.DatetimeIndex(sl.index).as_unit("ns")
|
||||
df = A.get(a, "1d")
|
||||
p = pd.Series(_proxy_slope(df, a),
|
||||
index=pd.DatetimeIndex(pd.to_datetime(df["datetime"], utc=True))).dropna()
|
||||
|
||||
Reference in New Issue
Block a user