-
-
Notifications
You must be signed in to change notification settings - Fork 142
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Finite Difference Pricer with nalgebra #212
Closed
Closed
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
… and expiration_date
…guments + introduce define T in explicit()
…es time_steps and price_steps
I will close this for now, however I would be interested to see if this can be optimised further. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Important Notes
This Pull Request is regarding issue #98 for the creation of a finite difference pricer.
I have made 2 PRs for this particular issue. Only one of them needs to be merged if the decision has been made to merge.
nalgebra vs heap allocated vectors
This PR utilises the nalgebra package to represent vectors and matrices, and handle their calculations. The other PR uses heap allocated vectors instead.
The way in which the objects and methods should be used are exactly the same for both PRs.
There are differences in speed performance between the two implementations.
An example with the following parameters:
We get the following runtimes when we run one instance of both implementations:
We can immediately see that the explicit method is about
17 2224 times faster using heap allocated vectors than using the nalgebra package (this PR) and runtime for the Crank-Nicolson method is roughly halved (This is at least the case for the machine I am running the code on).Contents of this PR
This PR implements the following features:
A struct,
FiniteDifferencePricer
in the moduleinstruments::options::finite_difference_pricer
, where the attributes are the parameters of an option, namely:initial_price: f64
strike_price: f64
risk_free_rate: f64
volatility: f64
evaluation_date: Option<Date>
,expiration_date: Date
,time_steps: u32
,price_steps: u32
,type_flag: TypeFlag
,exercise_flag: ExerciseFlag
where
TypeFlag
andExerciseFlag
are imported frominstruments::options::option
A constructor for the above
struct
with thenew()
method which takes in the above defined attributes as argumentsThree public methods implemented in the
FiniteDifferencePricer
for the three widely known finite difference methods, namelyexplicit()
,implicit()
andcrank_nicolson()
which returns the option price rounded to 2 decimal placesDemonstration by example
We can start off by defining the finite difference object by calling the
new()
constructorNow that the object has been defined, we can run any of the 3 methods to provide a numerical approximation of the option price:
Running the above code yields the following results:
Notes
I have opted to solve this problem using a
struct
to define the option parameters and from there we can run each finite difference method from the object. Alternatively, I could amend the PR so that it can be purely functional.The code utilises the Dirichlet condition for the boundaries of the stock price extremities:
If we define the following:
Then Dirichlet boundary conditions for the call options are:
and for the put options: