feat: add strict US alpha research pipeline
This commit is contained in:
36
research/us_alpha_report.py
Normal file
36
research/us_alpha_report.py
Normal file
@@ -0,0 +1,36 @@
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
|
||||
TRADING_DAYS_PER_YEAR = 252
|
||||
|
||||
|
||||
def summarize_equity_window(equity: pd.Series, strategy: str, window_years: int | float) -> dict:
|
||||
"""Summarize a strategy equity curve over a trailing trading-day window."""
|
||||
window_days = max(int(window_years * TRADING_DAYS_PER_YEAR), 1)
|
||||
window_equity = equity.tail(window_days + 1).dropna()
|
||||
if len(window_equity) < 2:
|
||||
return {
|
||||
"strategy": strategy,
|
||||
"window_years": window_years,
|
||||
"CAGR": np.nan,
|
||||
"Sharpe": np.nan,
|
||||
"MaxDD": np.nan,
|
||||
"TotalRet": np.nan,
|
||||
}
|
||||
|
||||
daily = window_equity.pct_change(fill_method=None).dropna()
|
||||
total_ret = window_equity.iloc[-1] / window_equity.iloc[0] - 1
|
||||
years = len(daily) / TRADING_DAYS_PER_YEAR
|
||||
cagr = (window_equity.iloc[-1] / window_equity.iloc[0]) ** (1 / years) - 1 if years > 0 else np.nan
|
||||
vol = daily.std() * np.sqrt(TRADING_DAYS_PER_YEAR)
|
||||
sharpe = (daily.mean() * TRADING_DAYS_PER_YEAR) / vol if vol > 0 else 0.0
|
||||
max_dd = (window_equity / window_equity.cummax() - 1).min()
|
||||
return {
|
||||
"strategy": strategy,
|
||||
"window_years": window_years,
|
||||
"CAGR": cagr,
|
||||
"Sharpe": sharpe,
|
||||
"MaxDD": max_dd,
|
||||
"TotalRet": total_ret,
|
||||
}
|
||||
Reference in New Issue
Block a user