Thursday, April 17, 2014

Python and QuantLib - American Equity Options

[The previous post in this series is here]

American options are exactly the same as European options in every respect, except of course, the holder of an American option can exercise his right to buy or sell stock earlier than the expiry date.

On the face of it, this extra freedom in the contract sounds like a big benefit.  Extra choice is always good.

In practice however, the dollar value of the benefit is minimal.

American bankers (North or South?) are great sales people.  They sell some fancy financial products which sound much better value than it really is.  Where have I heard that before?  Ingenious.

The benefit might be near worthless but after the tweak there is no analytical solution to the problem.  I.e. no best 'answer' in all situations.
If the expiry date is finite, the problem is associated with a 2-dimensional free-boundary problem with no known closed-form solution.
Luckily QuantLib provides a couple of dozen pricing engines that numerically approximate solutions; which means if you really care about accuracy you have a lot of ammunition to nail down decent numbers.

On the other hand, if you really don't care too much, I hear you!

It takes two lines of code to change our previous European option into an American option.

First we need to change the exercise rules to allow for early expiry.

Our exercise variable in the European option example
exercise = EuropeanExercise(expiry_date)  
exercise = AmericanExercise(valuation_date, expiry_date)
Now we have to look into which pricing engine to use.

Cox, Ross and Rubinstein is the bog standard method that everyone uses and understands well but unfortunately is also terribly inefficient.

I have found that the finite difference engine generally achieves far better accuracy within a similar time period.

We switch out the European analytical engine
engine = AnalyticEuropeanEngine(process)
with our brand spanking new one
time_steps = 100
grid_points = 100
engine = FDAmericanEngine(process, time_steps, grid_points)
Once we have everything good to go and see results we will notice far fewer analytics available.  We have left the analytical world and almost every sensitivity calculation no longer comes for free.  I.e. now we will have to recalculate by shocking inputs a little in order to see each Greek.

The full source code for the example is here.  Note that I have started to organise the code into methods.

So there you have it.  Bank salesmen in America threw a nice sweetener into the option deal causing headaches for practitioners (and grant money for mathematicians) for decades to come.

Now we will just have to wait for African (?) equity option salesmen to popularise American options with 'infinite' expiries to make our lives easier again.

Wednesday, April 16, 2014

Python and QuantLib - Equity Option Example Source Code

[Read the previous part of this series here]

The command line entries have been rejiggered into one Python file which you can download.

I added some new results also, which give you an idea of the analytical results available out of the box.

[Read the next part here!]

Saturday, April 05, 2014

Quantlib and Python - Putting Fingers to Keyboard

[Read the previous part in this series here]

You want to be an ueber powerful super hero capable of all sorts of impossible feats; then again don't you want to lead a simple life away from all the complexities of having rubbery hands and being able to become invisible?

No wonder super heroes resort to having those Clarke Kent and Bruce Wayne alter egos.

[As an aside, that reminds me of the age old question - would you rather be able to fly or turn invisible?]

Every designer has to ask himself this.  Not whether he wants to fly or not but do we want to do a few things well or be a super duper Swiss Army knife?

Quantlib (most of the time) comes down on the Swiss Army side of the argument; which means it's hard to learn; but also, once mastered, you will have those financial super powers at the touch of your finger tips. That's the hope!

Dates are a good starting point.  Almost everything non trivial in finance involves specific future payoffs.  Actually when I say non trivial I mean in some way tractable; the really hard stuff doesn't have specific future payments is left untouched.

In any case let's drop into Python's interactive interpreter


and create a few date objects

>>> from QuantLib import *
>>> valuationDate = Date(13,1,2014) 
>>> expiryDate = Date(13,1,2015)

Now tell the system what the valuation date is

>>> Settings.instance().evaluationDate = 

Finance is obsessed by time.  And of course money.  The cost of money over time is naturally represented by discount factors and on a day to day basis these prices are quoted as interest rates.

