Having fun with statistics
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
import matplotlib.pyplot as plt
|
||||
import yfinance as yf
|
||||
|
||||
# Define the list of stock tickers and the portfolio weights
|
||||
tickers = ['AAPL', 'MSFT', 'GOOGL']
|
||||
weights = np.array([0.3, 0.4, 0.3]) # Example weights, should sum to 1
|
||||
|
||||
# Fetch historical data for the tickers
|
||||
data = yf.download(tickers, start="2020-01-01", end="2023-01-01")['Adj Close']
|
||||
|
||||
# Calculate daily returns
|
||||
returns = data.pct_change().dropna()
|
||||
|
||||
# Calculate mean returns and covariance matrix
|
||||
mean_returns = returns.mean()
|
||||
cov_matrix = returns.cov()
|
||||
|
||||
# Number of simulations
|
||||
num_simulations = 10000
|
||||
|
||||
# Time horizon (e.g., 252 trading days in a year)
|
||||
time_horizon = 252
|
||||
|
||||
# Initialize arrays to store simulation results
|
||||
simulated_portfolio_returns = np.zeros(num_simulations)
|
||||
|
||||
# Run Monte Carlo simulations
|
||||
for i in range(num_simulations):
|
||||
# Generate random returns for each asset
|
||||
random_returns = np.random.multivariate_normal(mean_returns, cov_matrix, time_horizon)
|
||||
|
||||
# Calculate portfolio return for each time period
|
||||
portfolio_returns = np.dot(random_returns, weights)
|
||||
|
||||
# Calculate cumulative return over the time horizon
|
||||
cumulative_return = np.prod(1 + portfolio_returns) - 1
|
||||
|
||||
# Store the cumulative return in the results array
|
||||
simulated_portfolio_returns[i] = cumulative_return
|
||||
|
||||
# Plot the distribution of simulated portfolio returns
|
||||
plt.hist(simulated_portfolio_returns, bins=50, edgecolor='k', alpha=0.7)
|
||||
plt.title('Distribution of Simulated Portfolio Returns')
|
||||
plt.xlabel('Cumulative Return')
|
||||
plt.ylabel('Frequency')
|
||||
plt.show()
|
||||
|
||||
# Summary statistics
|
||||
mean_simulated_return = np.mean(simulated_portfolio_returns)
|
||||
std_dev_simulated_return = np.std(simulated_portfolio_returns)
|
||||
var_95 = np.percentile(simulated_portfolio_returns, 5)
|
||||
|
||||
print(f"Mean Simulated Return: {mean_simulated_return:.2%}")
|
||||
print(f"Standard Deviation of Simulated Return: {std_dev_simulated_return:.2%}")
|
||||
print(f"Value at Risk (95% confidence level): {var_95:.2%}")
|
||||
Reference in New Issue
Block a user