Wolfram Blog
Michael Kelly

Optimizing Financial Modeling with Mathematica

February 16, 2011 — Michael Kelly, Wolfram Technology Group

On January 25 and 27 in Chicago and New York, respectively, Wolfram, in conjunction with NVIDIA, hosted a seminar themed “Optimizing Financial Modeling” to showcase how Mathematica and CUDA can be applied within the financial industry. Full presentations and a white paper on CUDA programming with Mathematica are available for download on the seminar page.

Dr. Phillip Zecher, Chief Risk Officer of EQA Partners, detailed how Mathematica is used in every facet of his firm’s operation, and NVIDIA’s Senior CUDA Consultant John Ashley explained how CUDA programming is changing financial computation.

My talk concerned Mathematica 8′s broad functionality for finance. Each capability is deserving of a full seminar unto itself, so because of the sheer number of topics and functions, I was only able to briefly touch on a few examples from each category. A full list of financial tools in Mathematica is available in the online documentation. The following TabView presents an overview of the new financial functions:

New financial functions

At first glance, it may seem that such an array of functions might be hard to digest, but they all come with Mathematica‘s patented structure of FunctionName[arguments], where the FunctionName is exactly what it is called by the financial community. This makes absorbing and manipulating these new functions far more manageable than the usual array of acronyms encountered in other programs. For example, the function TimeValue accepts any type of financial instrument, such as annuities and cash flows, and we can replace the nominal interest rate with an effective interest rate with different periods of compounding:

Time value

We can use another TabView to provide a succession of examples of the functions TimeValue, Annuity, and Cashflow in conjunction with Solve and Expectation that makes their combined use transparent:

Examples of functions

The evaluation of bonds also have consistent structure given by FinancialBond[{"FaceValue"->FV,"Coupon"->Crate,"Maturity"->M, "CouponInterval"->CI,"RedemptionValue"->RV}, {"InterestRate"->IR,"Settlement"->S,"DayCountBasis"->DCB}] so that it is easy to construct the following applet for pricing a bond and its various properties with varying yield curve and input parameters:

Bond pricing applet

In the same way, financial derivatives also accept a well-defined structure of parameters and ambient parameters that fully describe the dependence of the option on its underlying security. One does not even need to remember the lists of parameters required to specify the model, but only its name. Thus the parameter specification for an American Put option is described by the command:

American Put option

In this way we can easily make a template for calculating and pasting financial derivatives with variable inputs:

Financial derivatives with variable inputs

The output of the above Manipulate is copied directly onto your clipboard so that you can paste it into an input cell, wrap ReleaseHold around it, and replace the PlaceHolders by numerical values, as in the example below:

ReleaseHold function

Finally, though by no means exhaustively, there is the function TradingChart, which takes data from the pre-existing function FinancialData and graphs it up with financial indicators, which can be used to identify possible trading events. In the case below, I have chosen a darker opacity for those closing prices in the bottom and top third of values because they suggest possible moments when one is most likely to buy or sell, respectively.

TradingChart function

One of the main puposes of the conference was also to highlight Mathematica‘s development of CUDA programming and to show that it can be applied to the massively parallel evaluation of financial options. To access this functionality, we must first load in the CUDALink package, which allows one to utilize the many parallel cores on the GPU. Here we simultaneously evaluate one hundred thousand different Asian arithmetic options, which are each simulated using Monte Carlo techniques. The time required to perform these calculations is a small fraction of the time required using CPU compilation.

Input 7

Input 8

Input 9

CUDALink output

For more information, please refer to the Financial Engineering and Mathematics page, or visit the Optimizing Financial Modeling seminar page to download the full presentations and a white paper on CUDA programming with Mathematica.

Download the Computable Document Format (CDF) file

Posted in: Finance
Leave a Comment

10 Comments


Mooniac

The use of “Optimizing” as a title for a seminar is a rather disingenuous marketing ploy. What is an “optimal model” supposed to be anyway? A model cannot be optimized. An optimum is, by definition, a state that cannot be improved anymore. In the material I find nothing that would allow me to get to the point of an optimal financial model.

Next, I find a couple of issues with some of the new FinancialDerivative function, they are far from perfect. Anything that is not perfect cannot be optimal. So, neither are the M functions optimal, nor would the seminar allow me to program an optimal model.

