diff options
Diffstat (limited to 'python/option_trades.py')
| -rw-r--r-- | python/option_trades.py | 38 |
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'] |
