aboutsummaryrefslogtreecommitdiffstats
path: root/python/option_trades.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/option_trades.py')
-rw-r--r--python/option_trades.py38
1 files changed, 37 insertions, 1 deletions
diff --git a/python/option_trades.py b/python/option_trades.py
index 1510f583..f0282a85 100644
--- a/python/option_trades.py
+++ b/python/option_trades.py
@@ -1,3 +1,4 @@
+import cvxpy
import datetime
import math
import numpy as np
@@ -238,5 +239,40 @@ def sell_vol_strategy(index="IG", months=3):
conn.commit()
return d
+def aggregate_trades(d):
+ r = pd.Series()
+ for v in d.values():
+ r = r.add(-v.sum(1).diff().dropna(), fill_value=0)
+ return r
+
+
+def compute_allocation(df):
+ Sigma = df.cov().values
+ gamma = cvxpy.Parameter(sign='positive')
+ mu = df.mean().values
+ w = cvxpy.Variable(3)
+ ret = mu.T*w
+ risk = cvxpy.quad_form(w, Sigma)
+ prob = cvxpy.Problem(cvxpy.Maximize(ret - gamma * risk),
+ [cvxpy.sum_entries(w) == 1,
+ w >= -2,
+ w <= 2])
+
+ gamma_x = np.linspace(0, 0.02, 500)
+ W = np.empty((3, gamma_x.size))
+ for i, val in enumerate(gamma_x):
+ gamma.value = val
+ prob.solve()
+ W[:,i] = np.asarray(w.value).squeeze()
+
+ fund_return = mu @ W
+ fund_vol= np.array([math.sqrt(W[:,i] @ Sigma @W[:,i]) for i in range(gamma_x.size)])
+ return (W, fund_return, fund_vol)
+
+
if __name__ == "__main__":
- d = sell_vol_strategy()
+ d1 = sell_vol_strategy(months=1)
+ d2 = sell_vol_strategy(months=2)
+ d3 = sell_vol_strategy(months=3)
+ all_tenors = pd.concat([aggregate_trades(d) for d in [d1, d2, d3]], axis=1)
+ all_tenors.columns = ['1m', '2m', '3m']