The following code sets an interest rate of 1% and tells the system that the price of money is constant over time.  The actual actual day count convention makes sure every calendar is accounted for when accruing payment IOUs (i.e. no short cut conventions are made in assuming 30 days in a month and 360 days a year).

>>> interestRate = 0.01
>>> riskFreeRate = FlatForward(valuationDate, interestRate, ActualActual() )

We can do the same for dividends.

>>> dividendRate = 0.02
>>> dividendYield = FlatForward(valuationDate, dividendRate, ActualActual() )

By the way if you want decent dividend predictions, check out

Any financial asset with non-linear payoffs (it turns out almost everything) needs to account for volatility.  We will setup our volatility data in a very similar manner.

>>> calendar = UnitedStates()
>>> volRate = 0.03 
>>> volatility = BlackConstantVol(valuationDate, calendar, volRate, ActualActual())

As an aside, QuantLib's calendars are very useful (at the risk of being monotonous - finance is obsessed by time! : )).

I am unsure why volatility requires calendar information whereas flat forwards does not.  Let me know in the comments if you can enlighten me.

The last piece of data to setup is an underlying equity price of 123

>>> underlying = SimpleQuote(123)

As you can see, pretty much everything needed to be an object in QuantLib.  Every.  Single.  Thing.

Hardcore abstraction may well give you super powers, but also means there's a high barrier to entry.

No prizes for what we are going to model next.  We need to specify the payoff conditions for our European equity call option with a strike of 100

>>> exercise = EuropeanExercise(expiryDate)  
>>> strikePrice = 100
>>> payoff = PlainVanillaPayoff(Option.Call, strikePrice)

and roll those terms together into an option object

>>> option = VanillaOption(payoff,  exercise)

Now bundle the market data together

>>> u = QuoteHandle(underlying) 
>>> d = YieldTermStructureHandle(dividendYield)
>>> r = YieldTermStructureHandle(riskFreeRate)
>>> v = BlackVolTermStructureHandle(volatility)  
>>> process = BlackScholesMertonProcess( u,d,r,v)

Things are getting a little convoluted now with the handle objects, eh?

Finally we set the pricing engine.

>>> engine = AnalyticEuropeanEngine(process)
>>> option.setPricingEngine(engine)

Let's price and see a result

>>> option.NPV()

Now we start to tangibly benefit from the object oriented-ness.  We can swap pricing engines in and out to our heart's content.  For example, why stick with bog standard Black Scholes when we could use something which sounds much fancier?

In any case, we will wrap up by calculating some Greeks

>>> option.gamma()
>>> option.vega()
>>> option.theta() 
>>> option.rho()

If you missed it, QuantLib is a pretty verbose convoluted affair.

Rest assured as with intelligent design or creationism everything is done for a reason and after overcoming all of these obstacles you will become a finance quant prophet amongst men.

Friday, April 04, 2014

Quantlib and Python - Getting Started

[See part 1 of this series here]

When it comes to open source software Linux is the only way to go.

Why would you use anything other than Photoshop on a Mac or a cutting edge game on Windows? - using Linux is just easier for Python development and all the quant lib packages come ready made for your machine (no messy compiling required!).

In order to install Quantlib for Python on Debian (sure to work on Ubuntu and Mint also) Linux system run:

apt-get install quantlib-python

which will install everything you need.

Now give your setup a quick test:

cd /usr/share/doc/quantlib-python/examples/

With any luck you will see a bunch of analytical results in your console.

This collection of examples are one of two resources I have found about using Python for Quantlib, which hopefully I can add to a little with these blog posts.

The other reference which you can use are the test units also included in the same folder.

ls /usr/share/doc/quantlib-python/examples/test/

These tests are used as a check by the library developers to ensure everything is good to go and no bugs have been introduced.  With such meagre references the tests are valuable reference for code written in Python.

One of the other places to go to with is the Quantlib C++ library reference itself.  As I said before, C++ is not my forte and in this day and age more of an academic pursuit in finance than anything else.  Nevertheless, example Python code is in short supply - and the python code that you do write is pretty close to what you see written in C++.

The upshot is on the one hand your Python code doesn't feel super Pythonic because you are tied so close to the C++ libraries.  On the other hand the C++ idioms start making more and more sense after days and weeks of banging your head of the wall! (no pain no gain?)

The places to ask questions are Wilmott, Quant Stack Exchange and the mailing list.  None are high traffic when it comes to Quantlib (scared off yet?) so your mileage may vary.

[Continued here]

Quantlib and Python - An Introduction

I am learning how to write Quantlib code with Python in order to create a project of mine called Vol Kills.  What better way to learn than writing down what I have figured out?  And perhaps I can help others out along the way.

First question, why Quantlib? why Python?

Firstly Python is easier to learn than C++ (I admit I never tried, always sounded too daunting).  You can code quick with no need to worry about the cruft that comes with Java and C.

Secondly, we're really just using Python to send messages to Quantlib which is written in C++ compiled down to super fast 1s and 0s.

Best of both worlds!

Third Python does a lot.  You get the stats libraries; web frameworks; heavy lifting"extract transform load" libraries and more right there in the one place (their motto is "batteries included" after all).  No need to mess around with multiple languages and run times.

A quick word about QuantLib.  It's a collection of code which helps people like me model financial investments; understand how investor's portfolios tick and perhaps point out some opportunities and pitfalls ahead.

Quantlib has been developed for over a decade.  It is widely used and battle hardened.  Best of all it is free and open source, which means you can use it without worrying about licensing fees and nasty bugs (the more eyeballs on the code the less chance of errors).

[Continued here]

Saturday, March 01, 2014

Quantlib 1.3 Debian Packages for Debian Stable

Debian is the old reliable Linux distribution.

It comes in several flavours.  "Unstable" which is really just the latest and greatest open source apps all collected together.

On the other end of the scale the "stable" release includes battle hardened software that has been tested for years.

Unstable is used on desktops stable is all about servers.

I ran into a problem last week however, as I needed some features from Quantlib 1.3 which weren't available in 1.2 (bundled with Stable).

Last time I did any serious compilation work was college.  Turned out not to be too tricky.

As of this weekend Quantlib 1.3 itself is out of date but I'll make do without 1.4 for the time being.

Without further ado download the deb packages here (including Ruby and Python bindings).

Sunday, March 25, 2012

"Monotony Collapses Time. Novelty Unfolds It"

Psychologists have done experiments which show that packing more events into your life stretches out your experience of time (see this podcast).

In one experiment a psychologist locked himself up for two months in complete isolation. When he was pulled out he had only one month of entries in his journal.

In effect he had lost a month. Time as he experienced it halved.

Collecting as many memories as possible is not too bad a goal. One day does not become indistinguishable from the next; years don't have rhetorical postscripts about where they went.

I wonder how much time is expanded by taking vacations; living in new places and doing new things? Is there a limit to expansion?

Learning how to retell memories well and remembering to jot them down may be good habits also. Then again I am not a fan of sentimentality. Maximising 'future memory' is the way to go.

Sunday, March 18, 2012


While doing my best to fight Irish stereotypes - i.e. not drinking on St. Patrick's day - I listened to this incredible documentary (I still have the MP3 if anyone wants to listen) about the suffregette movement in the UK (and Ireland) one hundred years ago.

Women fighting for the vote and their civil rights; bombs planted in cabinet ministers houses; torture of suffragettes in prisons by the authorities - all relayed by nice old women on recordings made in the 70s.

I had no idea how gritty and tough the fight for women's suffrage was!

Interestingly, after the vote was won by women the point was made in the documentary that there was still a lot inequality left to tackle.

The same point was made at the end of Ken Burns' documentary on the civil war - changing the law is easier (a four year war which killed hundreds of thousands) than changing people's mindsets.

