Simulated portfolio returns using dynamic risk allocation
Description
This code simulates data for analyzing the performance of a dynamic risk allocation strategy over multiple time periods. Here's a breakdown of the data generation and analysis process: Simulated Data: Random returns are generated for a specified number of assets (3 in this case) over a certain number of time periods (100 in this case). These returns follow a normal distribution with a mean of 0.05 and a standard deviation of 0.1. Simulated transaction costs, model complexity, data requirements, and scalability factors are generated to represent different aspects of the dynamic risk allocation strategy. Dynamic Risk Allocation Strategy: A function dynamic_risk_allocation is defined to implement the dynamic risk allocation strategy. Within this function, portfolio weights are calculated based on the inverse of the standard deviation of returns and adjusted for model complexity. Transaction costs are subtracted from the weights, and negative weights are set to zero to ensure non-negativity. Finally, portfolio returns are calculated as the weighted sum of asset returns. Portfolio Returns Visualization: The calculated portfolio returns using the dynamic risk allocation strategy are plotted over time. The plot provides insights into the performance of the portfolio strategy, showing how returns vary across different time periods.
Files
Steps to reproduce
import numpy as np import pandas as pd import matplotlib.pyplot as plt # Simulated data np.random.seed(0) num_assets = 3 num_periods = 100 returns = np.random.normal(loc=0.05, scale=0.1, size=(num_periods, num_assets)) # Simulated transaction costs transaction_costs = np.random.uniform(low=0.001, high=0.005, size=num_periods) # Simulated model complexity model_complexity = np.random.randint(low=1, high=5, size=num_periods) # Simulated data requirements data_requirements = np.random.randint(low=1, high=10, size=num_periods) # Simulated scalability scalability = np.random.uniform(low=0.1, high=1, size=num_periods) # Simulated dynamic risk allocation strategy def dynamic_risk_allocation(returns, transaction_costs, model_complexity, data_requirements, scalability): # Calculate portfolio weights weights = np.zeros_like(returns) for i in range(len(returns)): weights[i] = np.exp(-model_complexity[i]) * (1 / np.std(returns[i])) weights[i] /= np.sum(weights[i]) # Adjust weights for transaction costs weights -= transaction_costs[:, np.newaxis] weights[weights < 0] = 0 weights /= np.sum(weights, axis=1)[:, np.newaxis] # Calculate portfolio returns portfolio_returns = np.sum(returns * weights, axis=1) return portfolio_returns # Calculate portfolio returns using dynamic risk allocation strategy portfolio_returns = dynamic_risk_allocation(returns, transaction_costs, model_complexity, data_requirements, scalability) # Plot simulated data plt.figure(figsize=(10, 5)) plt.plot(portfolio_returns, label='Portfolio Returns', color='blue') plt.title('Simulated Portfolio Returns using Dynamic Risk Allocation') plt.xlabel('Time Period') plt.ylabel('Portfolio Returns') plt.legend() plt.grid(True) plt.show()