Skip to content

Commit 59988f6

Browse files
authored
Merge pull request #270 from yfnaji/monte-carlo
Monte-Carlo Engine, seed parameter implementation and new numerical schemes for SDEs
2 parents 8ae4aa7 + 5bde6a3 commit 59988f6

25 files changed

+692
-594
lines changed

crates/RustQuant_instruments/src/monte_carlo_pricer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ macro_rules! impl_monte_carlo_pricer {
4141
config: &StochasticProcessConfig,
4242
rate: f64,
4343
) -> f64 {
44-
let out = process.euler_maruyama(&config);
44+
let out = process.generate(&config);
4545

4646
let n = out.paths.len();
4747

crates/RustQuant_instruments/src/options/vanilla.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ mod test_vanilla_option_monte_carlo {
389389
use std::time::Instant;
390390
use time::macros::date;
391391
use RustQuant_stochastics::geometric_brownian_motion::GeometricBrownianMotion;
392-
use RustQuant_stochastics::StochasticProcessConfig;
392+
use RustQuant_stochastics::{StochasticProcessConfig, StochasticScheme};
393393

394394
#[test]
395395
fn test_vanilla_option_monte_carlo() {
@@ -410,7 +410,9 @@ mod test_vanilla_option_monte_carlo {
410410
let process = GeometricBrownianMotion::new(interest_rate, volatility);
411411

412412
let config =
413-
StochasticProcessConfig::new(underlying, 0.0, time_to_maturity, 1, 1_000_000, true);
413+
StochasticProcessConfig::new(
414+
underlying, 0.0, time_to_maturity, 1, StochasticScheme::EulerMaruyama,1_000_000, true, None
415+
);
414416

415417
let start = Instant::now();
416418
let price = option.price_monte_carlo(&process, &config, interest_rate);
@@ -442,7 +444,9 @@ mod test_vanilla_option_monte_carlo {
442444
let process = GeometricBrownianMotion::new(interest_rate, volatility);
443445

444446
let config =
445-
StochasticProcessConfig::new(underlying, 0.0, time_to_maturity, 1000, 1000, true);
447+
StochasticProcessConfig::new(
448+
underlying, 0.0, time_to_maturity, 1000, StochasticScheme::EulerMaruyama,1000, true, None
449+
);
446450

447451
let start = Instant::now();
448452
let price = option.price_monte_carlo(&process, &config, interest_rate);

crates/RustQuant_stochastics/src/arithmetic_brownian_motion.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
// - LICENSE-MIT.md
88
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
99

10-
// use crate::models::arithmetic_brownian_motion::ArithmeticBrownianMotion;
1110
use crate::process::StochasticProcess;
1211
use crate::ModelParameter;
1312

@@ -58,15 +57,17 @@ impl StochasticProcess for ArithmeticBrownianMotion {
5857
#[cfg(test)]
5958
mod tests_abm {
6059
use super::*;
61-
use crate::StochasticProcessConfig;
60+
use crate::{StochasticProcessConfig, StochasticScheme};
6261
use RustQuant_math::*;
6362
use RustQuant_utils::assert_approx_equal;
6463

6564
#[test]
6665
fn test_arithmetic_brownian_motion() {
6766
let abm = ArithmeticBrownianMotion::new(0.05, 0.9);
68-
let config = StochasticProcessConfig::new(10.0, 0.0, 0.5, 125, 1000, false);
69-
let output = abm.euler_maruyama(&config);
67+
let config = StochasticProcessConfig::new(
68+
10.0, 0.0, 0.5, 125, StochasticScheme::EulerMaruyama, 1000, false, None
69+
);
70+
let output = abm.generate(&config);
7071

7172
// let file1 = "./images/ABM1.png";
7273
// plot_vector((&output.trajectories[0]).clone(), file1).unwrap();

crates/RustQuant_stochastics/src/black_derman_toy.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ pub(crate) fn diff(f: &(dyn Fn(f64) -> f64 + Send + Sync), t: f64) -> f64 {
6565
#[cfg(test)]
6666
mod tests_black_derman_toy {
6767
use super::*;
68-
use crate::StochasticProcessConfig;
68+
use crate::{StochasticProcessConfig, StochasticScheme};
6969
use RustQuant_math::*;
7070

7171
// fn theta_t(_t: f64) -> f64 {
@@ -82,8 +82,10 @@ mod tests_black_derman_toy {
8282

8383
let hw = BlackDermanToy::new(sigma, theta);
8484

85-
let config = StochasticProcessConfig::new(0.13, 0.0, 1.0, 100, 1000, false);
86-
let output = hw.euler_maruyama(&config);
85+
let config = StochasticProcessConfig::new(
86+
0.13, 0.0, 1.0, 100, StochasticScheme::EulerMaruyama, 1000, false, None
87+
);
88+
let output = hw.generate(&config);
8789

8890
// Test the distribution of the final values.
8991
let X_T: Vec<f64> = output
@@ -103,8 +105,10 @@ mod tests_black_derman_toy {
103105
let theta = 1.5;
104106

105107
let hw = BlackDermanToy::new(sigma, theta);
106-
let config = StochasticProcessConfig::new(0.13, 0.0, 1.0, 100, 1000, false);
107-
let output = hw.euler_maruyama(&config);
108+
let config = StochasticProcessConfig::new(
109+
0.13, 0.0, 1.0, 100, crate::StochasticScheme::EulerMaruyama, 1000, false, None
110+
);
111+
let output = hw.generate(&config);
108112

109113
// Test the distribution of the final values.
110114
let X_T: Vec<f64> = output

crates/RustQuant_stochastics/src/brownian_motion.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ mod sde_tests {
5454
// use std::time::Instant;
5555

5656
use super::*;
57-
use crate::StochasticProcessConfig;
57+
use crate::{StochasticProcessConfig, StochasticScheme};
5858
use RustQuant_math::*;
5959
use RustQuant_utils::assert_approx_equal;
6060

@@ -84,8 +84,10 @@ mod sde_tests {
8484
// }
8585
// assert!(1 == 2);
8686

87-
let config = StochasticProcessConfig::new(0.0, 0.0, 0.5, 100, 1000, false);
88-
let output_serial = bm.euler_maruyama(&config);
87+
let config = StochasticProcessConfig::new(
88+
0.0, 0.0, 0.5, 100, StochasticScheme::EulerMaruyama, 1000, false, None
89+
);
90+
let output_serial = bm.generate(&config);
8991
// let output_parallel = (&bm).euler_maruyama(10.0, 0.0, 0.5, 100, 10, true);
9092

9193
// let file1 = "./images/BM1.png";

crates/RustQuant_stochastics/src/constant_elasticity_of_variance.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,16 @@ impl StochasticProcess for ConstantElasticityOfVariance {
6767
#[cfg(test)]
6868
mod tests_cev {
6969
use super::*;
70-
use crate::StochasticProcessConfig;
70+
use crate::{StochasticProcessConfig, StochasticScheme};
7171
use RustQuant_math::*;
7272

7373
#[test]
7474
fn test_cev_process() {
7575
let cev = ConstantElasticityOfVariance::new(0.05, 0.9, 0.45);
76-
let config = StochasticProcessConfig::new(10.0, 0.0, 0.5, 100, 100, false);
77-
let output = cev.euler_maruyama(&config);
76+
let config = StochasticProcessConfig::new(
77+
10.0, 0.0, 0.5, 100, StochasticScheme::EulerMaruyama, 100, false, None
78+
);
79+
let output = cev.generate(&config);
7880

7981
// Test the distribution of the final values.
8082
let X_T: Vec<f64> = output

crates/RustQuant_stochastics/src/cox_ingersoll_ross.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,19 @@ impl StochasticProcess for CoxIngersollRoss {
6565
#[cfg(test)]
6666
mod tests_cir {
6767
use super::*;
68-
use crate::StochasticProcessConfig;
68+
use crate::{StochasticProcessConfig, StochasticScheme};
6969
use RustQuant_math::*;
7070
use RustQuant_utils::assert_approx_equal;
7171

7272
#[test]
7373
fn test_cox_ingersoll_ross() {
7474
let cir = CoxIngersollRoss::new(0.15, 0.45, 0.01);
7575

76-
let config = StochasticProcessConfig::new(10.0, 0.0, 0.5, 100, 100, false);
76+
let config = StochasticProcessConfig::new(
77+
10.0, 0.0, 0.5, 100, StochasticScheme::EulerMaruyama, 100, false, None
78+
);
7779

78-
let output = cir.euler_maruyama(&config);
80+
let output = cir.generate(&config);
7981

8082
// Test the distribution of the final values.
8183
let X_T: Vec<f64> = output

crates/RustQuant_stochastics/src/extended_vasicek.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ impl StochasticProcess for ExtendedVasicek {
6262
#[cfg(test)]
6363
mod tests_extended_vasicek {
6464
use super::*;
65-
use crate::StochasticProcessConfig;
65+
use crate::{StochasticProcessConfig, StochasticScheme};
6666
use RustQuant_math::*;
6767
use RustQuant_utils::assert_approx_equal;
6868

@@ -81,9 +81,11 @@ mod tests_extended_vasicek {
8181

8282
let ev = ExtendedVasicek::new(alpha, sigma, theta);
8383

84-
let config = StochasticProcessConfig::new(10.0, 0.0, 1.0, 150, 1000, false);
84+
let config = StochasticProcessConfig::new(
85+
10.0, 0.0, 1.0, 150, StochasticScheme::EulerMaruyama, 1000, false, None
86+
);
8587

86-
let output = ev.euler_maruyama(&config);
88+
let output = ev.generate(&config);
8789

8890
// Test the distribution of the final values.
8991
let X_T: Vec<f64> = output

0 commit comments

Comments
 (0)