avhz / RustQuant

Rust library for quantitative finance.
https://avhz.github.io
Apache License 2.0
1.14k stars 134 forks source link

Implement finite-difference pricers. #98

Closed avhz closed 4 months ago

SimonG85 commented 1 year ago

I'd take this one. Do you have some references for the implementation?

avhz commented 1 year ago

You could try Finite Difference Computing with PDEs. It's supposed to be quite good and it's open access here.

Also might be worth having a look at QuantLib.

SimonG85 commented 1 year ago

@avhz I also found a chapter in implementing quantlib. I'm reading, we will see soon.

jrinder42 commented 9 months ago

You can take a look here, specifically at the PDE_European.jl and PDE_American.jl files. I worked on this very problem a while ago, albeit, in Julia. Feel free to translate this code to Rust.

SimonG85 commented 8 months ago

You can take a look here, specifically at the PDE_European.jl and PDE_American.jl files. I worked on this very problem a while ago, albeit, in Julia. Feel free to translate this code to Rust.

Thanks. I'm a little bit busy at work but I'll take a look!

yfnaji commented 7 months ago

Hey @SimonG85

Would it be ok if I take this issue? I was able to make some progress on it. I would very happy for you to look at the PR once it is ready.

SimonG85 commented 7 months ago

@yfnaji yeah you can take it for sure!

avhz commented 6 months ago

@yfnaji

In the latest commit (74a90f0), I tried ATM option tests, and there a number of failures. In particular, the explicit() method seems to have an issue.

---- instruments::options::finite_difference_pricer::tests_finite_difference_pricer::european_call_explicit stdout ----
thread 'instruments::options::finite_difference_pricer::tests_finite_difference_pricer::european_call_explicit' panicked at src/instruments/options/finite_difference_pricer.rs:503:9:

Left:           NaN, 
Right:          2.179260421286685, 
Precision:      0.000000014901161193847656

note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

---- instruments::options::finite_difference_pricer::tests_finite_difference_pricer::american_put_explicit stdout ----
thread 'instruments::options::finite_difference_pricer::tests_finite_difference_pricer::american_put_explicit' panicked at src/instruments/options/finite_difference_pricer.rs:488:9:

Left:           54096898083232840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 
Right:          1.74684769403327, 
Precision:      0.000000014901161193847656

---- instruments::options::finite_difference_pricer::tests_finite_difference_pricer::american_call_explicit stdout ----
thread 'instruments::options::finite_difference_pricer::tests_finite_difference_pricer::american_call_explicit' panicked at src/instruments/options/finite_difference_pricer.rs:473:9:

Left:           inf, 
Right:          2.179260421286685, 
Precision:      0.000000014901161193847656

---- instruments::options::finite_difference_pricer::tests_finite_difference_pricer::european_put_explicit stdout ----
thread 'instruments::options::finite_difference_pricer::tests_finite_difference_pricer::european_put_explicit' panicked at src/instruments/options/finite_difference_pricer.rs:518:9:

Left:           NaN, 
Right:          1.691554666293824, 
Precision:      0.000000014901161193847656

---- instruments::options::finite_difference_pricer::tests_finite_difference_pricer::american_call_implicit stdout ----
thread 'instruments::options::finite_difference_pricer::tests_finite_difference_pricer::american_call_implicit' panicked at src/instruments/options/finite_difference_pricer.rs:478:9:

Left:           2.771814089100344, 
Right:          2.179260421286685, 
Precision:      0.000000014901161193847656

---- instruments::options::finite_difference_pricer::tests_finite_difference_pricer::european_call_implicit stdout ----
thread 'instruments::options::finite_difference_pricer::tests_finite_difference_pricer::european_call_implicit' panicked at src/instruments/options/finite_difference_pricer.rs:508:9:

Left:           2.771814089100344, 
Right:          2.179260421286685, 
Precision:      0.000000014901161193847656

---- instruments::options::finite_difference_pricer::tests_finite_difference_pricer::european_call_crank_nicolson stdout ----
thread 'instruments::options::finite_difference_pricer::tests_finite_difference_pricer::european_call_crank_nicolson' panicked at src/instruments/options/finite_difference_pricer.rs:513:9:

Left:           0.8579231906354501, 
Right:          2.179260421286685, 
Precision:      0.000000014901161193847656

Edit (see e5db8c0):

There also seems to be an issue with OTM Eur Call implicit() method.

explicit() also fails on OTM/ITM.

'instruments::options::finite_difference_pricer::tests_finite_difference_pricer_out_of_the_money::european_call_implicit' panicked at src/instruments/options/finite_difference_pricer.rs:758:9:

Left:           -0.41215437112011133, 
Right:          0.000001014047539618235, 
Precision:      0.000000014901161193847656
yfnaji commented 6 months ago

@avhz thanks for bringing this to my attention - I am currently investigating and will update as soon as I find something