Thursday, February 23, 2012

Stomach Churning Poetry

People write songs and poems about feeling in love, it's the feeling that makes hearts tick and pencils scribble. Crazy things happen when someone falls for a boy or a girl - novels and movies are written about the ensuing twists and turns.

What I do every day is about a feeling, unfortunately not love, it's the feeling you get when you are about to make a big decision, that feeling in your stomach when you can't really think straight you just feel a little off colour (or maybe extremely ill if it's a humungous decision).

The bigger the decision the bigger the stakes the more stomach churning the quandry.

Here's an example of a not so risky proposition and something rather more risky (albeit slightly artificial).

Heads I give you a Snickers bar, tails I give you nothing (and you give me nothing either). Good deal eh? (if you are allergic to nuts you can eat around them!) Half the time you will end up with a nice Snickers, half the time nothing happens.

That's a no brainer, not stomach churning at all.

Well what about this for size? Heads I give you a Snickers plus ten thousand bucks; tails you give me ten thousand bucks!

The stakes are waaaaay higher now and if you happened to agree to partake in the game, your palms will probably feel a little sweaty, heart pumping.

Chances are you wouldn't take part in the game, even though it's slightly biased in your favour. In fact it's biased exactly the same way as the first game - that delicious snickers bar - however a chance of losing the 10,000 bucks wouldn't make you sleep well at night.

And that feeling my pals is the nervousness, stomach churningness that is risk. That's what I think about most days and that's what I help describe for hedge funds, pension funds and their investors.

If only I was paid to write poetry and sing songs about risk to said investors instead of spreadsheets and reports.

Thursday, February 09, 2012

Finite Games

At the end of the Super Bowl last weekend there was an odd moment a minute from time.

A New York Giants player found himself rushing towards the goal line and couldn't stop himself from scoring a touchdown. You may think that would be the dream of every American - to score a touchdown and help win the biggest prize in American sport.

The problem was by scoring the New England Patriots then had a slim chance of scoring down the other end in the remaining time. The correct strategy was to not score but keep the ball and wait until the last moment to score a field goal.

The problem of not wanting to score (at least for a period) is a quirk that happens toward the end of games. The same happens in soccer now and again - a team will rather keep the ball than score.

It happens elsewhere also, every relationship or 'game' we have is finite, there's always an end game and it's always plays out differently to what's gone one before.

Friday, December 23, 2011

Pop Up Restaurants

A restaurant goes out of business and the landlord is finding it difficult to lease the space - so they rent out to people on a short term basis at lower than normal rents.

Hey presto, you have a pop up restaurant!

Monday, December 19, 2011


I am back on FB.

A couple of reasons:

1) I want to keep in contact with people better, especially those in Indonesia

2) /All/ the free internet PCs in Changi airport had people logging into Facebook. Just goes to show you...

Private Equity

I leave a vibrant Jakarta for a miserable Dublin.

This morning a retired doctor is telling me how screwed Ireland is over a coffee in Dublin. He tells me how the English are doing their level best to bring the Euro down, intimating the the prime minister is in cahoots with big financial interests in London.

He looks for some confirmation from me, I only mutter indecisively.

Conspiracy theories are something I used to hear in Jakarta, now I am listening to them in Dublin. I suppose there's less time for a good yarn when everyone is making good money.

Friday, November 25, 2011

Saturday, November 05, 2011

Harry Potter

I am reading it on my way to and from work and sometimes even at home - I am terrible about reading-off-net so to speak which is a shame.

I feel reading-on-net is throwaway for the most part, it's nice in that you read a little about a lot quickly - but good books are like long term relationships, much more meaningful.

Even newspapers are marginally better, I suppose it's easier to read longer articles on paper.

Tuesday, October 18, 2011

Wednesday, October 12, 2011


BBC 's Americana - consigned to history. I've lived here for about 3 years and, it struck just the right tone. Pity.