aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics/curve_trades.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics/curve_trades.py')
-rw-r--r--python/analytics/curve_trades.py29
1 files changed, 21 insertions, 8 deletions
diff --git a/python/analytics/curve_trades.py b/python/analytics/curve_trades.py
index 455d1422..f76f6b88 100644
--- a/python/analytics/curve_trades.py
+++ b/python/analytics/curve_trades.py
@@ -82,12 +82,11 @@ def on_the_run_theta(index='IG', rolling=6):
theta_matrix = df.groupby(level=['date', 'tenor']).nth(-1)['theta_per_dur']
theta_matrix.unstack(-1).plot()
-
-def curve_returns(index='IG', rolling=6):
+def curve_returns(index='IG', rolling=6, years=3):
# look at returns
otr = on_the_run(index)
df = index_returns(index=index, series=list(range(otr - rolling, otr + 1)),
- tenor=['3yr', '5yr', '7yr', '10yr'])
+ tenor=['3yr', '5yr', '7yr', '10yr'], years=years)
# on-the-run returns
df = df.reset_index('index', drop=True)
returns = df.price_return.dropna().unstack('tenor').groupby(level='date').nth(-1)
@@ -97,7 +96,17 @@ def curve_returns(index='IG', rolling=6):
'7-10': 1.33 * returns['7yr'] - returns['10yr'],
'3-5-10': -2 * returns['3yr'] + 3 * returns['5yr'] - returns['10yr'],
'3-5': returns['5yr'] - 1.56 * returns['3yr'],
- '3-7': returns['7yr'] - 2.07 * returns['3yr']})
+ '3-7': returns['7yr'] - 2.07 * returns['3yr'],
+ '5yr long': returns['5yr']})
+
+ return strategies_return
+
+
+def curve_returns_stats(strategies_return):
+
+ '''
+ Takes a curve_return df'''
+
strategies_return_monthly = (strategies_return.
groupby(pd.Grouper(freq='M')).
agg(lambda df: (1 + df).prod() - 1))
@@ -108,10 +117,10 @@ def curve_returns(index='IG', rolling=6):
else:
return df.mean() / df.std() * math.sqrt(12)
- results = strategies_return.agg([sharpe, lambda df: df.nsmallest(10).mean()])
+ results = strategies_return.agg([sharpe, lambda df: df.nsmallest(10).mean(), lambda df: df.std()])
sharpe_monthly = strategies_return_monthly.agg(sharpe, period="monthly")
sharpe_monthly.name = 'Monthly Sharpe'
- results.index = ['Sharpe', 'Mean Worst 10 Days DrawDown']
+ results.index = ['Sharpe', 'Mean Worst 10 Days DrawDown', 'Standard Deviation']
return results.append(sharpe_monthly)
@@ -169,7 +178,11 @@ def curve_model(tenor_1='5yr', tenor_2='10yr'):
def curve_model_results(df, model):
df = df.dropna()
- prstd_ols, df['down_2_stdev'], df['up_2_stdev'] = wls_prediction_std(model)
+ a, b, c = wls_prediction_std(model)
+ b.name = 'down_2_stdev'
+ c.name = 'up_2_stdev'
+ df = df.join(b)
+ df = df.join(c)
#dr/dspread = exp(k) + spread_coeff * duration ^ dur_coeff * spread ^ (spread_coeff-1)
cols = ['ratio', 'closespread', 'down_2_stdev', 'up_2_stdev']
df[cols] = np.exp(df[cols])
@@ -324,7 +337,7 @@ def pos_pnl_abs(portf, value_date, index='IG', rolling=6, years=3):
for date, row in df.iterrows():
f = interp1d(np.hstack([0, lookup_table['year_frac']]), np.hstack([row[0]/2, row]))
for ind in portf_copy.indices:
- ind.spread = f((pd.to_datetime(ind.end_date) - value_date).days/365)
+ ind.spread = f((ind.end_date - value_date).days/365)
r.append([[date, f(5)] + [portf_copy.pnl]])
df = pd.DataFrame.from_records(chain(*r), columns=['date', 'five_yr_spread', 'pnl'])
return df.set_index('date')