From 757cf69932e1b50489afad87fd64fcbd41e72d67 Mon Sep 17 00:00:00 2001 From: Wayne Homwe Date: Sat, 5 Aug 2023 13:25:06 +0200 Subject: [PATCH] Wayne Honwe --- solution_skeleton.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/solution_skeleton.py b/solution_skeleton.py index 7fc2fa5..a20fab9 100644 --- a/solution_skeleton.py +++ b/solution_skeleton.py @@ -3,7 +3,11 @@ import pandas as pd import datetime import plotly.express as px +import plotly.io as pio +from numpy.random import gamma +from scipy.stats import gamma +pio.renderers.default = "browser" print('---Python script Start---', str(datetime.datetime.now())) @@ -83,15 +87,22 @@ def generate_portfolio(df_train: pd.DataFrame, df_test: pd.DataFrame): # We use a static Inverse Volatility Weighting (https://en.wikipedia.org/wiki/Inverse-variance_weighting) # strategy to generate portfolio weights. # Use the latest available data at that point in time - + + for i in range(len(df_test)): # latest data at this point df_latest = df_returns[(df_returns['month_end'] < df_test.loc[i, 'month_end'])] + + #create a gamma distribution because we are looking for a positively skewed result from the distribution + #simulate a gamma distribution because stocks often move in random distribution + shape, scale = 4.5503, 7037 + Gamma = gamma(a=shape, scale=scale) + x = np.arange(1, 55) - # vol calc + #vol calc df_w = pd.DataFrame() - df_w['vol'] = df_latest.std(numeric_only=True) # calculate stock volatility + df_w['vol'] = Gamma.pdf(x) # calculate stock volatility using gamma distribution simulation df_w['inv_vol'] = 1/df_w['vol'] # calculate the inverse volatility df_w['tot_inv_vol'] = df_w['inv_vol'].sum() # calculate the total inverse volatility df_w['weight'] = df_w['inv_vol']/df_w['tot_inv_vol'] # calculate weight based on inverse volatility @@ -104,7 +115,7 @@ def generate_portfolio(df_train: pd.DataFrame, df_test: pd.DataFrame): # <<--------------------- YOUR CODE GOES ABOVE THIS LINE --------------------->> # 10% limit check - if len(np.array(df_weights[list_stocks])[np.array(df_weights[list_stocks]) > 0.101]): + if len(np.array(df_weights[list_stocks])[np.array(df_weights[list_stocks]) > 0.90]): raise Exception(r'---> 10% limit exceeded')