import json,datetime as dt,bisect,sys,math
from zoneinfo import ZoneInfo
ny=ZoneInfo('America/New_York')
c=json.load(open(sys.argv[1])); step=int(sys.argv[2]) if len(sys.argv)>2 else 300
ends=[x['bucketStart']+step for x in c]; px=[x['close'] for x in c]
def at(ts):
    i=bisect.bisect_right(ends,ts)-1
    return px[i] if i>=0 else None
hol={dt.date(2026,9,7),dt.date(2026,11,26)}
d=dt.datetime.fromtimestamp(c[0]['bucketStart'],ny).date()+dt.timedelta(days=1)
last=dt.datetime.fromtimestamp(c[-1]['bucketStart'],ny).date()
days=[]
while d<=last:
    if d.weekday()<5 and d not in hol: days.append(d)
    d+=dt.timedelta(days=1)
def ts(d,h,m): return int(dt.datetime(d.year,d.month,d.day,h,m,tzinfo=ny).timestamp())
on=1;intra=1;rows=[]
for a,b in zip(days,days[1:]):
    o=at(ts(b,9,35)); cl_a=at(ts(a,int(sys.argv[3]),int(sys.argv[4]))); cl_b=at(ts(b,int(sys.argv[3]),int(sys.argv[4])))
    if None in (o,cl_a,cl_b): continue
    r_on=o/cl_a-1; r_in=cl_b/o-1
    on*=1+r_on; intra*=1+r_in; rows.append((b,r_on,r_in))
for r in rows: print(r[0], f"{r[1]*100:+.2f}% overnight  {r[2]*100:+.2f}% day")
print(f"days {len(rows)} overnight {100*(on-1):+.2f}%  intraday {100*(intra-1):+.2f}%  buyhold {100*(on*intra-1):+.2f}%")
