[odegaard] financial numerical recipes in c++
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