import pandas as pd
import numpy as np
from cvxopt import solvers
factor_names = ['World', 'Billy', 'Smoke', 'Green', 'Donald', 'Boris']
factor_cov = pd.DataFrame([[ 0.012456, 0.000059, 0.000753, -0.000928, 0.000657, 0.000499 ],
[ 0.000059, 0.000281, -0.000041, -0.000116, -0.000311, -0.000087 ],
[ 0.000753, -0.000041, 0.000296, -0.000159, -0.000165, -0.000006 ],
[-0.000928, -0.000116, -0.000159, 0.000103, -0.001290, 0.000293 ],
[ 0.000657, -0.000311, -0.000165, -0.001290, 0.008634, -0.000071 ],
[ 0.000499, -0.000087, -0.000006, 0.000293, -0.000071, 0.001060 ]],
columns=factor_names,
index=factor_names
)
stocks_to_factors = pd.DataFrame.from_dict( {
'EA.O': [1., 0.7, 0.3, 0.7, 1., 0.],
'BATS.L': [1., 0.1, 1.0, 0.0, 0., 1.],
'MKS.L': [1., -0.3, 0.5, 0.5, 0., 1.,],
'BA.N': [1., -0.5, 0.15, 0.85, 1., 0.],
'LMT.N': [1., -0.7, 0.15, 0.85, 1., 0.],
'TWTR.N': [1., -1.7, 0.45, 0.55, 1., 0.],
'FB.O': [1., -1.9, 0.65, 0.35, 1., 0.],
'GOOGL.O': [1., -2.3, 0.95, 0.05, 1., 0.],
'MSFT.O': [1., 1.1, 0.2, 0.8, 1., 0.],
'CLDN.L': [1., -0.1, 0.3, 0.7, 0., 1.,]
}, orient='index', columns=factor_names)
stock_specific_risk = pd.DataFrame.from_dict(
{'EA.O': [20.7],
'BATS.L': [10.653],
'MKS.L': [15.109],
'BA.N': [13.066],
'TWTR.N': [32.877],
'FB.O': [23.881],
'GOOGL.O': [12.116],
'MSFT.O': [15.48],
'CLDN.L': [13.182],
'LMT.N': [14.235]
})*0.00001
stock_alpha = pd.DataFrame.from_dict(
{'EA.O': [11.],
'BATS.L': [4.5],
'MKS.L': [7.],
'BA.N': [8.],
'TWTR.N': [15.],
'FB.O': [11.5],
'GOOGL.O': [6.3],
'MSFT.O': [7.3],
'CLDN.L': [6.5],
'LMT.N': [7.3]
})*0.01
def run_problem4_tests(solution, A, B, D, alpha):
show_progress_saved = None
if 'show_progress' in solvers.options:
show_progress_saved = solvers.options['show_progress']
solvers.options['show_progress'] = False
const_params = {'A': A, 'B': B, 'D': D, 'alpha' : alpha}
params_to_test = [
{'riskAversion':0., 'maxGross':1_000_000, 'allowShort':False},
{'riskAversion':0.5, 'maxGross':1_000_000, 'allowShort':False},
{'riskAversion':1., 'maxGross':1_000_000, 'allowShort':False},
{'riskAversion':0.5, 'maxGross':1_000_000, 'maxNet':1_000_000, 'allowShort':True},
{'riskAversion':1., 'maxGross':1_000_000, 'maxNet':1_000_000, 'allowShort':True},
{'riskAversion':0.5, 'maxGross':1_000_000, 'minNet':500_000, 'maxNet':900_000, 'allowShort':True},
{'riskAversion':1., 'maxGross':1_000_000, 'minNet':500_000, 'maxNet':900_000, 'allowShort':True},
]
for params1 in params_to_test:
pi, pi_factors, risk, profit = solution(**params1, **const_params)
print(params1)
print(f"sum: {np.sum(pi)}; profit: {profit}; risk: {risk}")
print(np.ravel(pi))
print(np.ravel(pi_factors))
print()
if show_progress_saved is not None:
solvers.options['show_progress'] = show_progress_saved
else:
del solvers.options['show_progress']