from table_builder import trans def build_bench_html(bench, bench_ticker, trading_days, equity, bt_stats, has_curr, curr_bt_stats, curr): bench_html = "" if bench is not None and not bench.empty: bench_base = float(bench.iloc[0]) bench_total = (float(bench.iloc[-1]) / bench_base - 1) if bench_base > 1e-5 else 0.0 n_yrs_bt = len(equity) / trading_days port_ann_r = (1 + bt_stats["total_ret"]) ** (1 / max(n_yrs_bt, 0.1)) - 1 bench_ann_r = (1 + bench_total) ** (1 / max(n_yrs_bt, 0.1)) - 1 curr_ann_r = None if has_curr and curr_bt_stats: curr_ann_r = (1 + curr_bt_stats["total_ret"]) ** (1 / max(n_yrs_bt, 0.1)) - 1 bench_html = ( f'
{bench_ticker} Ann. Return
' f'
{bench_ann_r:+.2%}
' f'
' f'
Ann. Alpha vs {bench_ticker} ⓘ
' + trans(curr_ann_r - bench_ann_r if curr_ann_r is not None else None, port_ann_r - bench_ann_r, curr=curr, has_curr=has_curr, is_pct=True, tooltip=f"Alpha = your portfolio's ann. return minus {bench_ticker}'s ann. return. Positive = outperformance.") + '
' ) return bench_html def build_oos_section(oos_stats): oos_section = "" if oos_stats: o_col = "green" if oos_stats['ann_ret'] >= 0 else "red" oos_section = ( f'
' f'
' f'
Walk-Fwd Ann. Return ⓘ
' f'
{oos_stats["ann_ret"]:+.2%}
' f'
' f'
Walk-Fwd Sharpe ⓘ
' f'
{oos_stats["sharpe"]:.2f}
' f'
' f'
Walk-Fwd Max DD ⓘ
' f'
{oos_stats["max_dd"]:.2%}
' f'
DD Duration
' f'
{oos_stats["dd_days"]} days
' f'
' ) return oos_section