Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/finance/markov_multifractal.py
4079 views
1
"""
2
Markov Switching Multifractal model
3
4
REFERENCE:
5
6
*How to Forecast Long-Run Volatility: Regime Switching and
7
the Estimation of Multifractal Processes*, Calvet and Fisher, 2004.
8
9
AUTHOR:
10
11
- William Stein, 2008
12
13
TESTS::
14
15
sage: msm = finance.MarkovSwitchingMultifractal(8,1.4,1.0,0.95,3)
16
sage: loads(dumps(msm)) == msm
17
True
18
"""
19
import math
20
21
class MarkovSwitchingMultifractal:
22
def __init__(self, kbar, m0, sigma, gamma_kbar, b):
23
"""
24
INPUT:
25
26
- ``kbar`` -- positive integer
27
28
- ``m0`` -- float with ``0 <= m0 <= 2``
29
30
- ``sigma`` -- positive float
31
32
- ``gamma_kbar`` -- float with ``0 <= gamma_kbar < 1``
33
34
- ``b`` -- float > 1
35
36
EXAMPLES::
37
38
sage: msm = finance.MarkovSwitchingMultifractal(8,1.4,0.5,0.95,3); msm
39
Markov switching multifractal model with m0 = 1.4, sigma = 0.5, b = 3.0, and gamma_8 = 0.95
40
sage: yen_usd = finance.MarkovSwitchingMultifractal(10,1.448,0.461,0.998,3.76)
41
sage: cad_usd = finance.MarkovSwitchingMultifractal(10,1.278,0.262,0.644,2.11)
42
sage: dm = finance.MarkovSwitchingMultifractal(10,1.326,0.643,0.959,2.7)
43
"""
44
self.__m0 = float(m0)
45
assert self.__m0 >= 0 and self.__m0 <= 2, "m0 must be between 0 and 2"
46
self.__sigma = float(sigma)
47
assert self.__sigma > 0, "sigma must be positive"
48
self.__b = float(b)
49
assert self.__b > 1, "b must be bigger than 1"
50
self.__gamma_kbar = float(gamma_kbar)
51
assert self.__gamma_kbar >= 0 and self.__gamma_kbar < 1, \
52
"gamma_kbar must be between 0 and 1"
53
self.__kbar = int(kbar)
54
assert self.__kbar > 0, "kbar must be positive"
55
56
def __cmp__(self, other):
57
"""
58
Compare ``self`` and ``other``.
59
60
Comparison is done on the tuple ``(m0, sigma, b, gamma_kbar, kbar)``.
61
62
EXAMPLES::
63
64
sage: msm = finance.MarkovSwitchingMultifractal(8,1.4,1.0,0.95,3)
65
sage: msm.__cmp__(3) # random - depends on memory layout
66
-1
67
sage: msm.__cmp__(msm)
68
0
69
sage: cad_usd = finance.MarkovSwitchingMultifractal(10,1.278,0.262,0.644,2.11); cad_usd
70
Markov switching multifractal model with m0 = 1.278, sigma = 0.262, b = 2.11, and gamma_10 = 0.644
71
sage: msm.__cmp__(cad_usd)
72
1
73
"""
74
if not isinstance(other, MarkovSwitchingMultifractal):
75
return cmp(type(self), type(other))
76
return cmp((self.__m0, self.__sigma, self.__b, self.__gamma_kbar, self.__kbar),
77
(other.__m0, other.__sigma, other.__b, other.__gamma_kbar, other.__kbar))
78
79
def __repr__(self):
80
"""
81
Return string representation of Markov switching multifractal model.
82
83
EXAMPLES::
84
85
sage: msm = finance.MarkovSwitchingMultifractal(8,1.4,1,0.95,3)
86
sage: msm.__repr__()
87
'Markov switching multifractal model with m0 = 1.4, sigma = 1.0, b = 3.0, and gamma_8 = 0.95'
88
"""
89
return "Markov switching multifractal model with m0 = %s, sigma = %s, b = %s, and gamma_%s = %s"%(self.m0(), self.sigma(), self.b(), self.kbar(), self.gamma_kbar())
90
91
def m0(self):
92
"""
93
Return parameter m0 of Markov switching multifractal model.
94
95
EXAMPLES::
96
97
sage: msm = finance.MarkovSwitchingMultifractal(8,1.4,1,0.95,3)
98
sage: msm.m0()
99
1.4
100
"""
101
return self.__m0
102
103
def sigma(self):
104
"""
105
Return parameter sigma of Markov switching multifractal model.
106
107
EXAMPLES::
108
109
sage: msm = finance.MarkovSwitchingMultifractal(8,1.4,1,0.95,3)
110
sage: msm.sigma()
111
1.0
112
"""
113
return self.__sigma
114
115
def b(self):
116
"""
117
Return parameter b of Markov switching multifractal model.
118
119
EXAMPLES::
120
121
sage: msm = finance.MarkovSwitchingMultifractal(8,1.4,1,0.95,3)
122
sage: msm.b()
123
3.0
124
"""
125
return self.__b
126
127
def gamma_kbar(self):
128
"""
129
Return parameter ``gamma_kbar`` of Markov switching multifractal model.
130
131
EXAMPLES::
132
133
sage: msm = finance.MarkovSwitchingMultifractal(8,1.4,0.01,0.95,3)
134
sage: msm.gamma_kbar()
135
0.95
136
"""
137
return self.__gamma_kbar
138
139
def kbar(self):
140
"""
141
Return parameter ``kbar`` of Markov switching multifractal model.
142
143
EXAMPLES::
144
145
sage: msm = finance.MarkovSwitchingMultifractal(8,1.4,0.01,0.95,3)
146
sage: msm.kbar()
147
8
148
"""
149
return self.__kbar
150
151
def gamma(self):
152
"""
153
Return the vector of the kbar transitional probabilities.
154
155
OUTPUT:
156
157
- gamma -- a tuple of ``self.kbar()`` floats.
158
159
EXAMPLES::
160
161
sage: msm = finance.MarkovSwitchingMultifractal(8,1.4,1.0,0.95,3)
162
sage: msm.gamma()
163
(0.001368852970712986, 0.004100940201672509, 0.012252436441829..., 0.03630878209190..., 0.10501923017634..., 0.28312883556311..., 0.6315968501359..., 0.95000000000000...)
164
"""
165
try:
166
return self.__gamma
167
except AttributeError:
168
pass
169
170
b = self.__b
171
gamma_kbar = self.__gamma_kbar
172
kbar = self.__kbar
173
174
# We compute gamma1 from gamma_kbar by inverting the relation
175
# that defines the gamma_k given on page 54 of Calvet-Fisher:
176
gamma1 = 1 - math.exp(math.log(1-gamma_kbar)/(b**(kbar-1)))
177
178
gamma = tuple([1 - (1 - gamma1)**(b**k) for k in range(kbar)])
179
self.__gamma = gamma
180
return gamma
181
182
def simulation(self, n):
183
"""
184
Same as ``self.simulations``, but run only 1 time, and returns a time
185
series instead of a list of time series.
186
187
INPUT:
188
189
- ``n`` -- a positive integer.
190
191
EXAMPLES::
192
193
sage: msm = finance.MarkovSwitchingMultifractal(8,1.4,1.0,0.95,3)
194
sage: msm.simulation(5)
195
[0.0059, -0.0097, -0.0101, -0.0110, -0.0067]
196
sage: msm.simulation(3)
197
[0.0055, -0.0084, 0.0141]
198
"""
199
return self.simulations(n, 1)[0]
200
201
def simulations(self, n, k=1):
202
"""
203
Return ``k`` simulations of length ``n`` using this Markov switching
204
multifractal model for ``n`` time steps.
205
206
INPUT:
207
208
- ``n`` -- positive integer; number of steps.
209
210
- ``k`` -- positive integer (default: 1); number of simulations.
211
212
OUTPUT:
213
214
list -- a list of TimeSeries objects.
215
216
EXAMPLES::
217
218
sage: cad_usd = finance.MarkovSwitchingMultifractal(10,1.278,0.262,0.644,2.11); cad_usd
219
Markov switching multifractal model with m0 = 1.278, sigma = 0.262, b = 2.11, and gamma_10 = 0.644
220
"""
221
import markov_multifractal_cython
222
return markov_multifractal_cython.simulations(n, k,
223
self.__m0, self.__sigma,
224
self.__kbar, self.gamma())
225
226
227
228
## def ml_estimation(v, kbar, M):
229
## """
230
## Compute parameters that model the time series v,
231
232
## INPUT:
233
## v -- series of returns; e.g., sequence of
234
## differences of logs of price
235
## kbar -- positive integer; model parameter
236
## m -- finite list of the values that the multiplier
237
## M takes on.
238
239
## OUTPUT:
240
## m0, sigma, gamma_kbar, b
241
## """
242
243
244