Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
2846 views
1
import pandas as pd
2
import numpy as np
3
from cvxopt import solvers
4
5
factor_names = ['World', 'Billy', 'Smoke', 'Green', 'Donald', 'Boris']
6
factor_cov = pd.DataFrame([[ 0.012456, 0.000059, 0.000753, -0.000928, 0.000657, 0.000499 ],
7
[ 0.000059, 0.000281, -0.000041, -0.000116, -0.000311, -0.000087 ],
8
[ 0.000753, -0.000041, 0.000296, -0.000159, -0.000165, -0.000006 ],
9
[-0.000928, -0.000116, -0.000159, 0.000103, -0.001290, 0.000293 ],
10
[ 0.000657, -0.000311, -0.000165, -0.001290, 0.008634, -0.000071 ],
11
[ 0.000499, -0.000087, -0.000006, 0.000293, -0.000071, 0.001060 ]],
12
columns=factor_names,
13
index=factor_names
14
)
15
16
stocks_to_factors = pd.DataFrame.from_dict( {
17
'EA.O': [1., 0.7, 0.3, 0.7, 1., 0.],
18
'BATS.L': [1., 0.1, 1.0, 0.0, 0., 1.],
19
'MKS.L': [1., -0.3, 0.5, 0.5, 0., 1.,],
20
'BA.N': [1., -0.5, 0.15, 0.85, 1., 0.],
21
'LMT.N': [1., -0.7, 0.15, 0.85, 1., 0.],
22
'TWTR.N': [1., -1.7, 0.45, 0.55, 1., 0.],
23
'FB.O': [1., -1.9, 0.65, 0.35, 1., 0.],
24
'GOOGL.O': [1., -2.3, 0.95, 0.05, 1., 0.],
25
'MSFT.O': [1., 1.1, 0.2, 0.8, 1., 0.],
26
'CLDN.L': [1., -0.1, 0.3, 0.7, 0., 1.,]
27
}, orient='index', columns=factor_names)
28
stock_specific_risk = pd.DataFrame.from_dict(
29
{'EA.O': [20.7],
30
'BATS.L': [10.653],
31
'MKS.L': [15.109],
32
'BA.N': [13.066],
33
'TWTR.N': [32.877],
34
'FB.O': [23.881],
35
'GOOGL.O': [12.116],
36
'MSFT.O': [15.48],
37
'CLDN.L': [13.182],
38
'LMT.N': [14.235]
39
})*0.00001
40
stock_alpha = pd.DataFrame.from_dict(
41
{'EA.O': [11.],
42
'BATS.L': [4.5],
43
'MKS.L': [7.],
44
'BA.N': [8.],
45
'TWTR.N': [15.],
46
'FB.O': [11.5],
47
'GOOGL.O': [6.3],
48
'MSFT.O': [7.3],
49
'CLDN.L': [6.5],
50
'LMT.N': [7.3]
51
})*0.01
52
53
54
def run_problem4_tests(solution, A, B, D, alpha):
55
show_progress_saved = None
56
if 'show_progress' in solvers.options:
57
show_progress_saved = solvers.options['show_progress']
58
solvers.options['show_progress'] = False
59
const_params = {'A': A, 'B': B, 'D': D, 'alpha' : alpha}
60
params_to_test = [
61
{'riskAversion':0., 'maxGross':1_000_000, 'allowShort':False},
62
{'riskAversion':0.5, 'maxGross':1_000_000, 'allowShort':False},
63
{'riskAversion':1., 'maxGross':1_000_000, 'allowShort':False},
64
65
{'riskAversion':0.5, 'maxGross':1_000_000, 'maxNet':1_000_000, 'allowShort':True},
66
{'riskAversion':1., 'maxGross':1_000_000, 'maxNet':1_000_000, 'allowShort':True},
67
68
{'riskAversion':0.5, 'maxGross':1_000_000, 'minNet':500_000, 'maxNet':900_000, 'allowShort':True},
69
{'riskAversion':1., 'maxGross':1_000_000, 'minNet':500_000, 'maxNet':900_000, 'allowShort':True},
70
]
71
for params1 in params_to_test:
72
pi, pi_factors, risk, profit = solution(**params1, **const_params)
73
print(params1)
74
print(f"sum: {np.sum(pi)}; profit: {profit}; risk: {risk}")
75
print(np.ravel(pi))
76
print(np.ravel(pi_factors))
77
print()
78
if show_progress_saved is not None:
79
solvers.options['show_progress'] = show_progress_saved
80
else:
81
del solvers.options['show_progress']
82
83
84
85