1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import LinearSegmentedColormap
def shiftedColorMap(cmap, start=0, midpoint=0.5, stop=1.0, name='shiftedcmap'):
'''
Function to offset the "center" of a colormap. Useful for
data with a negative min and positive max and you want the
middle of the colormap's dynamic range to be at zero
Input
-----
cmap : The matplotlib colormap to be altered
start : Offset from lowest point in the colormap's range.
Defaults to 0.0 (no lower ofset). Should be between
0.0 and `midpoint`.
midpoint : The new center of the colormap. Defaults to
0.5 (no shift). Should be between 0.0 and 1.0. In
general, this should be 1 - vmax/(vmax + abs(vmin))
For example if your data range from -15.0 to +5.0 and
you want the center of the colormap at 0.0, `midpoint`
should be set to 1 - 5/(5 + 15)) or 0.75
stop : Offset from highets point in the colormap's range.
Defaults to 1.0 (no upper ofset). Should be between
`midpoint` and 1.0.
'''
cdict = {
'red': [],
'green': [],
'blue': [],
'alpha': []
}
# regular index to compute the colors
reg_index = np.linspace(start, stop, 257)
# shifted index to match the data
shift_index = np.hstack([
np.linspace(0.0, midpoint, 128, endpoint=False),
np.linspace(midpoint, 1.0, 129, endpoint=True)
])
for ri, si in zip(reg_index, shift_index):
r, g, b, a = cmap(ri)
cdict['red'].append((si, r, r))
cdict['green'].append((si, g, g))
cdict['blue'].append((si, b, b))
cdict['alpha'].append((si, a, a))
newcmap = LinearSegmentedColormap(name, cdict)
plt.register_cmap(cmap=newcmap)
return newcmap
def plot_time_color_map(df, spread_shock, attr="pnl", path=".", color_map=cm.RdYlGn, index='IG', centered = True):
val_date = df.index[0].date()
df = df.reset_index()
df['days'] = (df['date'] - val_date).dt.days
ascending = [True,True] if index == 'HY' else [True,False]
df.sort_values(by=['date','spread'], ascending = ascending, inplace = True)
date_range = df.days.unique()
#plt.style.use('seaborn-whitegrid')
fig, ax = plt.subplots()
series = df[attr]
if centered is True:
midpoint = 1 - series.max() / (series.max() + abs(series.min()))
shifted_cmap = shiftedColorMap(color_map, midpoint=midpoint, name='shifted')
else:
shifted_cmap = color_map
chart = ax.imshow(series.values.reshape(date_range.size, spread_shock.size).T,
extent=(date_range.min(), date_range.max(),
spread_shock.min(), spread_shock.max()),
aspect='auto', interpolation='bilinear', cmap=shifted_cmap)
#chart = ax.contour(date_range, spread_shock, series.values.reshape(date_range.size, spread_shock.size).T)
ax.set_xlabel('Days')
ax.set_ylabel('Price') if index == 'HY' else ax.set_ylabel('Spread')
ax.set_title('{} of Trade'.format(attr.title()))
fig.colorbar(chart, shrink=.8)
#fig.savefig(os.path.join(path, "spread_time_color_map_"+ attr+ "_{}.png".format(val_date)))
def plot_color_map(df, spread_shock, vol_shock, attr="pnl", path=".", index='IG'):
# TODO: merge with plot_time_color_map
val_date = df.index[0].date()
#rows are spread, columns are volatility surface shift
fig, ax = plt.subplots()
#We are plotting an image, so we have to sort from high to low on the Y axis
ascending = [False,False] if index == 'HY' else [True,False]
df.sort_values(by=['spread','vol_shock'], ascending=ascending, inplace=True)
series = df[attr]
midpoint = 1 - series.max() / (series.max() + abs(series.min()))
shifted_cmap = shiftedColorMap(cm.RdYlGn, midpoint=midpoint, name='shifted')
chart = ax.imshow(series.values.reshape(spread_shock.size, vol_shock.size).T,
extent=(spread_shock.min(), spread_shock.max(),
vol_shock.min(), vol_shock.max()),
aspect='auto', interpolation='bilinear', cmap=shifted_cmap)
ax.set_xlabel('Price') if index == 'HY' else ax.set_xlabel('Spread')
ax.set_ylabel('Volatility shock')
ax.set_title('{} of Trade on {}'.format(attr.title(), val_date))
fig.colorbar(chart, shrink=.8)
#fig.savefig(os.path.join(path, "vol_spread_color_map"+ attr+ "_{}.png".format(val_date)))
|