[odegaard] financial numerical recipes in c++

Upload: qi-fu

Post on 08-Apr-2018

244 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    1/185

    F i n a n c i a l N u m e r i c a l R e c i p e s i n C

    + +

    .

    B e r n t A r n e d e g a a r d

    J a n u a r y 2 0 0 6

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    2/185

    C o n t e n t s

    1 O n C + + a n d p r o g r a m m i n g . 4

    1 . 1 C o m p i l i n g a n d l i n k i n g . . . . . . . . . . . . . . 4

    1 . 2 T h e s t r u c t u r e o f a C + + p r o g r a m . . . . . . . . 4

    1 . 2 . 1 T y p e s . . . . . . . . . . . . . . . . . . . 4

    1 . 2 . 2 O p e r a t i o n s . . . . . . . . . . . . . . . . . 4

    1 . 2 . 3 F u n c t i o n s a n d l i b r a r i e s . . . . . . . . . . 5

    1 . 2 . 4 T e m p l a t e s a n d l i b r a r i e s . . . . . . . . . . 5

    1 . 2 . 5 F l o w c o n t r o l . . . . . . . . . . . . . . . . 6

    1 . 2 . 6 I n p u t O u t p u t . . . . . . . . . . . . . . . 6

    1 . 2 . 7 S p l i t t i n g u p a p r o g r a m . . . . . . . . . . 7

    1 . 2 . 8 N a m e s p a c e s . . . . . . . . . . . . . . . . 7

    1 . 3 E x t e n d i n g t h e l a n g u a g e , t h e c l a s s c o n c e p t . . . . 8

    1 . 3 . 1 d a t e , a n e x a m p l e c l a s s . . . . . . . . . . 8

    1 . 4 C o n s t r e f e r e n c e s . . . . . . . . . . . . . . . . . . 1 4

    1 . 5 O t h e r C

    + +

    c o n c e p t s . . . . . . . . . . . . . . . 1 4

    2 M a t r i x T o o l s 1 5

    2 . 1 T h e r s t s c r e e n . . . . . . . . . . . . . . . . . . 1 5

    3 T h e v a l u e o f t i m e 1 6

    3 . 1 P r e s e n t v a l u e . . . . . . . . . . . . . . . . . . . 1 6

    3 . 2 O n e i n t e r e s t r a t e w i t h a n n u a l c o m p o u n d i n g . . . 1 6

    3 . 2 . 1 I n t e r n a l r a t e o f r e t u r n . . . . . . . . . . . 1 8

    3 . 2 . 2 B o n d s . . . . . . . . . . . . . . . . . . . 2 1

    3 . 2 . 3 M e a s u r i n g b o n d s e n s i t i v i t y t o i n t e r e s t r a t e

    c h a n g e s . . . . . . . . . . . . . . . . . . . 2 5

    3 . 3 C o n t i n o u s l y c o m p o u n d e d i n t e r e s t . . . . . . . . 2 9

    3 . 3 . 1 P r e s e n t v a l u e . . . . . . . . . . . . . . . 2 9

    3 . 3 . 2 B o n d p r i c i n g a n d a n a l y s i s . . . . . . . . 3 0

    3 . 4 F u r t h e r r e a d i n g s . . . . . . . . . . . . . . . . . . 3 2

    4 T h e t e r m s t r u c t u r e o f i n t e r e s t r a t e s a n d a n o b j e c t

    l e s s o n 3 3

    4 . 1 T h e i n t e r c h a n g e a b i l i t y o f d i s c o u n t f a c t o r s , s p o t

    i n t e r e s t r a t e s a n d f o r w a r d i n t e r e s t r a t e s . . . . . 3 3

    4 . 2 T h e t e r m s t r u c t u r e a s a n o b j e c t . . . . . . . . . 3 6

    4 . 2 . 1 B a s e c l a s s . . . . . . . . . . . . . . . . . 3 6

    4 . 2 . 2 F l a t t e r m s t r u c t u r e . . . . . . . . . . . . . 3 8

    4 . 3 U s i n g t h e c u r r e n t l y o b s e r v e d t e r m s t r u c t u r e . . . 4 0

    4 . 3 . 1 L i n e a r I n t e r p o l a t i o n . . . . . . . . . . . . 4 0

    4 . 3 . 2 I n t e r p o l a t e d t e r m s t r u c t u r e c l a s s . . . . . 4 2

    4 . 4 B o n d c a l c u l a t i o n s w i t h a g e n e r a l t e r m s t r u c t u r e

    a n d c o n t i n o u s c o m p o u n d i n g . . . . . . . . . . . 4 5

    5 F u t u r e s a l g o r i t m s . 4 7

    5 . 1 P r i c i n g o f f u t u r e s c o n t r a c t . . . . . . . . . . . . . 4 7

    6 B i n o m i a l o p t i o n p r i c i n g 4 8

    6 . 1 M u l t i p e r i o d b i n o m i a l p r i c i n g . . . . . . . . . . . 5 0

    7 B a s i c O p t i o n P r i c i n g , t h e B l a c k S c h o l e s f o r m u l a 5 4

    7 . 1 T h e f o r m u l a . . . . . . . . . . . . . . . . . . . . 5 4

    7 . 2 U n d e r s t a n d i n g t h e w h y ' s o f t h e f o r m u l a . . . . . 5 7

    7 . 2 . 1 T h e o r i g i n a l B l a c k S c h o l e s a n a l y s i s . . . 5 7

    7 . 2 . 2 T h e l i m i t o f a b i n o m i a l c a s e . . . . . . . 5 7

    7 . 2 . 3 T h e r e p r e s e n t a t i v e a g e n t f r a m e w o r k . . . 5 8

    7 . 3 P a r t i a l d e r i v a t i v e s . . . . . . . . . . . . . . . . . 5 8

    7 . 3 . 1 D e l t a . . . . . . . . . . . . . . . . . . . . 5 8

    7 . 3 . 2 O t h e r D e r i v a t i v e s . . . . . . . . . . . . . 5 8

    7 . 3 . 3 I m p l i e d V o l a t i l i t y . . . . . . . . . . . . . . 6 1

    8 W a r r a n t s 6 4

    8 . 1 W a r r a n t v a l u e i n t e r m s o f a s s e t s . . . . . . . . . 6 4

    8 . 2 V a l u i n g w a r r a n t s w h e n o b s e r v i n g t h e s t o c k v a l u e 6 4

    8 . 3 R e a d i n g s . . . . . . . . . . . . . . . . . . . . . . 6 5

    9 E x t e n d i n g t h e B l a c k S c h o l e s f o r m u l a 6 7

    9 . 1 A d j u s t i n g f o r p a y o u t s o f t h e u n d e r l y i n g . . . . . . 6 7

    9 . 1 . 1 C o n t i n o u s P a y o u t s f r o m u n d e r l y i n g . . . . 6 7

    9 . 1 . 2 D i v i d e n d s . . . . . . . . . . . . . . . . . . 6 8

    9 . 2 A m e r i c a n o p t i o n s . . . . . . . . . . . . . . . . . . 6 9

    9 . 2 . 1 E x a c t a m e r i c a n c a l l f o r m u l a w h e n s t o c k i s

    p a y i n g o n e d i v i d e n d . . . . . . . . . . . . 6 9

    9 . 3 O p t i o n s o n f u t u r e s . . . . . . . . . . . . . . . . 7 3

    9 . 3 . 1 B l a c k ' s m o d e l . . . . . . . . . . . . . . . 7 3

    9 . 4 F o r e i g n C u r r e n c y O p t i o n s . . . . . . . . . . . . 7 5

    9 . 5 P e r p e t u a l p u t s a n d c a l l s . . . . . . . . . . . . . 7 7

    9 . 6 R e a d i n g s . . . . . . . . . . . . . . . . . . . . . . 7 8

    1 0 O p t i o n p r i c i n g w i t h b i n o m i a l a p p r o x i m a t i o n s 7 9

    1 0 . 1 I n t r o d u c t i o n . . . . . . . . . . . . . . . . . . . . 7 9

    1 0 . 2 P r i c i n g o f o p t i o n s i n t h e B l a c k S c h o l e s s e t t i n g . 8 0

    1 0 . 2 . 1 E u r o p e a n O p t i o n s . . . . . . . . . . . . . 8 0

    1 0 . 2 . 2 A m e r i c a n O p t i o n s . . . . . . . . . . . . . 8 0

    1 0 . 2 . 3 E s t i m a t i n g p a r t i a l s . . . . . . . . . . . . . 8 3

    1 0 . 3 A d j u s t i n g f o r p a y o u t s f o r t h e u n d e r l y i n g . . . . 8 6

    1 0 . 4 P r i c i n g o p t i o n s o n s t o c k s p a y i n g d i v i d e n d s u s i n g

    a b i n o m i a l a p p r o x i m a t i o n . . . . . . . . . . . . . 8 7

    1 0 . 4 . 1 C h e c k i n g f o r e a r l y e x e r c i s e i n t h e b i n o m i a l

    m o d e l . . . . . . . . . . . . . . . . . . . . 8 7

    1 0 . 4 . 2 P r o p o r t i o n a l d i v i d e n d s . . . . . . . . . . . 8 7

    1 0 . 4 . 3 D i s c r e t e d i v i d e n d s . . . . . . . . . . . . . 8 7

    1 0 . 5 O p t i o n o n f u t u r e s . . . . . . . . . . . . . . . . . 9 1

    1 0 . 6 F o r e i g n C u r r e n c y o p t i o n s . . . . . . . . . . . . . 9 2

    1 0 . 7 R e f e r e n c e s . . . . . . . . . . . . . . . . . . . . . 9 3

    1 1 F i n i t e D i e r e n c e s 9 4

    1 1 . 1 E x p l i c i t F i n i t e d i e r e n c e s . . . . . . . . . . . . . 9 4

    1 1 . 2 E u r o p e a n O p t i o n s . . . . . . . . . . . . . . . . . 9 4

    1 1 . 3 A m e r i c a n O p t i o n s . . . . . . . . . . . . . . . . . 9 6

    1 2 O p t i o n p r i c i n g b y s i m u l a t i o n 9 8

    1 2 . 1 S i m u l a t i n g l o g n o r m a l l y d i s t r i b u t e d r a n d o m v a r i -

    a b l e s . . . . . . . . . . . . . . . . . . . . . . . . 9 8

    1 2 . 2 P r i c i n g o f E u r o p e a n C a l l o p t i o n s . . . . . . . . . 9 8

    1 2 . 3 H e d g e p a r a m e t e r s . . . . . . . . . . . . . . . . . 9 9

    1 2 . 4 M o r e g e n e r a l p a y o s . F u n c t i o n p r o t o t y p e s . . . 1 0 2

    1 2 . 5 I m p r o v i n g t h e e c i e n c y i n s i m u l a t i o n . . . . . . 1 0 3

    1 2 . 5 . 1 C o n t r o l v a r i a t e s . . . . . . . . . . . . . . 1 0 3

    1 2 . 5 . 2 A n t i t h e t i c v a r i a t e s . . . . . . . . . . . . . 1 0 4

    1 2 . 5 . 3 E x a m p l e . . . . . . . . . . . . . . . . . . 1 0 6

    1 2 . 6 M o r e e x o t i c o p t i o n s . . . . . . . . . . . . . . . . 1 0 7

    1 3 A p p r o x i m a t i o n s 1 0 9

    1 3 . 1 A q u a d r a t i c a p p r o x i m a t i o n t o A m e r i c a n p r i c e s

    d u e t o B a r o n e A d e s i a n d W h a l e y . . . . . . . . . 1 0 9

    1 4 A v e r a g e , l o o k b a c k a n d o t h e r e x o t i c o p t i o n s 1 1 3

    1 4 . 1 B e r m u d a n o p t i o n s . . . . . . . . . . . . . . . . . 1 1 3

    1 4 . 2 A s i a n o p t i o n s . . . . . . . . . . . . . . . . . . . 1 1 6

    1 4 . 3 L o o k b a c k o p t i o n s . . . . . . . . . . . . . . . . . 1 1 7

    1 4 . 4 M o n t e C a r l o P r i c i n g o f o p t i o n s w h o s e p a y o d e -

    p e n d o n t h e w h o l e p r i c e p a t h . . . . . . . . . . . 1 1 9

    I

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    3/185

    1 4 . 4 . 1 G e n e r a t i n g a s e r i e s o f l o g n o r m a l l y d i s -

    t r i b u t e d v a r i a b l e s . . . . . . . . . . . . . 1 1 9

    1 4 . 5 C o n t r o l v a r i a t e . . . . . . . . . . . . . . . . . . 1 2 2

    1 5 A l t e r n a t i v e s t o t h e B l a c k S c h o l e s t y p e o p t i o n f o r -

    m u l a 1 2 4

    1 5 . 1 M e r t o n ' s J u m p d i u s i o n m o d e l . . . . . . . . . . 1 2 4

    1 6 U s i n g a l i b r a r y f o r m a t r i x a l g e b r a 1 2 6

    1 6 . 1 A n e x a m p l e m a t r i x c l a s s . . . . . . . . . . . . . 1 2 6

    1 6 . 2 F i n i t e D i e r e n c e s . . . . . . . . . . . . . . . . . 1 2 6

    1 6 . 3 E u r o p e a n O p t i o n s . . . . . . . . . . . . . . . . . 1 2 6

    1 6 . 4 A m e r i c a n O p t i o n s . . . . . . . . . . . . . . . . . 1 2 8

    1 7 T h e M e a n V a r i a n c e F r o n t i e r 1 3 0

    1 7 . 1 S e t u p . . . . . . . . . . . . . . . . . . . . . . . . 1 3 0

    1 7 . 2 T h e m i n i m u m v a r i a n c e f r o n t i e r . . . . . . . . . . 1 3 1

    1 7 . 3 C a l c u l a t i o n o f f r o n t i e r p o r t f o l i o s . . . . . . . . . 1 3 2

    1 7 . 4 T h e g l o b a l m i n i m u m v a r i a n c e p o r t f o l i o . . . . . 1 3 3

    1 7 . 5 E c i e n t p o r t f o l i o s . . . . . . . . . . . . . . . . . 1 3 4

    1 7 . 6 T h e z e r o b e t a p o r t f o l i o . . . . . . . . . . . . . . 1 3 5

    1 7 . 7 A l l o w i n g f o r a r i s k l e s s a s s e t . . . . . . . . . . . . 1 3 5

    1 7 . 8 E c i e n t s e t s w i t h r i s k f r e e a s s e t s . . . . . . . . . 1 3 6

    1 7 . 9 T h e S h a r p e R a t i o . . . . . . . . . . . . . . . . . 1 3 7

    1 7 . 1 0 S h o r t - s a l e c o n s t r a i n t s . . . . . . . . . . . . . . . 1 3 7

    1 8 P r i c i n g o f b o n d o p t i o n s , b a s i c m o d e l s 1 3 8

    1 8 . 1 B l a c k S c h o l e s b o n d o p t i o n p r i c i n g . . . . . . . . 1 3 8

    1 8 . 2 B i n o m i a l b o n d o p t i o n p r i c i n g . . . . . . . . . . . 1 4 0

    1 9 C r e d i t r i s k 1 4 2

    1 9 . 1 T h e M e r t o n M o d e l . . . . . . . . . . . . . . . . 1 4 2

    1 9 . 2 I s s u e s i n i m p l e m e n t a t i o n . . . . . . . . . . . . . 1 4 2

    2 0 T e r m S t r u c t u r e M o d e l s 1 4 4

    2 0 . 1 T h e N e l s o n S i e g e l t e r m s t r u c t u r e a p p r o x i m a t i o n 1 4 4

    2 0 . 2 B l i s s . . . . . . . . . . . . . . . . . . . . . . . . 1 4 4

    2 0 . 3 C u b i c s p l i n e . . . . . . . . . . . . . . . . . . . . . 1 4 7

    2 0 . 4 C o x I n g e r s o l l R o s s . . . . . . . . . . . . . . . . . 1 4 9

    2 0 . 5 V a s i c e k . . . . . . . . . . . . . . . . . . . . . . . 1 5 1

    2 1 B i n o m i a l T e r m S t r u c t u r e m o d e l s 1 5 4

    2 1 . 1 T h e R e n d l e m a n a n d B a r t t e r m o d e l . . . . . . . 1 5 4

    2 1 . 2 R e a d i n g s . . . . . . . . . . . . . . . . . . . . . . 1 5 4

    2 2 T e r m S t r u c t u r e D e r i v a t i v e s 1 5 7

    2 2 . 1 V a s i c e k b o n d o p t i o n p r i c i n g . . . . . . . . . . . 1 5 7

    A N o r m a l D i s t r i b u t i o n a p p r o x i m a t i o n s . 1 5 9

    A . 1 T h e n o r m a l d i s t r i b u t i o n f u n c t i o n . . . . . . . . . 1 5 9

    A . 2 T h e c u m u l a t i v e n o r m a l d i s t r i b u t i o n . . . . . . . 1 5 9

    A . 3 M u l t i v a r i a t e n o r m a l . . . . . . . . . . . . . . . . 1 5 9

    A . 4 C a l c u l a t i n g c u m u l a t i v e b i v a r i a t e n o r m a l p r o b a -

    b i l i t i e s . . . . . . . . . . . . . . . . . . . . . . . 1 6 0

    A . 5 S i m u l a t i n g r a n d o m n o r m a l n u m b e r s . . . . . . . 1 6 3

    A . 6 C u m u l a t i v e p r o b a b i l i t i e s f o r g e n e r a l m u l t i v a r i a t e

    d i s t r i b u t i o n s . . . . . . . . . . . . . . . . . . . . 1 6 3

    A . 7 R e f e r e n c e s . . . . . . . . . . . . . . . . . . . . . 1 6 3

    B C + + c o n c e p t s 1 6 5

    C S u m m a r i z i n g r o u t i n e n a m e s 1 6 6

    D I n s t a l l a t i o n 1 7 4

    D . 1 S o u r c e a v a i l a b i l i t y . . . . . . . . . . . . . . . . . 1 7 4

    E A c k n o w l e d g e m e n t s . 1 7 8

    P

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    4/185

    o o k d o n o l l o n o ( o m l n ( n n F ( l d o ( n n n

    d d l o m n n n D n n m m l o o n F l o m l z o n

    o ( l d n d k o o k o w k o z @ I W S P A o n n o m n E n d o n

    n d w o d l n n d w l l @ I W S V A o n l o l m D o l o n o o

    l l o o n f l k n d o l @ I W U Q A Y w o n @ I W U Q A l l n o n o

    m m l z o n o ( n n F ( l d o d n d ( d n o m n n n m n

    ( l d o m l d o m l d F o o k n n d d o o o o l o n o

    o n d n d n d o m l D l n m o o l o m n d l

    d F

    o j d n s n o n d n o f g o l m D n

    o o s d o n n d o o d o l l n o m l s n F s l

    o n d m l m n o n l n d n d n n F p o n o m l d m l

    o n l o l l l o o k m l m n o n o o l l o n d o n n F

    o o o o k o m l d o l D l o s l l l o n n d

    o n d o n l 0 n D n d s k n o l o d o l o l o o n F

    o m l m n l o m n o m l n s o o g

    + +

    F w d n k k n

    n o d o l d n o k o o d o m l n D n k d n o l

    l l o l d o l m F s o m n l n m o o m n D n d n o m

    D n n d o n d n d n d l n D M a t l a b o G a u s s @ x o

    o m n o n j k d F A n d o n k o m l m n o n n n d d

    l n F s n m n m l ( n n s o m o l z n o n k n o l d

    r e a l o m l n F d o F O R T R A N D n C D n d n o C

    + +

    F e l l m l l o m

    o o d d n g

    + +

    F s d o k n o l d m o o l l k M a t l a b o o d o d

    o o n n d o m l l o n D n d l l n d d o n o g

    + +

    n l l o l l o

    M a t l a b F

    m n n n o n n n o n m o D d n n d

    l n m o o l D o j d n m o m l s d o o n F

    n @ P H H S A o n m n l n d o n k o n d d o n o o n D m m o

    n F s l o d d d o o d d l o n o d o m l o n o o o m n g

    + +

    D n

    n m o o n m k o o m n d n m o o l o k n o ( n n

    n o g

    + +

    F e l l o n n m d o o n ( m o n s y G e x s g

    + +

    n d d D n

    o n n m n d n d d m l l F

    n m n o o n n d d n F m l o d n o ( n n

    o d o o m l d o n n d m l m n o n o o m o m l F f m n

    l o l o d n o ( n n o n o l n g

    + +

    D n d o o m n o n o

    n d n d o ( n n l o m k d o m l n n d m d n o o m F

    s n d o n m l m n o n s d o n o l n m o g

    + +

    d D s

    k n d n o o m o o l l n o d n m o o n n d

    m o d l z o n F l l l o l o n n r e a l o m l n l F p o m l

    s n l d m o n n m l o o c l a s s e s F

    n o o o k n n d l n o D o m n o o d l n F p o m o

    m l o o k o o r l l @ P H H T A n d w h o n l d @ P H H T A D s d

    n F n o o n o n m n l o m l o o o k F

    Q

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    5/185

    C h a p t e r 1

    O n C + + a n d p r o g r a m m i n g .

    s n s n o d g

    + +

    n d d o o n o m n n g

    + +

    F n o m n

    o m l n o o m m n n g

    + +

    D d n d o n o n o m o n o n d n d

    o o o k F l o o n l d o g

    + +

    D o n n o n o

    l n d n m n d o o o k F p o l l l n n g

    + +

    o o k n F s

    o n d v m n n d v j o @ I W W V A n l l n n o d o n o l n F o o o n

    l n o @ I W W U A F

    1 . 1 C o m p i l i n g a n d l i n k i n g

    o o m n g

    + +

    o n o ( ( l o m D n c o m p i l e d

    n o l o E l l n o n @ m n l n A n d l i n k e d l o m k o m l l

    o m F m n o d o n o m l n n d l n k n o m m o m D n d l

    d l n o d F

    1 . 2 T h e s t r u c t u r e o f a C + + p r o g r a m

    ( n o l z o g

    + +

    o n l d l n F i n m d l d

    o d D o l n d n o n F g

    + +

    l d n l o k D n o d

    n o D o o n n d n o n F

    1 . 2 . 1 T y p e s

    l l o k n o o k b o o l D i n t D l o n g D d o u b l e n d s t r i n g F

    r o m m l d ( n o n

    b o o l t h i s _ i s _ t r u e = t r u e ;

    i n t i = 0 ;

    l o n g j = 1 2 3 4 5 6 7 8 9 ;

    d o u b l e p i = 3 . 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 2 6 4 3 ;

    s t r i n g s ( " t h i s i s a s t r i n g " ) ;

    m o m o n o g

    + +

    o m o m n n d d o

    c l a s s e s D o m o l F

    1 . 2 . 2 O p e r a t i o n s

    o o m m o n m m l o o n n l d D d d o n D o n D

    m l l o n n d d o n X

    i n t i = 1 0 0 + 5 0 ;

    i n t j = 1 0 0 - 5 0 ;

    i n t n = 1 0 0 * 2 ;

    i n t m = 1 0 0 / 2 ;

    o o n d ( n d o l l o m m o n d D o n o s t r i n g F

    o o n n d ( n d o m m o o d l l F

    R

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    6/185

    I n c r e m e n t a n d d e c r e m e n t s n d d o n o o o n o m d d o n l o o n

    o n o n d F e n m l l l n o n n m n n n d d m n n l F

    n n o n l o o n m o n D n m o l n n X

    i n t i = 0 ;

    i = i + 1 ;

    i = i - 1 ;

    s n C + + o o n o n o n d

    i n t i = 0 ;

    i + + ;

    i - - ;

    l d o n o m n D n d l o n k o o n n o l l n D

    d o o m n n d o m o d o n F p o m l D l l l D o n d ( n

    d a t e l n o o n D o n d l l m l m o

    d a t e d ( 1 , 1 , 1 9 9 5 ) ;

    d + + ;

    o m n l l l n d n d n P j n W S F

    1 . 2 . 3 F u n c t i o n s a n d l i b r a r i e s

    s n d d o n o m m l o o n l n m o d d o n l o o n

    n o m d o n n F r o D n o o o l n D m l m n d

    n d l o n n o n @ m o o l l n n C o g

    + +

    A F n o n n l d d

    n l l i b r a r y o m n g

    + +

    n l l o n F n n o o o l n

    m d ( n d o o m l o n d F d ( n o n o m d m n

    o i n c l u d e m n F

    p o m l D m m l o o n o k n o n d o m n o n n o n d ( n d

    n m m l l c m a t h F s n g

    + +

    o m o n l l

    # i n c l u d e < c m a t h >

    c m a t h l l ( l l n m o n o n d ( n o n D m o n o n ( n d p o w ( x , n )

    l l xn D n d e x p ( r ) l l er F o l l o n o m m n l l a = 2 2n d b = e1 F

    # i n c l u d e < c m a t h >

    d o u b l e a = p o w ( 2 , 2 ) ;

    d o u b l e b = e x p ( 1 ) ;

    l l l a n d b l o R n d P F U I V P V I V P V F F F D l F

    1 . 2 . 4 T e m p l a t e s a n d l i b r a r i e s

    o l n o o n l l m d o n o n F e l o n l d d n n d d l n d

    D n d o n n d F m l l l o n d n m o

    v e c t o r < > D d ( n n D o o o l F

    # i n c l u d e < v e c t o r >

    v e c t o r < d o u b l e > M ( 2 ) ;

    M [ 0 ] = 1 . 0 ;

    M [ 1 ] = 2 . 0 ;

    M . p u s h _ b a c k ( 3 ) ;

    S

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    7/185

    m l d ( n n l m n o d o l

    M =123

    x o o m l F n ( d ( n n o m n

    v e c t o r < d o u b l e > M ( 2 ) ;

    d ( n d n o P l m n o d o u b l e D n o d d o ( l l l I n d

    P F n ( l l n d d d l m n d l F x o n m n

    M [ 0 ] = 1 . 0 ;

    l o n o m o o m m o m n o C o g

    + +

    o m n o l n F s n d n o

    z o D n o o n F M [ 0 ] l l m n r s t l m n o F

    l m n D

    M . p u s h _ b a c k ( 3 ) ;

    o l o o m m o n n z o n d ( n d F p u s h _ b a c k

    n d d o o n o n l m n o n o k o D n d n

    z o o n l m n F w o o m m n l n d o n o l l o o m m o

    l E z d o n ) F s n F O R T R A N o P a s c a l o l d l l o m m m l n

    o D n d o o l d n o n d o d l n F v e c t o r m l o g + +

    d o o m m n d o o o k k n n m n l o n F

    1 . 2 . 5 F l o w c o n t r o l

    o m n l m o n l l o n o o l o ) o o n o l D f o r

    o w h i l e o n F p o m l D o n o o n n m o n n o l l o n f o r l o o X

    f o r ( i n t i = 0 ; i < n ; i + + ) {

    s o m e _ o p e r a t i o n ( i ) ;

    } ;

    f o r m n F ( n l o n d o n @ i = 0 A F n

    m n l o n d o n @ < n A D o o n i < n n o l ( l l d D n 9 o n F l n m n m n @ i + + A D n o d o n o n F s n

    l o i n d o n n o n F l f o r m n F y n o

    o C 9 o n o n o l o l o f o r o n D n d n l m o

    m o l o d F s n l o m n d n o o k l l o o d n o d f o r

    m n D n d k o F

    1 . 2 . 6 I n p u t O u t p u t

    p o n o m o d o n n l n d o l o o l F s n n d o

    o o n d ( n d n o l o l D i o s t r e a m n d f s t r e a m F ( o n G o o

    n d d m n l n d o n d n G o o ( l F

    o o n d d o c o u t @ m n l A D o n l l d o o l l o X

    # i n c l u d e < i o s t r e a m >

    c o u t < < " T h i s i s a t e s t " < < e n d l ;

    o o ( l 4 t e s t . o u t 4 D o n l l d o o l l o X

    T

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    8/185

    # i n c l u d e < f s t r e a m >

    o f s t r e a m o u t f ;

    o u t f . o p e n ( " t e s t . o u t " ) ;

    o u t f < < " T h i s i s a t e s t " < < e n d l ;

    o u t f . c l e a r ( ) ;

    o u t f . c l o s e ( ) ;

    1 . 2 . 7 S p l i t t i n g u p a p r o g r a m

    e n n o n l o m n g

    + +

    l n o l F l l n n o n

    n l o n F o l l o d o m l m l o m D o n n

    C o d e 1 . 1 F

    o m d ( n n o n o m n m m l o o o n D p o w e r ( x , n ) l E

    l xn o d n xn = en ln( x ) F n o n n d o l l n d n ( S o o P F

    # i n c l u d e < o m > / / i n p u t o u t p u t o p e r a t i o n s # i n c l u d e < m > / / m a t h e m a t i c s l i b r a r y u s i n g n a m e s p a c e d ; / / t h e a b o v e i s p a r t o f t h e s t a n d a r d n a m e s p a c e

    d o u b l e o ( d o u b l e , d o u b l e n ) {

    / / d e n e a s i m p l e p o w e r f u n c t i o n

    d o u b l e = ( n * l o ( ) ) ;

    r e t u r n ;

    } ;

    i n t m n ( ) {

    f o r ( i n t n = 1 ; n < 6 ; n + + ) { o

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    9/185

    1 . 3 E x t e n d i n g t h e l a n g u a g e , t h e c l a s s c o n c e p t .

    y n o m j o d n o g

    + +

    l o o o m m n l n o m m l

    o n d l n n n d n d d ( n n n d d o o n o n d F

    l g

    + +

    l l d n o j o n d o m m n l n D n m o o k n

    o m m n d o n n o b j e c t s F e n o j o o d o o n

    o n d ( n d F r o o n n o j o n n m l F

    1 . 3 . 1 d a t e , a n e x a m p l e c l a s s

    g o n d o n o d F e d n ( d n n n m o F v l m

    o l o q o n l n d F I P P H H Q o m m o n o n d F r o D

    n l o n d n X 2 0 0 3 / 8 / 1 2 D 1 2 / 8 / 2 0 0 3 n d o o n D o n m o

    n I j n I W H H D n m o m o n n t n D n d d o m o n @ o

    x s o m m l l n k o A F

    r o D o m o o l n o m n o n o d n o l n D n o

    l o n d n o m D n d n o n n d o n X

    e o d l c s o n d l n n o c r o m n d n o d c

    e g

    + +

    o m m l l o d o c l a s s m o d o o n o d F

    l l o n l l l o o k o n d o n n l l d m l m n d D l l o

    l d l n m l o o o n n l F

    e l d ( n d n d ( l D o n n o d I F P F e n m o n o n o n F e

    n n l n o n o d o n n d a y _ D m o n t h _ n d y e a r _ F d

    n m n l d o n o n d ( n d l o F

    n o n d o

    g d l X d a t e ( c o n s t i n t & d , c o n s t i n t & m , c o n s t i n t & y ) ; p n o n o n d n n o n d a y ( ) D m o n t h ( ) n d y e a r ( ) F p n o n n d s e t _ d a y ( i n t ) D s e t _ m o n t h ( i n t ) n d s e t _ y e a r ( i n t ) D d

    o d n n n m n o n o n F

    s n m n n d d m n n o n + + n d g o m o n n o n < D < = D > D > = D = = n d ! - F

    e n l d n d ( l D o m m n l l l n n o j o d a t e

    j l k n o F

    p o m l D

    d a t e d ( 1 , 1 , 2 0 0 1 ) ;

    + + d ;

    o l d l n d a t e o j d o n n n d P j n P H H I F

    e n g

    + +

    o m m o n o d a t e o j l l o n l n d o l o o k d ( l o k n o

    o l n o n o n n d a t e o j D n d o n o n d n o k n o

    n n o o n o n m l m n d F n l o n o o j o n d

    o m m n D l l l n n o m o n o d a t e o j ( d d ( l F

    o n l o n o n o n D l l d l o m l m n o n o l o j n d n o n n o

    d n o d n o j F

    V

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    10/185

    c l a s s d {

    p r o t e c t e d :

    i n t ;

    i n t m o n ;

    i n t d ;

    p u b l i c :

    d ( ) ;

    d ( c o n s t i n t & d , c o n s t i n t & m , c o n s t i n t & ) ;

    b o o l l d ( ) c o n s t ;

    i n t d ( ) c o n s t ;

    i n t m o n ( ) c o n s t ;

    i n t ( ) c o n s t ;

    v o i d d ( c o n s t i n t & d ) ;

    v o i d m o n ( c o n s t i n t & m o n ) ;

    v o i d ( c o n s t i n t & ) ;

    d o p e r a t o r + + ( ) ; / / p r e x

    d o p e r a t o r + + ( i n t ) ; / / p o s t x

    d o p e r a t o r ( ) ; / / p r e x d o p e r a t o r ( i n t ) ; / / p o s t x

    } ;

    b o o l o p e r a t o r = = ( c o n s t d & , c o n s t d & ) ; / / c o m p a r i s o n o p e r a t o r s

    b o o l o p e r a t o r ! = ( c o n s t d & , c o n s t d & ) ;

    b o o l o p e r a t o r < ( c o n s t d & , c o n s t d & ) ; b o o l o p e r a t o r > ( c o n s t d & , c o n s t d & ) ; b o o l o p e r a t o r < = ( c o n s t d & , c o n s t d & ) ; b o o l o p e r a t o r > = ( c o n s t d & , c o n s t d & ) ;

    C

    + +

    C o d e 1 . 2 : h ( n n d a t e l

    v l o o k m l m n o n o F

    C o d e 1 . 3 d ( n o o n D n l z o n D n d D n d k n d

    l d F

    W

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    11/185

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    12/185

    p o m n n o l o d ( n n o d n F p o d n l o d n F

    C o d e 1 . 4 o o o m o n o o n d ( n d F

    # i n c l u d e " d a t e . h "

    b o o l o p e r a t o r = = ( c o n s t d & d I , c o n s t d & d P ) { / / c h e c k f o r e q u a l i t y

    i f ( ! ( d I . l d ( ) & & ( d P . l d ( ) ) ) ) { r e t u r n f a l s e ; } ; / * i f d a t e s n o t v a l i d , n o t c l e a r w h a t t o d o .

    a l t e r n a t i v e : t h r o w e x c e p t i o n * /

    r e t u r n ( ( d I . d ( ) = = d P . d ( ) ) & & ( d I . m o n ( ) = = d P . m o n ( ) ) & & ( d I . ( ) = = d P . ( ) ) ) ;

    } ;

    b o o l o p e r a t o r < ( c o n s t d & d I , c o n s t d & d P ) { i f ( ! ( d I . l d ( ) & & ( d P . l d ( ) ) ) ) { r e t u r n f a l s e ; } ; / / s e e a b o v e r e m a r k

    i f ( d I . ( ) = = d P . ( ) ) { / / s a m e y e a r

    i f ( d I . m o n ( ) = = d P . m o n ( ) ) { / / s a m e m o n t h

    r e t u r n ( d I . d ( ) < d P . d ( ) ) ; }

    e l s e {

    r e t u r n ( d I . m o n ( ) < d P . m o n ( ) ) ; } ;

    }

    e l s e { / / d i e r e n t y e a r

    r e t u r n ( d I . ( ) < d P . ( ) ) ; } ;

    } ;

    / / r e m a i n i n g o p e r a t o r s d e n e d i n t e r m s o f t h e a b o v e

    b o o l o p e r a t o r < = ( c o n s t d & d I , c o n s t d & d P ) { i f ( d I = = d P ) { r e t u r n t r u e ; }

    r e t u r n ( d I < d P ) ; }

    b o o l o p e r a t o r > = ( c o n s t d & d I , c o n s t d & d P ) { i f ( d I = = d P ) { r e t u r n t r u e ; } ;

    r e t u r n ( d I > d P ) ; } ;

    b o o l o p e r a t o r > ( c o n s t d & d I , c o n s t d & d P ) { r e t u r n ! ( d I < = d P ) ; } ;

    b o o l o p e r a t o r ! = ( c o n s t d & d I , c o n s t d & d P ) { r e t u r n ! ( d I = = d P ) ; }

    C

    + +

    C o d e 1 . 4 : g o m o n o o o d l

    I I

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    13/185

    C o d e 1 . 5 o o o n o ( n d n o n d n d D l l d n i t e r a t i o n o o F

    # i n c l u d e " d a t e . h "

    d n d ( c o n s t

    d & d ) {

    i f ( ! d . l d ( ) ) { r e t u r n d ( ) ; } ; / /

    d n d = d ( ( d . d ( ) + 1 ) , d . m o n ( ) , d . ( ) ) ; / / r s t t r y a d d i n g a d a y

    i f ( n d . l d ( ) ) r e t u r n n d ;

    n d = d ( 1 , ( d . m o n ( ) + 1 ) , d . ( ) ) ; / / t h e n t r y a d d i n g a m o n t h

    i f ( n d . l d ( ) ) r e t u r n n d ;

    n d = d ( 1 , 1 , ( d . ( ) + 1 ) ) ; / / m u s t b e n e x t y e a r

    r e t u r n n d ;

    }

    d o d ( c o n s t d & d ) {

    i f ( ! d . l d ( ) ) { r e t u r n d ( ) ; } ; / / r e t u r n t h e d e f a u l t d a t e

    d d = d ( ( d . d ( ) 1 ) , d . m o n ( ) , d . ( ) ) ; i f ( d . l d ( ) ) r e t u r n d ; / / t r y s a m e m o n t h d = d ( 3 1 , ( d . m o n ( ) 1 ) , d . ( ) ) ; i f ( d . l d ( ) ) r e t u r n d ; / / t r y p r e v i o u s m o n t h d = d ( 3 0 , ( d . m o n ( ) 1 ) , d . ( ) ) ; i f ( d . l d ( ) ) r e t u r n d ; d = d ( 2 9 , ( d . m o n ( ) 1 ) , d . ( ) ) ; i f ( d . l d ( ) ) r e t u r n d ; d = d ( 2 8 , ( d . m o n ( ) 1 ) , d . ( ) ) ; i f ( d . l d ( ) ) r e t u r n d ; d = d ( 3 1 , 1 2 , ( d . ( ) 1 ) ) ; / / t r y p r e v i o u s y e a r

    r e t u r n d ;

    } ;

    d d X X o o + + ( i n t ) { / / p o s t x o p e r a t o r

    d d = * t h i s ;

    * t h i s = n d ( d ) ;

    r e t u r n d ;

    }

    d d X X o o + + ( ) { / / p r e x o p e r a t o r

    * t h i s = n d ( * t h i s ) ;

    r e t u r n * t h i s ;

    }

    d d X X o o ( i n t ) { / / p o s t x o p e r a t o r , r e t u r n c u r r e n t v a l u e d d = * t h i s ;

    * t h i s = o d ( * t h i s ) ;

    r e t u r n d ;

    }

    d d X X o o ( ) { / / p r e x o p e r a t o r , r e t u r n n e w v a l u e * t h i s = o d ( * t h i s ) ;

    r e t u r n * t h i s ;

    } ;

    C

    + +

    C o d e 1 . 5 : s o o o d l

    I P

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    14/185

    E x e r c i s e 1 .

    T h e f u n c t i o n v a l i d ( ) i n t h e d a t e c l a s s a c c e p t s f e b r u a r y 2 9 ' t h i n e v e r y y e a r , b u t t h i s s h o u l d i d e a l l y o n l y

    h a p p e n f o r l e a p y e a r s . M o d i f y t h e f u n c t i o n t o r e t u r n a f a l s e i f t h e y e a r i s n o t a l e a p y e a r .

    E x e r c i s e 2 .

    A t y p i c a l o p e r a t i n g s y s t e m h a s f u n c t i o n s f o r d e a l i n g w i t h d a t e s , w h i c h y o u r t y p i c a l C

    + +

    i m p l e m e n t a t i o n c a n

    c a l l . F i n d t h e r e l e v a n t f u n c t i o n s i n y o u r i m p l e m e n t a t i o n , a n d

    1 . I m p l e m e n t a f u n c t i o n q u e r y i n g t h e o p e r a t i n g s y s t e m f o r t h e c u r r e n t d a t e , a n d r e t u r n t h i s d a t e .

    2 . I m p l e m e n t a f u n c t i o n q u e r y i n g t h e o p e r a t i n g s y s t e m f o r t h e w e e k d a y o f a g i v e n d a t e , a n d r e t u r n a

    r e p r e s e n t a t i o n o f t h e w e e k d a y a s a m e m b e r o f t h e s e t :

    { " m o n " , " t u e " , " w e d " , " t h u " , " f r i " , " s a t " , " s u n " }

    3 . R e i m p l e m e n t t h e v a l i d ( ) f u n c t i o n u s i n g a s y s t e m c a l l .

    E x e r c i s e 3 .

    O n c e t h e d a t e c l a s s i s a v a i l a b l e , a n u m b e r o f o b v i o u s f u n c t i o n s b e g s t o b e i m p l e m e n t e d . H o w w o u l d y o u

    1 . A d d a g i v e n n u m b e r o f d a y s t o a d a t e ?

    2 . G o t o t h e e n d o r b e g i n n i n g o f a m o n t h ?

    3 . F i n d t h e d i s t a n c e b e t w e n t w o d a t e s ( i n d a y s o r i n y e a r s ) ?

    4 . E x t r a c t a d a t e f r o m a s t r i n g ? ( H e r e o n e n e e d t o m a k e s o m e a s s u m p t i o n s a b o u t t h e f o r m a t )

    I Q

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    15/185

    1 . 4 C o n s t r e f e r e n c e s

    v n o d o n o m o n l n F g o n d o l n l l o n o n D

    d ( n d n o n l l X

    s o m e _ f u n c t i o n ( d o u b l e r ) ;

    s o m e _ f u n c t i o n ( c o n s t d o u b l e & r ) ;

    o l l d n m n d o l D n d m n n d o n o

    n d n l l n n o n D o k d ' n l F s n ( o o l

    n d o n m n d o n n o n D n o n d o n

    m l D m n r e f e r e n c e o l o o n o l F l m o 0 n D

    n l n m n l l F r o D o n o l d o

    n d n n o n D n m o o n d o n o n F o c o n s t l ( D

    n o n n n o m o d m n F o m l l l n o m m n m

    m d o m o d l F

    p o 0 n D n m o o o l l o n o n m n o n o n n n F

    1 . 5 O t h e r C

    + +

    c o n c e p t s

    e n m o o g

    + +

    o n D n o n o o n d m l D l l n o d d l n

    l o n F o n l n l n d n o d d d F

    I R

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    16/185

    C h a p t e r 2

    M a t r i x T o o l s

    f n o m l n l n o n m o o m o o l n d n l o o o

    m o l o o l o o l m n d F o m n o l n o n d D n d n o ( n

    o l m o o m o o l k n o F o o l o n t h e o o l o n o o l d n

    d l k E x c e l F r o D n o o o l o m o o m o n l l n n k F

    l l k o n o o k o n n l g

    + +

    D n m n l o n n ( n n

    n d o o l l n o m n l n o n d m n l n l F l o

    o d ' n o l o m m l l D n k n o m m m l

    o m l o n o l n l F e n l o o l o o m a t l a b D l n m o o m

    o n m o n o o m F e l o o l o n o o m

    m l n o m l d o n m l n l F q n l o o l n l d o m m l o n o m a t l a b

    o l d w o k D l d o m n o m o c t a v e n d s c i l a b F o o l m l D m o

    d o d o n o m D n l d S l d o m n l o n R D q n d y F e o

    o m o n l l D n o n F p o l n n o o o o l o k D n o

    m n o n d k l l d o j o F p o d n o n l m d d l d o m n o o l o c t a v e

    n d s c i l a b o o n d d F f o o m o m o o n d o n o m m l

    m l k D n d o o d o l n n o m o o l F

    s n o s l l n n o d o n o o o l l k F

    2 . 1 T h e r s t s c r e e n

    o o l n D n o o m D n d o o n o m m n d F

    s l l d n o

    >

    o m D m n o m d o o m m n d F s n o o

    m o o l l l o n n X

    > A = [ 1 , 2 , 3 ; 4 , 5 , 6 ]

    l o m m n d d ( n m A D m o o l l l o n d o o m m n d n n

    m j d ( n d X

    A =

    1 2 3

    4 5 6

    I S

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    17/185

    C h a p t e r 3

    T h e v a l u e o f t i m e

    p n n ( l d o d o m m o m ) n l d o d l l o o n X

    t i m e n d r i s k F l n o o l o D d l o n F o

    l n F o d o n n o n k n d o n l o n d n m l o n

    o n o d o o m n l n l D o l o m F

    3 . 1 P r e s e n t v a l u e

    n l n l o m o m n F v C t ) o m t F o N ) o o m t1 , t2 , , t N F

    E0 t 1 t 2 t N

    C 1 C 2 C N

    m

    o ( n d p r e s e n t l o ) o o n n d o o ) o F o

    dt o n o l d o d o o o n d o l l d t F l o l l d d i s c o u n t f a c t o r F o o m l m l l d ' d n d n o n

    k n o ) o F p o n o o n n o n o n l o D o

    r i s k l e s s ) o F l l n o o o n o l d d j o k ) o F

    s o n k n o o o l m o o n d o l l D d1 , d2 , . . . , D o n o l d l l n l m o n l o d ' n l m n F

    P V =N

    i =1

    dt i C t i

    E0 t 1 t 2 t N

    C t 1 C t 2 C t N

    m

    'dt 1 C t 1'

    dt 2 C t 2

    'dt N C t N

    r o D k n o n o n o ) o l l d n o l l D n d

    o m o o n d o m l d n d n n n n l n l l l o n F

    3 . 2 O n e i n t e r e s t r a t e w i t h a n n u a l c o m p o u n d i n g

    k n o n o m l n l l l o n o d o n o n m

    o n D o l d D o l o n X

    dt =1

    (1 + r t ) t

    I T

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    18/185

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    19/185

    E x e r c i s e 6 .

    A n n u i t y [ 5 ]

    A n a n n u i t y i s a s e q u e n c e o f c a s h o w s f o r a g i v e n n u m b e r o f y e a r s , s a y T p e r i o d s i n t o t h e f u t u r e . C o n s i d e r a n a n n u i t y p a y i n g a x e d a m o u n t X e a c h p e r i o d . T h e i n t e r e s t r a t e i s r .

    1 . S h o w t h a t t h e p r e s e n t v a l u e o f t h i s s e q u e n c e o f c a s h o w s c a n b e s i m p l i e d a s

    P V =T

    t =1

    X (1 + r )t

    = X 1r

    1r

    1(1 + r )T

    E x e r c i s e 7 .

    G r o w i n g A n n u i t y [ 6 ]

    A n g r o w i n g a n n u i t y i s a s e q u e n c e o f c a s h o w s f o r a g i v e n n u m b e r o f y e a r s , s a y T p e r i o d s i n t o t h e f u t u r e , w h e r e e a c h p a y m e n t g r o w s b y a g i v e n f a c t o r e a c h y e a r . W e C o n s i d e r a T - p e r i o d a n n u i t y t h a t p a y s X t h e r s t p e r i o d . A f t e r t h a t , t h e p a y m e n t s g r o w s a t a r a t e o f g p e r y e a r , i . e . t h e s e c o n d y e a r t h e c a s h o w i s X (1 + g) , t h e t h i r d X (1 + g)2 , a n d s o o n .

    1 . S h o w t h a t t h e p r e s e n t v a l u e o f t h i s g r o w i n g a n n u i t y c a n b e s i m p l i e d a s

    P V =T

    t =1

    X (1 + g)( t 1)(1 + r )t

    = X 1

    r g 1 + g1 + r

    T 1r g

    E x e r c i s e 8 .

    R a n k t h e f o l l o w i n g c a s h o w s i n t e r m s o f p r e s e n t v a l u e . U s e a n i n t e r e s t r a t e o f 5 % .

    1 . A p e r p e t u i t y w i t h a n a n n u a l p a y m e n t o f $ 1 0 0 .

    2 . A g r o w i n g p e r p e t u i t y , w h e r e t h e r s t p a y m e n t i s $ 7 5 , a n d e a c h s u b s e q u e n t p a y m e n t g r o w s b y 2 % .

    3 . A 1 0 - y e a r a n n u i t y w i t h a n a n n u a l p a y m e n t o f $ 9 0 .

    4 . A 1 0 y e a r g r o w i n g a n n u i t y , w h e r e t h e r s t p a y m e t i s $ 8 5 , a n d e a c h s u b s e q u e n t p a y m e n t g r o w s b y 5 % .

    3 . 2 . 1 I n t e r n a l r a t e o f r e t u r n .

    s n d d o n o o l n m l n n l l l o n D n o m F

    n n o n n n m n m m m o n m n 9 o ( l F n

    n n m n n I H 7 o o d o m m z n ) o n d o

    n o d n d o n m o n o n l n m n F n l m o o ( l F

    o m n o o ) o l l i n t e r n a l r a t e o f r e t u r n F n n l o

    n o o ) o n m k n l o ) o l o

    z o F

    o ) o C 0 , C 1 , C 2 , . . . C T F p n d n n n n l o n o ( n d o l o n y o o n

    T

    t =1

    C t(1 + y) t C 0 = 0

    x o o l n o m l o n D n d T o m l D n n o o ( n d n l o l o n o o n F s o n d o o l d n m l l F p o l l l l d

    ) o D k n o o n s D m o d m l m n d n o d Q F P l D

    n o l l d o n F s n d o n o k n o d d n @ D

    k o l k D l n D n d p l n n D I W W P D g W A D

    I V

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    20/185

    # i n c l u d e < m ># i n c l u d e < l o m ># i n c l u d e < o >u s i n g n a m e s p a c e d ;

    # i n c l u d e " f i n _ r e c i p e s . h "

    c o n s t d o u b l e i y = 1 e 3 0 ;

    d o u b l e ) o d ( c o n s t o < d o u b l e > & ) o m , c o n s t o < d o u b l e > & ) o m o n ) {

    / / s i m p l e m i n d e d i r r f u n c t i o n . W i l l n d o n e r o o t ( i f i t e x i s t s . )

    / / a d a p t e d f r o m r o u t i n e i n N u m e r i c a l R e c i p e s i n C .

    i f ( ) o m . z ( ) ! = ) o m o n . z ( ) ) r e t u r n i y ;

    c o n s t d o u b l e e g g e g = 1 . 0 e 5 ; c o n s t i n t w e s i e s y x = 5 0 ;

    d o u b l e I = 0 . 0 ;

    d o u b l e P = 0 . 2 ;

    / / c r e a t e a n i n i t i a l b r a c k e t , w i t h a r o o t s o m e w h e r e b e t w e e n b o t , t o p

    d o u b l e I = ) o d ( ) o m , ) o m o n , I ) ;

    d o u b l e P = ) o d ( ) o m , ) o m o n , P ) ;

    i n t ;

    f o r ( = 0 ; < w e s i e s y x ; + + ) { i f ( ( I * P ) < 0 . 0 ) { b r e a k ; } ; / / i f ( ( I ) < ( P ) ) {

    I = ) o d ( ) o m , ) o m o n , I + = 1 . 6 * ( I P ) ) ; }

    e l s e {

    P = ) o d ( ) o m , ) o m o n , P + = 1 . 6 * ( P I ) ) ; } ;

    } ;

    i f ( P * I > 0 . 0 ) { r e t u r n i y ; } ; d o u b l e = ) o d ( ) o m , ) o m o n , I ) ;

    d o u b l e ;

    d o u b l e d = 0 ;

    i f ( < 0 . 0 ) { = I ;

    d = P I ; }

    e l s e {

    = P ;

    d = I P ; } ;

    f o r ( = 0 ; < w e s i e s y x ; + + ) { d * = 0 . 5 ;

    d o u b l e m d = + d ;

    d o u b l e m d = ) o d ( ) o m , ) o m o n , m d ) ;

    i f ( m d < = 0 . 0 ) { = m d ; } i f ( ( ( m d ) < e g g e g ) | | ( ( d ) < e g g e g ) ) r e t u r n m d ;

    } ;

    r e t u r n i y ; / / e r r o r .

    } ;

    C

    + +

    C o d e 3 . 2 : i m o n o n n l o n

    n n l d ( n d n n l o n l m o o ( l o

    o ) o D m d n D l l d n F x o o m o m l

    m o n m d F m m n l l l d @ F F )

    m A F s m o d l o m n m d ) o n d n n l

    o n F

    I W

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    21/185

    o o n d n n n m n o l l o n ) o d 0D 1 n d 2X

    C 0 = 100, C 1 = 10 , C 2 = 110I F o n n S 7 F h m n n l o ) o F

    P F p n d n n l o n o n o ) o F

    g

    + +

    o m X

    v o i d n l ( ) {

    o < d o u b l e > ) o ; ) o . k ( 1 0 0 . 0 ) ; ) o . k ( 1 0 . 0 ) ; ) o . k ( 1 1 0 . 0 ) ; o < d o u b l e > m ; m . k ( 0 . 0 ) ; m . k ( 1 ) ; m . k ( 2 ) ;

    d o u b l e = 0 . 0 5 ;

    o

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    22/185

    s n d d o n o o o n o m l ( o n o n o n o n n l o n D l o

    o d l n l o l m m m n o m n o l n o m l o n o n l l

    l o l o n D o m o m m n F

    2

    o l k l o o l m n

    d n n n l m n n l s D o d o n n o d Q F Q m l m n m l k F s o n l

    n o n d o n o n s D n o 0 n D o o m l l l l E d ( n d s n

    n l F ( j o o n n m o n n n ) o F p o m

    h l k n o n m o l o o o n o n l o n n n F s

    m o n o n n n n o ) o D n o n d k a g g r e g a t e d ) o

    o n n @ x o o m @ I W U P A A F

    # i n c l u d e < m ># i n c l u d e < o >u s i n g n a m e s p a c e d ;

    i n l i n e i n t n ( c o n s t d o u b l e & ) { i f ( > = 0 ) { r e t u r n 1 ; } e l s e { r e t u r n 1 ; } ; } ;

    b o o l ) o n ( c o n s t o < d o u b l e > & ) o m , c o n s t o < d o u b l e > & ) o m o n ) {

    i n t n n = 0 ; / / r s t c h e c k D e s c a r t e s r u l e

    f o r ( i n t = 1 ; < ) o m . z ( ) ; + + ) { i f ( n ( ) o m o n [ 1 ] ) ! = n ( ) o m o n [ ] ) ) n n + + ;

    } ;

    i f ( n n = = 0 ) r e t u r n f a l s e ; / / c a n n o t n d a n y i r r

    i f ( n n = = 1 ) r e t u r n t r u e ;

    d o u b l e e = ) o m o n [ 0 ] ; / / c h e c k t h e a g g r e g a t e c a s h o w s , d u e t o N o r s t r o m

    n n = 0 ;

    f o r ( i n t = 1 ; < ) o m . z ( ) ; + + ) { i f ( n ( e ) ! = n ( e + = ) o m o n [ ] ) ) n n + + ;

    } ;

    i f ( n n < = 1 ) r e t u r n t r u e ; r e t u r n f a l s e ;

    }

    C

    + +

    C o d e 3 . 3 : o n n o s

    e o n n n d n d n o l o n n n n d n l

    m l o l o n l n o n o n F o l l o n l l

    m o d o o d ' n ) o F x o o ) o o n l o o l n

    n l l o z o F

    C 0 = 100, C 1 = 10 , C 2 = 100 C 0 = 100, C 1 = 201 , C 2 = 1003 . 2 . 2 B o n d s

    e m l o n o n l l l o n n o o n d n d o ( d n o m F

    d n o n d m n n d F m l D

    2

    f m n m n m o o m l l n o o o m l n m F

    P I

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    23/185

    n d m o l o n d D ( d n D o n n m o n d n o d l k F o

    l n m o l n o n l o o n d F o n d o l d o m l n n n

    o n d D n ( d m o n o d F p o o n d n l m o n o n d n d

    d l l d n l o o n d F n o n d n d n o ( d D o l d

    ) o n D n d o l d n o n o o m m k F w n o n d d

    o o o n D n d n k o m n d o n d d l D n d

    o n d d o n o o m l o m d m o n F e n o n m k o n d n d 0 l n

    D n n d o n o m F

    B o n d P r i c e

    o n d n ( d n o n d n o d l k F o n d l l o n d d

    o n m n F o n d o m o l F m d T o d o m n o F i o d o n d ( d n m o n o l o o n C F ) o

    o m o n d l o o k o l l o F

    t = 0 1 2 3 T g o o n C C C C p l F

    n o n d @ B0 A n l o ) o X

    B0 =T

    t =1

    C t(1 + r )t

    ,

    C t = C n t < T n d C T = C + F F l l o n o o n d d n n l o m o n d n o n n o d Q F R F

    # i n c l u d e < m ># i n c l u d e < o >u s i n g n a m e s p a c e d ;

    d o u b l e o n d d ( c o n s t o < d o u b l e > & m , c o n s t o < d o u b l e > & ) o , c o n s t d o u b l e & ) {

    d o u b l e = 0 ;

    f o r ( i n t = 0 ; < m . z ( ) ; + + ) { + = ) o [ ] / ( o ( ( 1 + ) , m [ ] ) ) ;

    } ;

    r e t u r n ;

    } ;

    C

    + +

    C o d e 3 . 4 : f o n d l l o n d D n n l o m o n d n F

    Y i e l d t o m a t u r i t y

    n o n d d n m o n D l o l o ( n d n n n m

    m m z m o o n d F o o o d o n k n o n X

    n n l o n o n n m n o n o n d n o n d k n o n d o m c

    n o o n l d o m o o n d F l d o m n

    m k n l o o o n m n l o n o n d D D o

    k n o n B0 D l d o l o n y o o n

    B0 =T

    t =1

    C t(1 + y) t

    @ Q F I A

    l l o n o m l ( o n d d l D o n m n o

    o o n o n d l d F m l l k l o o d 9 l l n l o l m m l l

    P P

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    24/185

    o l o n n d o n l d m o n o o n d D n o ) o l l

    o n l o n l o l o n o o n F l o m o ( n d n o n d l d o

    m o n n o d Q F S m l o n F k n o o n d l d o z o n d

    z o l o o n d o n o n d l d F n ( n d n o n d o n l d n n

    n n l o n d n n F n n l n

    n d l o n l l o n o F

    # i n c l u d e < m >u s i n g n a m e s p a c e d ;

    # i n c l u d e " f i n _ r e c i p e s . h "

    d o u b l e o n d l d o m d (

    c o n s t o < d o u b l e > & m ,

    c o n s t o < d o u b l e > & ) o , c o n s t d o u b l e & o n d ) {

    c o n s t d o u b l e e g g e g = 1 e 5 ; c o n s t i n t w e s i e s y x = 2 0 0 ;

    d o u b l e o = 0 , o = 1 . 0 ;

    w h i l e ( o n d d ( m , ) o , o ) > o n d ) { o = o * 2 ; } ; d o u b l e = 0 . 5 * ( o + o ) ;

    f o r ( i n t = 0 ; < w e s i e s y x ; + + ) { d o u b l e d ' = o n d d ( m , ) o , ) o n d ; i f ( ( d ' ) < e g g e g ) r e t u r n ; i f ( d ' > 0 . 0 ) { o = ; } e l s e { o = ; } ;

    = 0 . 5 * ( o + o ) ;

    } ;

    r e t u r n ;

    } ;

    C

    + +

    C o d e 3 . 5 : f o n d l d l l o n d D n n l o m o n d n

    e Q o n d l o 6 I H H m k n n l o o n m n o I H 7 F n n

    @ n n l o m o n d n A W 7 F

    I F p n d o n d 9 n F

    P F p n d o n d 9 l d o m F

    g

    + +

    o m X

    v o i d o n d d ( ) {

    o < d o u b l e > ) o ; ) o . k ( 1 0 ) ; ) o . k ( 1 0 ) ; ) o . k ( 1 1 0 ) ; o < d o u b l e > m ; m . k ( 1 ) ; m . k ( 2 ) ; m . k ( 3 ) ;

    d o u b l e = 0 . 0 9 ;

    d o u b l e f = o n d d ( m , ) o , ) ;

    o

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    25/185

    e n m o n o m o n n o l l o n d u r a t i o n o o n d F d o n o o n d o l d

    n d d m o o n d D n d l l d

    h o n =t t

    C t(1+ r ) t

    f o n d

    C t ) o n o d

    tD n d

    rn F n o n d l l d n

    o n Q F I l l d o n

    D =t

    tC t(1+ r ) t

    tC t

    (1+ r ) t@ Q F P A

    o n n o d Q F T

    # i n c l u d e < m ># i n c l u d e < o >u s i n g n a m e s p a c e d ;

    d o u b l e o n d d o n d ( c o n s t o < d o u b l e > & m , c o n s t o < d o u b l e > & ) o , c o n s t d o u b l e & ) {

    d o u b l e f = 0 ;

    d o u b l e h = 0 ;

    f o r (

    i n t = 0 ; < m . z ( ) ; + + ) {

    h + = m [ ] * ) o [ ] / o ( 1 + , m [ ] ) ;

    f + = ) o [ ] / o ( 1 + , m [ ] ) ;

    } ;

    r e t u r n h / f ;

    } ;

    C

    + +

    C o d e 3 . 6 : f o n d d o n n d D n n l o m o n d n n d ) m

    e n l n o o l l n d o n l l l d o m y o o n d D n d n m n o n d F l l d M a c a u l a y D u r a t i o n F p o n l l y D l d

    o m D o m

    f o n d =T

    t =1

    C t(1 + y)t

    n d n y n d o n l l o n X

    w l d o n =t

    tC t(1+ y ) t

    tC t

    (1+ y ) t@ Q F Q A

    g o d Q F U m l m n l l o n F

    # i n c l u d e " f i n _ r e c i p e s . h "

    d o u b l e o n d d o n m l d ( c o n s t o < d o u b l e > & m , c o n s t o < d o u b l e > & ) o , c o n s t d o u b l e & o n d ) {

    d o u b l e = o n d l d o m d ( m , ) o , o n d ) ;

    r e t u r n o n d d o n d ( m , ) o , ) ; / / u s e Y T M i n d u r a t i o n c a l c u l a t i o n

    } ;

    C

    + +

    C o d e 3 . 7 : g l l n w l d o n o o n d

    x o o D n n D ) m D o l d o d m n m F

    s o n d d o l D l d o m m l n n F s r = y o l l o n n o n A Q F P A n d @ Q F Q A o o l o d m n m F

    P R

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    26/185

    3 . 2 . 3 M e a s u r i n g b o n d s e n s i t i v i t y t o i n t e r e s t r a t e c h a n g e s

    x o D o n o n m n o o n d n d o n F o

    ( o m o n D B0 D n n o n d o m l l n n n r D n l l d

    B0B0

    D1 + r r

    D o n d 9 d o n F p o m l o n o n l l m n o n o y n o D

    D1+ y d l n d m o n d 9 m o d i e d d u r a t i o n F

    w o d ( d h o n = D=D

    1 + r

    n l l o n n

    B0B0 D r

    m o d ( d d o n l o n n m 9 o o n d 9 l d o m y D n d n

    D=D

    1 + y

    g o d Q F V o l l o n F

    # i n c l u d e < o >u s i n g n a m e s p a c e d ;

    # i n c l u d e " f i n _ r e c i p e s . h "

    d o u b l e o n d d o n m o d ( d d ( c o n s t o < d o u b l e > & m , c o n s t o < d o u b l e > & ) o , c o n s t d o u b l e & o n d ) {

    d o u b l e = o n d l d o m d ( m , ) o , o n d ) ;

    d o u b l e h = o n d d o n d ( m , ) o , ) ;

    r e t u r n h / ( 1 + ) ;

    } ;

    C

    + +

    C o d e 3 . 8 : w o d ( d d o n

    e o m n o n d n n d o n l l d n o l l o n ( F

    E

    T

    d d d

    d d

    d d

    d d

    d d

    d

    o n d

    l d

    h o n m

    n l o n n F '

    m o d ( d d o n m n l o n n n o n d l d F e o m n

    n n o n d d o n o n l ( o d o m o n F o m o o n

    P S

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    27/185

    o m o n l o n d o o n o n l o n n o n d n d

    n F o n l l c o n v e x i t y o o n d F

    g o n = Cx =1

    B01

    (1 + r )2

    T

    t =1(t + t2)

    C t(1 + r ) t

    @ Q F R A

    l l o n m l m n d n o d Q F W F F o m o o n m o o o n d n

    # i n c l u d e < m ># i n c l u d e " f i n _ r e c i p e s . h "

    d o u b l e o n d o n d ( c o n s t o < d o u b l e > & m , c o n s t o < d o u b l e > & ) o , c o n s t d o u b l e & ) {

    d o u b l e g = 0 ;

    f o r ( i n t = 0 ; < m . z ( ) ; + + ) { g + = ) o [ ] * m [ ] * ( m [ ] + 1 ) / ( o ( ( 1 + ) , m [ ] ) ) ;

    } ;

    d o u b l e f = o n d d ( m , ) o , ) ;

    r e t u r n ( g / ( o ( 1 + , 2 ) ) ) / f ;

    } ;

    C

    + +

    C o d e 3 . 9 : f o n d o n ) m n d n n l o m o n d n

    n n n o l l n l l

    B0B0 D y +

    12

    Cx ( y)2

    p o m l Q F I m m z o l l o n F

    E x e r c i s e 9 .

    P e r p e t u a l d u r a t i o n [ 4 ]

    T h e t e r m s t r u c t u r e i s a t . C o n s i d e r t h e p r i c i n g o f a p e r p e t u a l b o n d . L e t

    C b e t h e p e r p e r i o d c a s h o w

    B0 =

    t =1

    C (1 + r )t

    =C r

    1 . D e t e r m i n e t h e r s t d e r i v a t i v e o f t h e p r i c e w i t h r e s p e c t t o t h e i n t e r e s t r a t e .

    2 . F i n d t h e d u r a t i o n o f t h e b o n d .

    E x e r c i s e 1 0 .

    C o n s i d e r a n e q u a l l y w e i g h t e d p o r t f o l i o o f t w o b o n d s , A a n d B . B o n d A i s a z e r o c o u p o n b o n d w i t h 1 y e a r t o

    m a t u r i t y . B o n d B i s a z e r o c o u p o n b o n d w i t h 3 y e a r s t o m a t u r i t y . B o t h b o n d s h a v e f a c e v a l u e s o f 1 0 0 . T h e

    c u r r e n t i n t e r e s t r a t e i s 5 % .

    1 . D e t e r m i n e t h e b o n d p r i c e s .

    2 . Y o u r p o r t f o l i o i s c u r r e n t l y w o r t h 2 0 0 0 . F i n d t h e n u m b e r o f e a c h b o n d i n v e s t e d .

    3 . D e t e r m i n e t h e d u r a t i o n o f t h e p o r t f o l i o .

    4 . D e t e r m i n e t h e c o n v e x i t y o f y o u r p o s i t i o n .

    P T

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    28/185

    f o n d (B0 A

    B0 =T

    t =1

    C t(1 + r )t

    l d o m y o l

    B0 =T

    t =1

    C t(1 + y) t

    h o n (D )

    D =1

    B0

    T

    t =1

    tC t(1 + r )t

    w l d o n

    D =1

    B0

    T

    t =1

    tC t(1 + y) t

    w o d ( d d o n

    D=D

    1 + yg o n (Cx )

    Cx =1

    B01

    (1 + r )2

    T

    t =1(t + t2)

    C t(1 + r ) t

    e o m n o n d n

    B0B0 D y

    B0B

    0 D y +

    12

    Cx

    ( y)2

    C t : C a s h o w a t t i m e t , r : i n t e r e s t r a t e , y : b o n d y i e l d t o m a t u r i t y , B 0 : c u r r e n t b o n d p r i c e . B o n d p a y s c o u p o n a t e v e n l y s p a c e d d a t e s t = 1 , 2, 3 . . . , T .

    F o r m u l a 3 . 1 : f o n d n o m l ) m n d d D n n l o m o n d n

    P U

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    29/185

    e Q o n d l o 6 I H H m k n n l o o n m n o I H 7 F n n

    @ n n l o m o n d n A W 7 F

    I F h m n n o n d F

    P F o n n o I H 7 D d m n n o o n d d l l o n F

    Q F s n d o d l l o n D d o n o m n n d o m o o

    F

    R F o n o m o o n o m o n n d o n F

    o l n o

    I F o n d X

    B0 =10

    (1 + 0 .09)1+

    10(1 + 0 .09)2

    +110

    (1 + 0 .09)3= 102 .531

    P F s n n o I H 7 D o n d l l l l n D l o I H H D n

    o n ( m d d o m o n X

    B0 =10

    (1 + 0 .1)1+

    10(1 + 0 .1)2

    +110

    (1 + 0 .1)3= 100

    Q F g l l o n d 9 d o n X

    D =1

    102.5311 101.09

    +2 101.092

    +3 1101.093

    = 2 .74

    w o d ( d d o n X

    D=D

    1 + r=

    2.741.09

    = 2 .51

    v n o l l n n o n d

    B0B0

    = D y = 2.51 0.01 = 0.0251 m n o n d n o X

    B0 + B0 = 102 .531 + B0B0

    B0 = 102 .531 0.0251 102.531 = 99.957

    R F g l l o n d 9 o n

    Cx =1

    (1 + 0 .09)21

    102.531(1 + 1) 10

    1.09+

    (22 + 2) 101.092

    +(3 + 3 2) 110

    1.093= 8 .93

    l l n n n o n d n o n X

    B0B0

    = D y +12

    C x y2 = 2.51 0.01 +12

    8.93(0.01)2 = 0.0251 + 0 .00044 = 0.02465 o E m o n d X

    B0 + B0 = 102 .531 1 + B0B0

    B0 = 102 .531(1 0.02465) = 100 .0036

    w o o m l l o n o n l o X

    g

    + +

    o m X

    v o i d o n d d o n d ( ) {

    o < d o u b l e > ) o ; ) o . k ( 1 0 ) ; ) o . k ( 1 0 ) ; ) o . k ( 1 1 0 ) ; o < d o u b l e > m ; m . k ( 1 ) ; m . k ( 2 ) ; m . k ( 3 ) ;

    d o u b l e = 0 . 0 9 ;

    d o u b l e f = o n d d ( m , ) o , ) ;

    P V

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    30/185

    3 . 3 C o n t i n o u s l y c o m p o u n d e d i n t e r e s t

    d o m o n d n j d d n o o n l l n o o m

    d o n o F d l o m o n d d m n d d d d o n n m

    @ n n m A F r o D n l n m o n o m n d d d o n n o l F

    s o m o n d n o n n o D n d r n D o n o l d l l n o n o n d o l l d t

    P t = ert ,

    p o m l Q F P m m z o m l o n l n n o n n o l o m o n d d n d d l o m E

    o n d d n F

    r = n ln 1 +r nn

    r n = n ern 1

    p l = ert

    n l = ert

    N o t a t i o n : r n : i n t e r e s t r a t e w i t h d i s c r e t e c o m p o u n d i n g , n : c o m p o u n d i n g p e r i o d s p e r y e a r . r : i n t e r e s t r a t e w i t h c o n t i n u o u s c o m p o u n d i n g , t : t i m e t o m a t u r i t y .

    F o r m u l a 3 . 2 : n l n n d n d o n n o o m o n d n

    3 . 3 . 1 P r e s e n t v a l u e

    e l n o o ) o d t1 , t 2 , . . . , t n D o l l o n n l l l o n X

    P V =n

    i =1

    ert i C t i

    l l o n m l m n d o n n o d Q F I H F

    # i n c l u d e < m ># i n c l u d e < o >u s i n g n a m e s p a c e d ;

    d o u b l e ) o ( c o n s t o < d o u b l e > & ) o m , c o n s t o < d o u b l e > & ) o m o n , c o n s t d o u b l e & ) {

    d o u b l e = 0 . 0 ;

    f o r ( i n t = 0 ;

    # i n c l u d e < m >u s i n g n a m e s p a c e d ;

    m l ) X X m l ) ( c o n s t d o u b l e & ) { = ; } ;

    m l ) X X m l ) ( ) { } ;

    d o u b l e m l ) X X l d ( c o n s t d o u b l e & ) c o n s t { i f ( > = 0 ) r e t u r n ; r e t u r n 0 ; } ;

    / *

    d o u b l e t e r m s t r u c t u r e c l a s s a t : : d i s c o u n t f a c t o r ( c o n s t d o u b l e & T ) c o n s t {

    i f ( T > = 0 . 0 ) { r e t u r n e x p ( - R * T ) ; } ; r e t u r n 0 ; } ;

    d o u b l e t e r m s t r u c t u r e c l a s s a t : : f o r w a r d r a t e ( c o n s t d o u b l e & t 1 , c o n s t d o u b l e & t 2 ) c o n s t {

    d o u b l e d 1 = d i s c o u n t f a c t o r ( t 1 ) ;

    d o u b l e d 2 = d i s c o u n t f a c t o r ( t 2 ) ;

    r e t u r n t e r m s t r u c t u r e f o r w a r d r a t e f r o m d i s c o u n t f a c t o r s ( d 1 , d 2 , t 2 - t 1 ) ;

    } ;

    * /

    v o i d m l ) X X n ( c o n s t d o u b l e & ) { = ; } ;

    C

    + +

    C o d e 4 . 5 : s m l m n n m l n ) m

    Q V

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    40/185

    g

    + +

    o m X

    v o i d m l ) ( ) {

    m l ) ( 0 . 0 5 ) ;

    d o u b l e I = 1 ;

    o

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    41/185

    4 . 3 U s i n g t h e c u r r e n t l y o b s e r v e d t e r m s t r u c t u r e .

    o j o d m D n d o k o o n o l d o d n

    m k n d o n m F m l o l o d o n o l n l

    n o l n l o l z o o o n l d F

    4 . 3 . 1 L i n e a r I n t e r p o l a t i o n .

    s n o l d o o m D m l o o n m

    o d l n n o l o n n o o n o ( n d n n m d m F

    p o m n o o o d n o F n o l o n n o n l d D d o n o o

    o d D l l o l n n o l o n o o F

    C o m p u t e r a l g o r i t h m , l i n e a r i n t e r p o l a t i o n o f y i e l d s . x o l o m m l d

    o d d n n n o d o m o m F

    # i n c l u d e < o >u s i n g n a m e s p a c e d ;

    # i n c l u d e " f i n _ r e c i p e s . h "

    d o u b l e m l d l n l n o l d ( c o n s t d o u b l e & m ,

    c o n s t o < d o u b l e > & o m , c o n s t o < d o u b l e > & o l d ) {

    / / a s s u m e t h e y i e l d s a r e i n i n c r e a s i n g t i m e t o m a t u r i t y o r d e r .

    i n t n o o = o m . z ( ) ;

    i f ( n o o < 1 ) r e t u r n 0 ; d o u b l e m n = o m [ 0 ] ;

    i f ( m < = m n ) r e t u r n o l d [ 0 ] ; / / e a r l i e r t h a n l o w e s t o b s .

    d o u b l e m = o m [ n o o 1 ] ; i f ( m > = m ) r e t u r n o l d [ n o o 1 ] ; / / l a t e r t h a n l a t e s t o b s

    i n t = 1 ; / / n d w h i c h t w o o b s e r v a t i o n s w e a r e b e t w e e n

    w h i l e ( (

    o m [ ] ) ) { + + ; } ;

    d o u b l e l m d = ( o m [ ] m ) / ( o m [ ] o m [ 1 ] ) ; / / b y o r d e r i n g a s s u m p t i o n , t i m e i s b e t w e e n t - 1 , t

    d o u b l e = o l d [ 1 ] * l m d + o l d [ ] * ( 1 . 0 l m d ) ; r e t u r n ;

    } ;

    C

    + +

    C o d e 4 . 6 : s n o l d m o m o

    R H

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    42/185

    g

    + +

    o m X

    v o i d m n o l d ( ) {

    o < d o u b l e > m ; o < d o u b l e > l d ;

    m . k ( 0 . 1 ) ; m . k ( 0 . 5 ) ; m . k ( 1 ) ;

    l d . k ( 0 . 1 ) ; l d . k ( 0 . 2 ) ; l d . k ( 0 . 3 ) ;

    m . k ( 5 ) ; m . k ( 1 0 ) ;

    l d . k ( 0 . 4 ) ; l d . k ( 0 . 5 ) ;

    o

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    43/185

    4 . 3 . 2 I n t e r p o l a t e d t e r m s t r u c t u r e c l a s s .

    n o l d m m l m n d o o o n o l d D n d

    o o o n n n o o n l l n o l n o l o F o l l o n o n l

    o d m l m n o n o l l o n o l d D o o o l o n l o d F

    o m m o o o k E k n n o l d D n d o o d o o o n o m n d

    l d F

    # i f n d e f i w g i g v e s x i y v e i h

    # d e n e i w g i g v e s x i y v e i h

    # i n c l u d e " t e r m _ s t r u c t u r e _ c l a s s . h "

    # i n c l u d e < o >

    u s i n g n a m e s p a c e d ;

    c l a s s m l n o l d X p u b l i c m l {

    p r i v a t e :

    o < d o u b l e > m ; / / u s e t o k e e p a l i s t o f y i e l d s o < d o u b l e > l d ;

    v o i d l ( ) ;

    p u b l i c :

    m l n o l d ( ) ;

    m l n o l d ( c o n s t o < d o u b l e > & m , c o n s t o < d o u b l e > & l d ) ; v i r t u a l m l n o l d ( ) ;

    m l n o l d ( c o n s t m l n o l d & ) ;

    m l n o l d o p e r a t o r = ( c o n s t m l n o l d & ) ;

    i n t n o o o n ( ) c o n s t { r e t u r n m . z ( ) ; } ;

    v i r t u a l d o u b l e l d ( c o n s t d o u b l e & ) c o n s t ;

    v o i d n o l d o o n ( o < d o u b l e > & m , o < d o u b l e > & l d ) ;

    } ;

    # e n d i f

    C

    + +

    C o d e 4 . 7 : r d ( l d n m l n l n n o l o n n o

    R P

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    44/185

    # i n c l u d e " f i n _ r e c i p e s . h "

    v o i d m l n o l d X X l ( ) {

    m . ( m . n ( ) , m . n d ( ) ) ;

    l d . ( l d . n ( ) , l d . n d ( ) ) ;

    } ;

    m l n o l d X X m l n o l d ( ) X m l ( ) { l ( ) ; } ;

    m l n o l d X X m l n o l d ( c o n s t o < d o u b l e > & n m , c o n s t o < d o u b l e > & n l d ) {

    l ( ) ;

    i f ( n m . z ( ) ! = n l d . z ( ) ) r e t u r n ;

    m = o < d o u b l e > ( n m . z ( ) ) ; l d = o < d o u b l e > ( n l d . z ( ) ) ;

    f o r ( i n t = 0 ; < n m . z ( ) ; + + ) { m [ ] = n m [ ] ;

    l d [ ] = n l d [ ] ;

    } ;

    } ;

    m l n o l d X X m l n o l d ( ) { l ( ) ; } ;

    m l n o l d X X m l n o l d ( c o n s t m l n o l d & m ) {

    m = o < d o u b l e > ( m . n o o o n ( ) ) ; l d = o < d o u b l e > ( m . n o o o n ( ) ) ;

    f o r ( i n t = 0 ; < m . n o o o n ( ) ; + + ) { m [ ] = m . m [ ] ;

    l d [ ] = m . l d [ ] ;

    } ;

    } ;

    m l n o l d

    m l n o l d X X o o = ( c o n s t m l n o l d & m ) {

    m = o

    ( m . n o o o n ( ) ) ;

    l d = o < d o u b l e > ( m . n o o o n ( ) ) ; f o r ( i n t = 0 ; < m . n o o o n ( ) ; + + ) {

    m [ ] = m . m [ ] ;

    l d [ ] = m . l d [ ] ;

    } ;

    r e t u r n ( * t h i s ) ;

    } ;

    d o u b l e m l n o l d X X l d ( c o n s t d o u b l e & ) c o n s t {

    r e t u r n m l d l n l n o l d ( , m , l d ) ;

    } ;

    v o i d

    m l n o l d X X n o l d o o n ( o < d o u b l e > & n m , o < d o u b l e > & n l d ) {

    l ( ) ;

    i f ( n m . z ( ) ! = n l d . z ( ) ) r e t u r n ;

    m = o < d o u b l e > ( n m . z ( ) ) ; l d = o < d o u b l e > ( n l d . z ( ) ) ;

    f o r ( i n t = 0 ; < n m . z ( ) ; + + ) { m [ ] = n m [ ] ;

    l d [ ] = n l d [ ] ;

    } ;

    } ;

    C

    + +

    C o d e 4 . 8 : m l n l n n o l o n n o

    R Q

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    45/185

    g

    + +

    o m X

    v o i d m l n o l d ( ) {

    o < d o u b l e > m ; m . k ( 0 . 1 ) ; o < d o u b l e > o ; o . k ( 0 . 0 5 ) ;

    m . k ( 1 ) ; m . k ( 5 ) ;

    o . k ( 0 . 0 7 ) ; o . k ( 0 . 0 8 ) ;

    m l n o l d ( m , o ) ;

    d o u b l e I = 1 ;

    o

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    46/185

    4 . 4 B o n d c a l c u l a t i o n s w i t h a g e n e r a l t e r m s t r u c t u r e a n d c o n t i n o u s c o m -

    p o u n d i n g

    B o n d p r i c i n g w i t h a c o n t i n o u s l y c o m p o u n d e d t e r m s t r u c t u r e

    C o u p o n b o n d p a y i n g c o u p o n s a t d a t e s t 1 , t 2 , . . . X f o n d

    B0X

    B0 =i

    dt i C t i =i

    er t i t i C t i

    h o n D X

    D =1

    B0 it i dt i C t i

    D =1

    B0 it i er t i t i C t i

    D =1

    B0 i ti e

    yt i

    C t i

    l d o m y o l X

    B0 =i

    C t i eyt i

    g o n Cx X

    Cx =1

    B0 it2i dt i C t i

    Cx =1

    B0 i t2i e

    r t i t i

    C t i

    Cx =1

    B0 it2i eyt i C t i

    g o d R F W n d R F I H l l o o n o l d l l o n d n d d o n o n m

    l F

    # i n c l u d e < o >u s i n g n a m e s p a c e d ;

    # i n c l u d e " f i n _ r e c i p e s . h "

    d o u b l e o n d ( c o n s t o < d o u b l e > & ) o m , c o n s t o < d o u b l e > & ) o , c o n s t m l & d ) {

    d o u b l e = 0 ;

    f o r ( u n s i g n e d = 0 ; < ) o m . z ( ) ; + + ) { + = d . d o n o ( ) o m [ ] ) * ) o [ ] ;

    } ;

    r e t u r n ;

    } ;

    C

    + +

    C o d e 4 . 9 : n o n d m l

    R e f e r e n c e s l l @ I W W H A o o d n o n o m F

    R S

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    47/185

    # i n c l u d e " f i n _ r e c i p e s . h "

    d o u b l e o n d d o n ( c o n s t o < d o u b l e > & ) o m , c o n s t o < d o u b l e > & ) o m o n , c o n s t m l & d ) {

    d o u b l e = 0 ;

    d o u b l e h I = 0 ;

    f o r ( u n s i g n e d = 0 ; < ) o m . z ( ) ; + + ) { + = ) o m o n [ ] * d . d o n o ( ) o m [ ] ) ;

    h I + = ) o m [ ] * ) o m o n [ ] * d . d o n o ( ) o m [ ] ) ;

    } ;

    r e t u r n h I / ;

    } ;

    C

    + +

    C o d e 4 . 1 0 : g l l n o n d d o n m l

    # i n c l u d e " f i n _ r e c i p e s . h "

    # i n c l u d e < m >

    d o u b l e o n d o n ( c o n s t o < d o u b l e > & ) o m , c o n s t o < d o u b l e > & ) o m o n , c o n s t m l & d ) {

    d o u b l e f = 0 ;

    d o u b l e g = 0 ;

    f o r ( u n s i g n e d = 0 ; < ) o m . z ( ) ; + + ) { f + = ) o m o n [ ] * d . d o n o ( ) o m [ ] ) ;

    g + = o ( ) o m [ ] , 2 ) * ) o m o n [ ] * d . d o n o ( ) o m [ ] ) ;

    } ;

    r e t u r n g / f ;

    } ;

    C

    + +

    C o d e 4 . 1 1 : g l l n o n d o n m l

    g

    + +

    o m X

    v o i d m l o n d l l o n ( ) {

    o < d o u b l e > m ; m . k ( 1 ) ; m . k ( 2 ) ; o < d o u b l e > ) o ; ) o . k ( 1 0 ) ; ) o . k ( 1 1 0 ) ;

    m l ) ) ( 0 . 1 ) ;

    o

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    48/185

    C h a p t e r 5

    F u t u r e s a l g o r i t m s .

    s n d l o m d n l n o n F

    5 . 1 P r i c i n g o f f u t u r e s c o n t r a c t .

    o n o o l o n o F

    f t = er (T t ) S t

    # i n c l u d e < m >u s i n g n a m e s p a c e d ;

    d o u b l e ( c o n s t d o u b l e & , / / c u r r e n t p r i c e o f u n d e r l y i n g a s s e t

    c o n s t d o u b l e & , / / r i s k f r e e i n t e r e s t r a t e

    c o n s t d o u b l e & m o m ) {

    r e t u r n ( * m o m ) * ;

    } ;

    C

    + +

    C o d e 5 . 1 : p

    g

    + +

    o m X

    v o i d ( ) {

    d o u b l e = 1 0 0 ;

    d o u b l e = 0 . 1 0 ;

    d o u b l e m = 0 . 5 ;

    o

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    49/185

    C h a p t e r 6

    B i n o m i a l o p t i o n p r i c i n g

    y o n n d o d n o n o m o o m o d n ( n n F e n o o n

    d D ) o o m n o n o o o m o t h e r D

    l l l l d n d l n F e l l o o n D n o o l o n D o n

    n o n d l n n D l l d K D n n m n l F e o o n D n o o l o n D o s e l l n n o n d l n

    o n d n n m n l F s n o o n n o n l d @ d A

    n d @ m n l o n d A D o o n l l d n i o n y o n F s o o n n

    d n o l m o d o n d D o o n l l d e m n F

    e n o o n l l o n l d l l o o o n o l d F s n o l l o o n D

    n K l o n o n l n l o l d n d l n o D n o n d l n F r n D o o n n n ) o

    m F D o n o d o l l n o o ' n o o n D m o n n d

    n o F o D o D l l l l d n o o n p r e m i u m F e n o o n D l C n o l l o o n D P o o o n n d S o n d l n F e l l o

    n d d m F l l l 0 n o n d T ( n l m d o o o n F p o m d ( n o n o o o n D l l o l d D m d D

    ) o F

    C T = m (0, S T K )P T = m (0, K S T )

    l l n o o o n n o d m n o o n m m C 0 n d P 0 F e l l n o n d ) o o m d d n o n o o

    n d l n F n n o d o n r e l a t i v e o o n d l n F o

    o o n n o m k m o n o o l d o n o m o m n o

    n d l n F o n d n n l l m l m o k D n o m l

    m o n F o n d l n n l S 0 F n n o d o n l k o n o l D S u n d S d F

    S 0

    B

    r r r r r r r r j

    S u

    S d

    s o n n ( n d l l o l D n n m o n o l l o l D o n n l

    o n n ( l o l D l l d o l D o n o ( n d n ( l

    d l o n d l n D n d o n d k n F

    n o m l m o k l l m l D n o n l o o l F s ( n d

    o l q o o n D l o ( n d o l o o (1q) F i o n T F I d m o n l l o n o n d l n F

    S 0 = er (qS u + (1 q)S d ) @ T F I A x o D n d d o n n d l n n d n m o l

    qF o n o n o n o m l o o n n n l l l l n n m qF o d o l o n D

    R V

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    50/185

    n o d n o n n u n d d m l l d ( n d S u = uS 0 n d S d = dS 0 D n d o o l l d n ( T F I F

    S 0

    B

    r r r r r j

    uS 0

    dS 0

    p T F I X f n o m l

    n d l l ( l o l q

    q =er du d

    o o n E o d l l o o n n n o m l m o k o n n o m l T F I n d m l m n d

    n o d T F I F

    C u = max(0 , S u K )C d = max(0 , S d K )C 0 = er (qC u + (1 q)C d )q =

    er du d

    S u = uS 0 a n d S d = dS 0 a r e t h e p o s s i b l e v a l u e s f o r t h e u n d e r l y i n g s e c u r i t y n e x t p e r i o d , u a n d d a r e c o n s t a n t s , r i s t h e ( c o n t i n o u s l y c o m p o u n d e d ) r i s k f r e e i n t e r e s t r a t e a n d K i s t h e c a l l o p t i o n e x e r c i s e p r i c e .

    F o r m u l a 6 . 1 : n l o d n o m l l l o o n

    # i n c l u d e < m > / / s t a n d a r d m a t h e m a t i c a l l i b r a r y # i n c l u d e < l o m > / / d e n i n g t h e m a x ( ) o p e r a t o r u s i n g n a m e s p a c e d ;

    d o u b l e o o n l l o n n o m l n l o d ( c o n s t d o u b l e & , / / s p o t p r i c e

    c o n s t d o u b l e & , / / e x e r c i c e p r i c e

    c o n s t d o u b l e & , / / i n t e r e s t r a t e ( p e r p e r i o d )

    c o n s t d o u b l e & , / / u p m o v e m e n t

    c o n s t d o u b l e & d ) { / / d o w n m o v e m e n t

    d o u b l e = ( ( ) d ) / ( d ) ; d o u b l e d o n = 1 . 0 ; d o u b l e = m ( 0 . 0 , ( * ) ) ; d o u b l e d = m ( 0 . 0 , ( d *

    ) ) ;

    d o u b l e l l = ( ) * ( * + d o n * d ) ; r e t u r n l l ;

    } ;

    C

    + +

    C o d e 6 . 1 : f n o m l i o n D o n o d

    o l q o n d n m o n o n o o o n F s o n o l o d n n n d l n n d k o n d D o l o o o l o o

    o l d l o ' o d F n o o l o

    m o ' d D o d o l o o

    d l n o o l o F o k n o l o D o n n ( n d o n o q n o n o n d d o n m o m n u n d d F

    R W

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    51/185

    E x e r c i s e 1 1 .

    T h e p r i c e o f t h e u n d e r l y i n g s e c u r i t y f o l l o w s t h e b i n o m i a l p r o c e s s

    S 0

    B

    r r r r r j

    S u

    S d

    A o n e p e r i o d c a l l o p t i o n h a s p a y o s

    C 0

    B

    r r r r r j

    C u = max(0 , S u K )

    C d = max(0 , S d K )

    1 . S h o w h o w o n e c a n c o m b i n e a p o s i t i o n i n t h e u n d e r l y i n g s e c u r i t y w i t h a p o s i t i o n i n r i s k f r e e b o n d s t o

    c r e a t e a p o r t f o l i o w h i c h e x a c t l y d u p l i c a t e s t h e p a y o s f r o m t h e c a l l .

    2 . U s e t h i s r e s u l t t o s h o w t h e o n e p e r i o d p r i c i n g f o r m u l a f o r a c a l l o p t i o n s h o w n i n f o r m u l a 6 . 1 .

    6 . 1 M u l t i p e r i o d b i n o m i a l p r i c i n g

    y o D n m o n o o n l o o l n o d o m n l D

    m o n D n d m d D o n l o o l o o m n e x t d D

    n D o o o o o m D o n o o m D l l d n n ( X

    S t

    B

    r r r r r r r r j

    uS t

    dS t

    B

    r r r r r r r r j

    B

    r r r r r r r r j

    u (uS t ) = uuS t

    d(uS t ) = u (dS t ) = udS t

    d(dS t ) = ddS t

    s n d m m o D n m o d ' n t e r m i n a l n m k d l D n d

    l o o l d o n o o n d l n m n l d F x o

    l m o n o l k o u n d d m o n d F

    S H

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    52/185

  • 8/7/2019 [Odegaard] Financial Numerical Recipes in C++

    53/185

    x X p n d o o l l l m I X

    C u = er (qC uu + (1 q)C ud )C d = er (qC ud + (1 q)C dd )

    C 0

    B

    r r r r r j

    C u

    C d

    p n l X n o o l o ' m I D C u n d C d D ( n d o o n l m H X

    C 0 = er (qC u + (1 q)C d ) D n o m l n l l o n n o l l n k d n n o m l D n d o m m n o

    o n n n 0 n o n F o o d o d n

    o n n o d T F P D l n n o d l l d o m ( n d n o n m o n d

    d o n d o o l n o d F

    # i n c l u d e < o ># i n c l u d e < m >u s i n g n a m e s p a c e

    d ;

    o < o < d o u b l e > > n o m l ( c o n s t d o u b l e & H , c o n s t d o u b l e & ,

    c o n s t d o u b l e & d ,

    c o n s t i n t & n o ) {

    o < o < d o u b l e > > ; f o r ( i n t = 1 ; < = n o ; + + ) {

    o < d o u b l e > ( ) ; f o r ( i n t j = 0 ; j < ; + + j ) {

    [ j ] = H * o ( , j ) * o ( d , j 1 ) ; } ;

    . k ( ) ;

    } ;

    r e t u r n ;

    } ;

    C

    + +

    C o d e 6 . 2 : f l d n n o m l

    E x e r c i s e 1 2 .

    I n t e r m s o f c o m p u t a t i o n a l e c i e n c y t h e a p p r o c a c h o f c o d e 6 . 2 w i l l n o t b e o p t i m a l , s i n c e i t r e q u i r e s a l o t

    o f c a l l s t o t h e p o w ( ) f u n c t i o n a l c a l l . M o r e e c i e n t w o u l d b e t o c a r r y o u t t h e t r e e b u i l d i n g b y d o i n g t h e

    m u l t i p l i c a t i o n f r o m t h e p r e v i o u s n o d e , f o r e x a m p l e t h e j ' t h v e c t o r i s t h e j 1' t h v e c t o r t i m e s u , a n d t h e n o n e n e e d t o a d d o n e m o r e n o d e b y m u l t i p l y i n g t h e l o w e s t e l e m e n t b y

    d.

    1 . I m p l e m e n t s u c h a n a l t e r n a t i v e t r e e b u i l d i n g p r o c e d u r e .

    f n l l o n o d o n n l o n n o d T F P

    m o n l o D o m l n d o n n d n d n o

    n o m l D n m o 0 n n l o m o n n o d T F Q F x o

    o n l o n v e c t o r < d o u b l e > D n o n