Warrior_EA/research/test_depth.py

99 lines
4.4 KiB
Python
Raw Permalink Normal View History

"""How deep should you wait for the retest? The whole curve, not three points.
Established: at three discrete retest locations the ordering was price edge > value-area edge
> VPOC, monotone in all 8 symbol/timeframe combinations, and the proposed mechanism is
adverse selection - a pullback that reaches deeper into the old range is disproportionately a
breakout that has already failed.
If that mechanism is right it is a CONTINUUM, not three points, and it makes a prediction
that can be checked without choosing anything: expR must fall monotonically as the order is
placed deeper. It also says where to look for the near-zero base the context modifier needs -
on the SHALLOW side, past the price edge, where nobody in either book places an order.
phi < 1 a shallow pullback that never reaches the broken edge - nobody trades here
phi = 1 the price edge itself - the classic Last Point of Support
phi > 1 through the edge into the old range: value-area edge and VPOC territory
ARMS
----
real limit at price_now - phi*(price_now - edge)
placebo limit at the same DISTANCE from the same starting price, distances permuted
across events. Geometry identical, level identity destroyed. Without it, a
shallow-side profit is indistinguishable from "buying small dips works".
The placebo is the arm that matters most. A leak or a drift effect lifts BOTH curves; only a
gap between them is about the level.
"""
import numpy as np, sys, time
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
import fills, book, wyckoff
SYMS = ('EURUSD', 'USDJPY', 'XAUUSD', 'SP500')
DEPTHS = (0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 2.0)
def curve(sym, tf, kR=2.0, mrisk=2.0, wait=40, H=200, depths=DEPTHS, seed=11):
bk = fills.Book(sym)
f = book.frame(sym, tf, bk)
ev = wyckoff.breakouts(f)
if ev is None:
return None
rows = []
for u in depths:
a = wyckoff.retest(sym, tf, u, mrisk=mrisk, kR=kR, wait=wait, H=H,
bk=bk, f=f, ev=ev)
b = wyckoff.retest(sym, tf, u, mrisk=mrisk, kR=kR, wait=wait, H=H,
bk=bk, f=f, ev=ev, placebo=seed)
rows.append((u, a, b))
return rows, ev
def show(sym, tf, rows):
print(f"\n --- {sym} {tf} ---")
print(f" {'phi':>6}{'n':>7}{'ind':>7}{'fill%':>7}{'REAL':>9}{'t':>7}"
f"{'placebo':>9}{'t':>7}{'real-plac':>11}{'unres%':>8}")
us, re, pl = [], [], []
for u, a, b in rows:
if a is None:
continue
A = a['R'][a['indep']]
B = b['R'][b['indep']] if b is not None else np.array([0.0])
us.append(u); re.append(A.mean()); pl.append(B.mean())
print(f" {u:>+6.2f}{a['n']:>7}{int(a['indep'].sum()):>7}"
f"{100*a['n']/max(a['placed'],1):>6.1f}%{A.mean():>+9.4f}{book.tstat(A):>+7.2f}"
f"{B.mean():>+9.4f}{book.tstat(B):>+7.2f}"
f"{A.mean()-B.mean():>+11.4f}{100*a['unresolved']:>7.1f}%")
if len(us) >= 4:
s1, t1 = book.slope_t(np.array(re), np.array(us))
s2, t2 = book.slope_t(np.array(pl), np.array(us))
print(f" slope vs depth: real {s1:+.4f} (t {t1:+.2f}) "
f"placebo {s2:+.4f} (t {t2:+.2f})")
return us, re, pl
if __name__ == '__main__':
syms = [s for s in sys.argv[1:] if s in SYMS] or list(SYMS)
print("=== RETEST DEPTH CURVE ===")
print(" prediction from the adverse-selection mechanism: expR falls as phi RISES.")
print(" phi<1 is the shallow side nobody trades - where a near-zero base could live.")
allrows = []
for sym in syms:
for tf in ('H1', 'H4'):
t0 = time.time()
out = curve(sym, tf)
if out is None:
print(f"\n --- {sym} {tf} --- no events"); continue
rows, ev = out
us, re, pl = show(sym, tf, rows)
print(f" ({len(ev['i']):,} breakouts, {time.time()-t0:.0f}s)")
allrows.append((sym, tf, us, re, pl))
if allrows:
print("\n=== POOLED SHAPE ===")
print(f" {'phi':>6}{'mean real':>11}{'mean placebo':>14}{'cells real>plac':>17}")
for k, u in enumerate(DEPTHS):
r = [re[k] for _, _, us, re, pl in allrows if k < len(re)]
p = [pl[k] for _, _, us, re, pl in allrows if k < len(pl)]
if not r:
continue
w = sum(1 for x, y in zip(r, p) if x > y)
print(f" {u:>+6.2f}{np.mean(r):>+11.4f}{np.mean(p):>+14.4f}{w:>10}/{len(r)}")