The new interfaces for the financial functions and the inclusion of CUDA in M8 are absolutely great. I use them myself with great eagerness. I have expressed my fascination for CUDA inclusion in blog comments before. But that doesn’t mean we have “optimal modelling”.

Except for the false advertising of the seminar and this blog post, an otherwise good summary of really great M8 features.

Posted by Mooniac    February 17, 2011 at 12:43 pm
Rodrigo

LOL.
Should be more careful while talking to mathematicians.

Posted by Rodrigo    February 18, 2011 at 8:05 pm
Igor

@Mooniac, “optimizing” in this context seems to be about decreasing computational time of the model (by using the GPUs) and not about creating models that are more accurate/optimal, no? Regarding FinancialDerivative[], I’d encourage you to send your feedback to Wolfram (http://www.wolfram.com/support/contact/email/?topic=Feedback).

Posted by Igor    February 22, 2011 at 11:27 am
Allan MacKinnon

Trying out CUDALink in Mathematica 8 and there are issues. Is the older NVIDIA Driver 257.xx – 260.xx *required* ? I’m running the 266.58 driver on Win 7 x64 and despite CUDAQ[] working the results silently fail. Help! :)

Posted by Allan MacKinnon    February 22, 2011 at 6:25 pm
Allan MacKinnon

Confirmed, reverting to NVIDIA 260.99 WHQL driver fixes Mathematica 8 CUDALink. The latest WHQL 266.58 does *not* work. Huzzah!

Posted by Allan MacKinnon    February 22, 2011 at 8:21 pm
mike

Unfortunately TimeValue is not a good function to be using in an article about optimizing — it is a very very slow function. This function is useful for one off calculations and likely to be of use in academia or grad school, but for real world production is so slow as to be useless.

We have written our own TimeValue functions that are over 1 order of magnitude faster than the built in stuff.

Basically, built in date and time calculations, time value, cashflow discounting and so on are so slow in Mma that you simply cannot use them in a real world environment. Fortunately it is relatively straight forward to write your own functions for these tasks but it does make you wonder why the built in ones are so dreadfully slow.

Posted by mike    February 25, 2011 at 9:45 pm
Michael Kelly & Ryan Smith

In response to Mike:
The real power behind TimeValue, Annuity, Cashflow and FinancialBond, is their symbolic capabilities. One of the main benefits of these functions is the ability to use symbolic input and get back symbolic output, which is often a closed form Mathematica expressions (even in the face of complicated payment growth functions and day-count conventions). It is the symbolic output expressions that should probably be used in further computation, iteration, optimization, statistical modeling, etc, not the TimeValue suite itself. One might view the TimeValue functions as kind of like formula generators. The pre-computed formulas can then be plugged into optimization schemes.

Also, TimeValue uses built in Mathematica Date functions like DatePlus, DateDifference, etc. When doing date computations, it will only be as fast as these functions are. It is possible that performance improvements can be gained by changing the input into unitless time rather than actual dates. TimeValue also uses the symbolic capability of Series, which can sometimes take a while to find a suitable closed form expression. Performance improvements in this realm might be gained by using the option “ClosedForm”->False (an option found in Options[TimeValue]).

Posted by Michael Kelly & Ryan Smith    March 1, 2011 at 2:10 pm
Martim

I think Stephen Wolfram is a genius of our time. I want to learn Mathematica before the world finds out about it! With Mathematica it seems that everything is possible. :)

Posted by Martim    March 10, 2011 at 8:11 pm
carrie

Also, TimeValue uses built in Mathematica Date functions like DatePlus, DateDifference, etc. When doing date computations, it will only be as fast as these functions are. It is possible that performance improvements can be gained by changing the input into unitless time rather than actual dates. TimeValue also uses the symbolic capability of Series, which can sometimes take a while to find a suitable closed form expression. Performance improvements in this realm might be gained by using the option “ClosedForm”->False (an option found in Options[TimeValue]).

Posted by carrie    April 12, 2011 at 10:53 pm
Tim

Michael Kelly and Ryan Smith,

Thank you for the tip about using the symbolic output expressions. The speed increase is amazing. I was doing a plot using FinancialBond that was taking almost 3 seconds. Using the symbolic expression in my own function made the plot appear instantaneously. If this tip isn’t in the documentation somewhere, it should be.

Posted by Tim    December 11, 2011 at 2:48 am


Leave a comment

Loading...

Or continue as a guest (your comment will be held for moderation):