import pandas as pd
import numpy as np
import yfinance as yf
from ephem import Observer, Moon, Date

def get_lunar_phase(date):
    obs = Observer()
    obs.date = date
    m = Moon()
    m.compute(obs)
    # phase is 0-100, where 0=new, 50=full, 100=new
    return m.phase

def run_audit(ticker="ES=F", years=5):
    print(f"Fetching data for {ticker}...")
    data = yf.download(ticker, period=f"{years}y")
    if data.empty:
        print("No data found.")
        return

    data['Returns'] = data['Adj Close'].pct_change()
    
    print("Calculating lunar phases...")
    # New Moon is approx phase 0 or 100 (using moon illumination/age logic)
    # Full Moon is approx phase 100 illumination
    # Using ephem: m.phase returns % illumination (0 to 100)
    
    data['Moon_Illum'] = [get_lunar_phase(d) for d in data.index]
    
    # Define windows: 
    # New Moon: 7 days centered on New Moon (Illumination < 15%)
    # Full Moon: 7 days centered on Full Moon (Illumination > 85%)
    
    new_moon_days = data[data['Moon_Illum'] < 15]
    full_moon_days = data[data['Moon_Illum'] > 85]
    
    new_moon_ret = new_moon_days['Returns'].mean() * 252
    full_moon_ret = full_moon_days['Returns'].mean() * 252
    
    print(f"\n--- Audit Results ({ticker}, Last {years} Years) ---")
    print(f"Annualized Return (New Moon Window): {new_moon_ret:.2%}")
    print(f"Annualized Return (Full Moon Window): {full_moon_ret:.2%}")
    print(f"Alpha (New - Full): {new_moon_ret - full_moon_ret:.2%}")
    
    # Check sample size
    print(f"Sample Sizes: New={len(new_moon_days)}, Full={len(full_moon_days)}")

if __name__ == "__main__":
    run_audit()
