mfe c++ intro

Upload: klaus-bertok

Post on 09-Jan-2016

225 views

Category:

Documents


0 download

TRANSCRIPT

C++ for Computational Finance

An Introduction to C++

Dave KleinResearch AnalystCredit Derivatives Research LLC

Two Grooks

Problems worthy of attack,prove their worth by hitting back.

------

Shun advice at any price, that's what I call good advice. Piet Hein

This Session

Overview of C++

Program syntax

Classes

Pointers

Arrays

Strings

Using Numerical Recipes

Integrating with your project

Sample program Geometric Brownian Motion (if time)

Next Session using C++ to model a derivative

Things we wont cover

Object-oriented Design / Programming

The right way to do anything

Software developers are fond of having religious discussions

In the MFE, there is no time

Professional-level programming practice

C++ Overview

C++ is about 25 years old

Originally created as a successor to CC was created about 35 years ago as a more generic assembly language

C++ is a very big language

It has many, many features

Recommendation: during MFE program, only use fundamental language featuresUnless you are an expert, avoid constructs like templates, polymorphism, operator overloading, multiple inheritance

C++ Overview cont

C++ is a dangerous language

It is easy to introduce bugs

It is often difficult to track them down

Tip: build and test your programs incrementally

Language Features Program Syntax

Program Syntax

Functions / methods

Loops

Conditional statements

Hopefully, syntax is not completely new to you. If it is, think about using a more familiar computer language.

...// this is a comment

int myFirstFunction(int a, int b, double c){int rc = a + b + c;

return rc;}...

Program Syntax (cont)

Functions

Function name

Function return type

The functions code

Return the value

Program Syntax (cont)

For loop

Do loop

...for (int i = 0; i < 100; i++){... do something ...}...

...i = 0;do{... do something ...i++;} while (i < 100);

Program Syntax (cont)

If statement

...if (i == 10){.. do something ..} else {.. do something else}...

IMPORTANT: Note the double equal signs (==) to test for equality

Classes

Classes provide the basic data/code organization construct within C++

Classes are (roughly) comprised of two parts:

Data members (properties)

Code members (methods)

Class support inheritance we dont have time to cover this

Recommendation if you are not familiar with inheritance, do not try to learn how to use it during the MFE

Classes (cont)

class myFirstClass{public:// Some propertiesint integerProperty;double floatingPointProperty;char characterArray[254];

// some methods// a constructormyFirstClass(){integerProperty = 12;floatingPointProperty = 25.2;strcpy(characterArray, "yo yo yo");}

// a destructorvirtual ~myFirstClass(){}

void doSomething(){... some code would go here ...}};

Classes cont

There are other features to classes including:

Information hiding (public, protected, private)

Virtual functions

They are extremely powerful and useful, but now is not the time to play with these.

Classes cont

Classic interview question: What is the difference between a class and an object?

Better interview question: Can an object ever be a class?

Pointers

Pointers are a special type of variable

Pointers hold the address of data, not the data

Pointers must be assigned values before they can be used.

Pointers (cont)

Pointers are a special type of variable

Pointers hold the address of data, not the data

...

int a1; // a1 is not a pointer

int *a2; // a2 is a pointer

a1 = 10;a2 = &a1; // a2 now points to a1

*a2 = 5; // we dereference a2 to assign a value

printf("%d %d\n", a1, *a2); // what will this print?

...

Pointers (cont)

Be very careful with pointers

Someone once estimated that 90% of all C++ bugs can be traced back to bad pointers

Memory Allocation / Arrays

C++ supports both statically and dynamically allocated arrays

If you dynamically allocate an array, make sure to deallocate it when you are done using it.

Make sure you are really done using it before you deallocate!

Memory Allocation / Arrays (cont)

...

int myArray[10]; // this is statically allocated array

