Integrate factor attribution into backtest CLI
This commit is contained in:
27
main.py
27
main.py
@@ -5,6 +5,7 @@ import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
import data_manager
|
||||
import factor_attribution
|
||||
import metrics
|
||||
from strategies.adaptive_momentum import AdaptiveMomentumStrategy
|
||||
from strategies.buy_and_hold import BuyAndHoldStrategy
|
||||
@@ -163,6 +164,18 @@ def main() -> None:
|
||||
help="Execution mode: 'close' (default, signal & execute on close) or "
|
||||
"'open-close' (signal on morning open, execute at close)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--attribution", action="store_true",
|
||||
help="Run factor attribution after performance metrics",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--attribution-model", choices=["capm", "ff5", "ff5plus", "all"], default="all",
|
||||
help="Factor model selection for attribution output",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--attribution-export", default=None,
|
||||
help="Directory to export factor attribution CSVs",
|
||||
)
|
||||
args = parser.parse_args()
|
||||
initial_capital = args.capital if args.capital is not None else 10_000
|
||||
use_open = args.execution == "open-close"
|
||||
@@ -238,6 +251,20 @@ def main() -> None:
|
||||
continue
|
||||
metrics.summary(eq, name=name)
|
||||
|
||||
if args.attribution:
|
||||
summary_df, loadings_df = factor_attribution.attribute_strategies(
|
||||
results_df=results_df,
|
||||
benchmark_label=benchmark_label,
|
||||
benchmark=benchmark,
|
||||
price_data=data,
|
||||
market=args.market,
|
||||
model_selection=args.attribution_model,
|
||||
)
|
||||
factor_attribution.print_attribution_summary(summary_df)
|
||||
if args.attribution_export:
|
||||
factor_attribution.export_attribution(summary_df, loadings_df, args.attribution_export)
|
||||
print(f"Attribution CSVs written to {args.attribution_export}")
|
||||
|
||||
# --- Visualization ---
|
||||
if not args.no_plot:
|
||||
plot_results(results_df.dropna())
|
||||
|
||||
Reference in New Issue
Block a user