62 integer(kind=ik) function rand_int(upper_bound, optional_lower_bound)
64 integer(kind=ik),
intent(in) :: upper_bound
65 integer(kind=ik),
optional,
intent(in) :: optional_lower_bound
66 integer(kind=ik) :: lower_bound = 0
68 if (
present(optional_lower_bound)) lower_bound = optional_lower_bound
69 if (lower_bound > upper_bound)
then
70 error stop
"ERROR(rand_int): lower_bound > upper_bound!"
73 rand_int = lower_bound + int(r * (upper_bound - lower_bound), kind=ik)
62 integer(kind=ik) function rand_int(upper_bound, optional_lower_bound)
…
82 real(kind=rk)
function rand_real(upper_bound, optional_lower_bound)
84 real(kind=rk),
intent(in) :: upper_bound
85 real(kind=rk),
optional,
intent(in) :: optional_lower_bound
86 real(kind=rk) :: lower_bound = 0
88 if (
present(optional_lower_bound)) lower_bound = optional_lower_bound
89 if (lower_bound > upper_bound)
then
90 error stop
"ERROR(rand_real): lower_bound > upper_bound!"
93 rand_real = lower_bound + r * (upper_bound - lower_bound)
82 real(kind=rk)
function rand_real(upper_bound, optional_lower_bound)
…
104 real(kind=rk),
intent(in) ::
data(:)
105 integer(kind=ik),
intent(in) :: tail_length
106 integer(kind=ik) :: i
107 i = ubound(
data, 1, kind=ik) -
rand_int(min(tail_length, int(
size(data), kind=ik)))
108 i = max(i, lbound(
data, 1, kind=ik))
109 i = min(i, ubound(
data, 1, kind=ik))
121 real(kind=rk),
intent(in) ::
data(:)
122 integer(kind=ik),
intent(in) :: head_length
123 integer(kind=ik) :: i
124 i = lbound(
data, 1, kind=ik) +
rand_int(min(head_length,
size(
data, kind=ik)))
125 i = max(i, lbound(
data, 1, kind=ik))
126 i = min(i, ubound(
data, 1, kind=ik))
139 real(kind=rk),
intent(in) ::
data(:)
140 real(kind=rk),
intent(out) :: mean, variance
141 mean = sum(data) /
size(data)
142 variance = sum((
data - mean) ** 2)
163 real(kind=rk),
parameter :: pi = 4.0_rk * atan(1.0_rk)
164 real(kind=rk) :: u, v
165 logical,
save :: cached_valid = .false.
166 real(kind=rk),
save :: cached_value = 0.0_rk
167 if (cached_valid)
then
169 cached_valid = .false.
171 call random_number(u)
172 call random_number(v)
174 cached_value = sqrt(-2 * log(u)) * sin(2 * pi * v)
175 cached_valid = .true.
186 call random_number(u)
201 call random_number(u)
217 real(kind=rk),
intent(in) :: mean, variance
233 real(kind=rk),
intent(in) :: mu, sigma
248 real(kind=rk),
intent(in) :: p
251 real(kind=rk),
parameter :: const1 = 0.180625_rk
252 real(kind=rk),
parameter :: const2 = 1.600000_rk
253 real(kind=rk),
parameter :: split1 = 0.425000_rk
254 real(kind=rk),
parameter :: split2 = 5.000000_rk
255 real(kind=rk),
parameter :: r1_numr(8) = [ &
256 2.50908092873012267270e+03_rk, 3.34305755835881281050e+04_rk, 6.72657709270087008530e+04_rk, 4.59219539315498714570e+04_rk, &
257 1.37316937655094611250e+04_rk, 1.97159095030655144270e+03_rk, 1.33141667891784377450e+02_rk, 3.38713287279636660800e+00_rk ]
258 real(kind=rk),
parameter :: r1_dnom(8) = [ &
259 5.22649527885285456100e+03_rk, 2.87290857357219426740e+04_rk, 3.93078958000927106100e+04_rk, 2.12137943015865958670e+04_rk, &
260 5.39419602142475110770e+03_rk, 6.87187007492057908300e+02_rk, 4.23133307016009112520e+01_rk, 1.00000000000000000000e+00_rk ]
261 real(kind=rk),
parameter :: r2_numr(8) = [ &
262 7.74545014278341407640e-04_rk, 2.27238449892691845833e-02_rk, 2.41780725177450611770e-01_rk, 1.27045825245236838258e+00_rk, &
263 3.64784832476320460504e+00_rk, 5.76949722146069140550e+00_rk, 4.63033784615654529590e+00_rk, 1.42343711074968357734e+00_rk ]
264 real(kind=rk),
parameter :: r2_dnom(8) = [ &
265 1.05075007164441684324e-09_rk, 5.47593808499534494600e-04_rk, 1.51986665636164571966e-02_rk, 1.48103976427480074590e-01_rk, &
266 6.89767334985100004550e-01_rk, 1.67638483018380384940e+00_rk, 2.05319162663775882187e+00_rk, 1.00000000000000000000e+00_rk ]
267 real(kind=rk),
parameter :: r3_numr(8) = [ &
268 2.01033439929228813265e-07_rk, 2.71155556874348757815e-05_rk, 1.24266094738807843860e-03_rk, 2.65321895265761230930e-02_rk, &
269 2.96560571828504891230e-01_rk, 1.78482653991729133580e+00_rk, 5.46378491116411436990e+00_rk, 6.65790464350110377720e+00_rk ]
270 real(kind=rk),
parameter :: r3_dnom(8) = [ &
271 2.04426310338993978564e-15_rk, 1.42151175831644588870e-07_rk, 1.84631831751005468180e-05_rk, 7.86869131145613259100e-04_rk, &
272 1.48753612908506148525e-02_rk, 1.36929880922735805310e-01_rk, 5.99832206555887937690e-01_rk, 1.00000000000000000000e+00_rk ]
273 if (p <= 0.0_rk)
then
275 else if (1.0_rk <= p)
then
279 if(abs(q) <= split1)
then
288 r = sqrt(-log(abs(r)))
289 if (r <= split2)
then
317 real(kind=rk),
intent(in) :: p(:)
318 real(kind=rk),
intent(in) :: x
335 real(kind=rk),
intent(out) :: step_values(:)
336 real(kind=rk),
intent(in) :: s0, mu, sigma
337 real(kind=rk) :: step_width, m, s, sum
338 integer :: i, num_steps
339 num_steps =
size(step_values)
340 step_width = 1.0_rk / (num_steps-1)
341 m = (mu - 0.5 * sigma ** 2) * step_width
342 s = sigma * sqrt(step_width)
346 step_values(i) = s0 * exp(sum)
359 real(kind=rk),
intent(out) :: step_values(:)
360 real(kind=rk),
intent(in) :: s0, mu, sigma
361 real(kind=rk) :: step_width, m, s
362 integer :: i, num_steps
363 num_steps =
size(step_values)
364 step_width = 1.0_rk / (num_steps-1)
366 s = sigma * sqrt(step_width)
370 step_values(i) = 0.0_rk
372 step_values(i) = max(step_values(i-1) * (1 +
rand_norm(m, s)), 0.0_rk)
Configuration for MRFFL (MR Fortran Finance Library).
integer, parameter, public mrfflrk
Real kind used in interfaces.
real(kind=mrfflrk), parameter, public zero_epsilon
Used to test for zero.
integer, parameter, public mrfflik
Integer kinds used in interfaces.
Some statstical utilities supporting other MRFFL modules.
real(kind=rk) function, public resample_head(data, head_length)
Return random value from among the first head_length elements of data.
real(kind=rk) function, public resample_tail(data, tail_length)
Return random value from among the last tail_length elements of data.
real(kind=rk) function, public probit(p)
Probit function – i.e.
subroutine, public zero_clipped_brownian_motion(step_values, s0, mu, sigma)
Compute a set of random steps in a zero clipped browinan motion.
subroutine, public mean_and_variance(mean, variance, data)
Return mean & variance of elements in an array.
real(kind=rk) function, public rand_log_norm(mu, sigma)
Return random value from the specified log-normal distribution.
real(kind=rk) function, public rand_norm_std_box()
Return random value from the standard normal distribution using the Box-Muller transform.
integer(kind=ik) function, public rand_int(upper_bound, optional_lower_bound)
Return random integer in U([optional_lower_bound,upper_bound)) – optional_lower_bound is 0 if missing...
real(kind=rk) function, public rand_real(upper_bound, optional_lower_bound)
Return random real value in U([optional_lower_bound,upper_bound)) – optional_lower_bound is 0 if miss...
real(kind=rk) function poly_eval(p, x)
Evaluate a univariate polynomial.
real(kind=rk) function, public rand_norm_std_probit()
Return random value from the standard normal distribution using the Probit function.
real(kind=rk) function, public rand_norm_std_probit_clip()
Return random value from the standard normal distribution in [-5.612, 5.612] using the Probit functio...
subroutine, public geometric_brownian_motion(step_values, s0, mu, sigma)
Compute a set of random steps in a GBM process.
real(kind=rk) function, public rand_norm_std()
Return random value from the standard normal distribution.
real(kind=rk) function, public rand_norm(mean, variance)
Return random value from the specified normal distribution.