for (int i = 0; i < 10; i++){// Assign a value to each member of the array// Notice that the array is 'referenced' from 0 to 9// Arrays in C++ 'start' at 0myArray[i] = i * i + 1;}

...

Memory Allocation / Arrays (cont)

...

// this is dynamically allocated array// it looks suspiciously like a pointer!int *myArray;

// first we allocate itmyArray = new int[10];

// this is what a for loop looks likefor (int i = 0; i < 10; i++){// Assign a value to each member of the array// Notice that the array is 'reference' from 0 to 9// Arrays in C++ 'start' at 0myArray[i] = i * i + 1;}

// now we deallocate itdelete[] myArray;

...

Memory Allocation / Arrays cont

Question: when should you dynamically allocate an array?

When should static allocation be used?

Strings (or lack thereof)

C++ does not have a standard string class

There is a string class within the Standard Template Library (STL)

Unless you know how to use the STL, ignore it for this term

Recommendation: for output, debugging purposes learn how to use printf, sprintf, fprintf

The classic way of handling strings is to treat them as arrays of chars. Then use strcpy, strcmp, etc.

Strings (or lack thereof) printf()

printf() enables the formatting of character data

printf(format_string, data1, data2, )

Example:printf(This is a %s %d %lf test\n, printing, 2, 5.005)

Produces: This is a printing 2 5.005 test

Using Numerical Recipes

There are many numerical libraries available

Numerical Recipes for C++ is easy to use

DO NOT RE-INVENT THE WHEEL

If you do not have NR, search on-line for numerical class libraries

Do not write your own random-number generator

Do not write your own matrix classes

Do not implement complex numerical algorithms if there are canned routines already available

Exception: if the goal of a homework assignment is to implement an algorithm.

Using Numerical Recipes cont

Warning: there are Numerical Recipes books for FORTRAN, C, C++, etc.

Each one is slightly different

NR originally implemented in FORTRAN

C & C++ versions different enough from each other to cause problems

For example, arrays in C version are handled differently than in C++ version

Using Numerical Recipes cont

Three different ways to add NR to your project

Recommended : copy the files you need (including nr.h) to your project directory and add the cpp files to your project

Build a static library or DLL with all the NR routines in them

Copy the code directly from the NR files into your code files

Using Numerical Recipes cont

Example: Using an NR random number generator

Problem: Want standard normal pseudorandom variable

Solution: use gasdev() from NR

Using Numerical Recipes cont

#include #include "nr.h"

...

// let's generate 100 standard normal variablesdouble normals[100];

// seed the random number generatorint idum = -time(NULL);

for (int i = 0; i < 100; i++){normals[i] = NR::gasdev(idum); }

...

Putting it All Together A Geometric Brownian Motion Class

We want to:

Model drift, diffusion

Reuse the same object over and over to generate different paths

GBM cont

Our class properties

m_nSInitial the initial security value (constant)

m_nDrift the drift term (constant)

m_nSigma our volatility term (constant)

m_nCurrentTime the current time in our simulation

m_nSCurrent the current security value

Our class methods

CGBMotion - our constructor

void step moves time forward

double getCurrentValue returns m_nSCurrent

void reset - resets current time & security value

Code

#include #include "nr.h"

class CGBMotion{public:// our propertiesint m_nIdum; // used by NR::gasdevdouble m_nSInitial; // initial security value (constant)double m_nDrift; // our drift (constant)double m_nSigma; // our volatility (constant)double m_nCurrentTime; // the current elapsed timedouble m_nCurrentDiffusion; // how much the process has diffused

Code cont

. . . public:// our constructorCGBMotion(double nSInitial, double nDrift, double nSigma, int seed){m_nSInitial = nSInitial;m_nDrift = nDrift;m_nSigma = nSigma;m_nCurrentTime = 0;m_nCurrentDiffusion = 0;m_nIdum = seed;}

Code cont

. . .

void step(double nTime){double nDeltaT = nTime - m_nCurrentTime; // how much time has elapsed?if (nDeltaT > 0){// some time has elapsed// add to our diffusion relative to sqrt of elapsed timem_nCurrentDiffusion += sqrt(nDeltaT) * NR::gasdev(m_nIdum);

// update our current timem_nCurrentTime = nTime;}}

Code cont

. . .

double getCurrentValue(){return m_nSInitial * exp(m_nDrift*m_nCurrentTime - .5* m_nSigma * m_nSigma*m_nCurrentTime + m_nSigma*m_nCurrentDiffusion));}

double reset(){m_nCurrentTime = 0;m_nCurrentDiffusion = 0;}

};

GBM Sample Program

int main(int argc, char* argv[]){CGBMotion oGBM(100.0, .05, .2, -10); // our brownian motion object

// run 10000 simulationsfor (int i = 0; i < 10000; i++){double t = 0;oGBM.reset();

// run 100 time stepsfor (int j = 0; j < 100; j++){t = t + .01;oGBM.step(t);}

// print the resultsprintf("%02d: Simulated value %lf\n", i, oGBM.getCurrentValue());}

return 0;}

3 Great Resources

Wikipedia: http://www.wikipedia.org

Wilmott: http://www.wilmott.com

Google (of course) : http://www.google.com

Questions / Discussion