Portfolio Analysis¶
This guide covers the core portfolio analysis capabilities.
Loading Data¶
from portfolio_analysis import DataLoader
# Define your portfolio
tickers = ['VTI', 'VXUS', 'BND', 'VNQ']
loader = DataLoader(tickers, '2019-01-01', '2024-01-01')
# Fetch adjusted close prices
prices = loader.fetch_data()
# Or fetch returns directly
returns = loader.fetch_returns(frequency='daily') # or 'weekly', 'monthly'
Portfolio Analysis¶
from portfolio_analysis import PortfolioAnalysis
weights = [0.4, 0.2, 0.3, 0.1]
portfolio = PortfolioAnalysis(prices, weights)
# Individual metrics
annual_return = portfolio.calculate_portfolio_return()
annual_vol = portfolio.calculate_portfolio_volatility()
sharpe = portfolio.calculate_portfolio_sharpe_ratio(risk_free_rate=0.04)
max_dd = portfolio.calculate_max_drawdown()
# Get all metrics at once
summary = portfolio.get_summary()
portfolio.print_summary()
Performance Metrics¶
from portfolio_analysis import PerformanceMetrics
# Calculate for all assets
annual_returns = PerformanceMetrics.calculate_annual_return(prices)
annual_vols = PerformanceMetrics.calculate_annual_volatility(prices)
sharpe_ratios = PerformanceMetrics.calculate_sharpe_ratio(prices)
sortino_ratios = PerformanceMetrics.calculate_sortino_ratio(prices)
max_drawdowns = PerformanceMetrics.calculate_max_drawdown(prices)
var_95 = PerformanceMetrics.calculate_var(prices, confidence_level=0.95)
cagr = PerformanceMetrics.calculate_cagr(prices)
calmar = PerformanceMetrics.calculate_calmar_ratio(prices)
Benchmark Comparison¶
from portfolio_analysis import BenchmarkComparison
benchmark = BenchmarkComparison(prices, weights, benchmark_ticker='SPY')
# Key metrics
alpha = benchmark.calculate_alpha()
beta = benchmark.calculate_beta()
tracking_error = benchmark.calculate_tracking_error()
info_ratio = benchmark.calculate_information_ratio()
up_capture = benchmark.calculate_up_capture()
down_capture = benchmark.calculate_down_capture()
benchmark.print_comparison()
Monte Carlo Simulation¶
from portfolio_analysis import MonteCarloSimulation
mc = MonteCarloSimulation(
prices,
weights,
num_simulations=10000,
time_horizon=252, # 1 year
initial_investment=100000
)
results = mc.simulate()
stats = mc.get_statistics()
print(f"Expected final value: ${stats['final_values']['mean']:,.0f}")
print(f"5th percentile: ${stats['final_values']['percentile_5']:,.0f}")
print(f"Probability of loss: {stats['final_values']['prob_loss']:.1f}%")
mc.plot_simulation()
Visualization¶
from portfolio_analysis import PortfolioVisualization
# Cumulative returns
PortfolioVisualization.plot_performance(prices)
PortfolioVisualization.plot_portfolio_return(prices, weights)
# Risk visualization
PortfolioVisualization.plot_drawdown(prices, weights)
PortfolioVisualization.plot_rolling_volatility(prices, weights, window=21)
PortfolioVisualization.plot_returns_distribution(prices, weights)
# Allocation
PortfolioVisualization.plot_allocation_pie(weights, tickers)