One of the best languages for the development of financial engineering and instrument pricing applications is C++. This book has several features that allow developers to write robust, flexible and extensible software systems. The book is an ANSI/ISO standard, fully object-oriented and interfaces with many third-party applications. It has support for templates and generic programming, massive reusability using templates (?write once?) and support for legacy C applications. In this book, author Daniel J. Duffy brings C++ to the next level by applying it to the design and implementation of classes, libraries and applications for option and derivative pricing models. He employs modern software engineering techniques to produce industrial-strength applications: Using the Standard Template Library (STL) in finance Creating your own template classes and functions Reusable data structures for vectors, matrices and tensors Classes for numerical analysis (numerical linear algebra ?) Solving the Black Scholes equations, exact and approximate solutions Implementing the Finite Difference Method in C++ Integration with the ?Gang of Four? Design Patterns Interfacing with Excel (output and Add-Ins) Financial engineering and XML Cash flow and yield curves Included with the book is a CD containing the source code in the Datasim Financial Toolkit. You can use this to get up to speed with your C++ applications by reusing existing classes and libraries. 'Unique... Let's all give a warm welcome to modern pricing tools.' -- Paul Wilmott, mathematician, author and fund manager
Author(s): Daniel J. Duffy
Publisher: John Wiley & Sons
Year: 2004
Language: English
Pages: 432
Financial Instrument Pricing Using C++
Contents
1 Executive Overview of this Book
1.1 What is this book?
1.2 What’s special about this book?
1.3 Who is this book for?
1.4 Software requirements
1.5 The structure of this book
1.6 Pedagogical approach
1.7 What this book is not
1.8 Source code on the CD
PART I TEMPLATE PROGRAMMING IN C++
2 A Gentle Introduction to Templates in C++
2.1 Introduction and objectives
2.2 Motivation and background
2.3 Defining a template
2.3.1 An example
2.4 Template instantiation
2.5 Function templates
2.5.1 An example
2.6 Default values and typedefs
2.7 Guidelines when implementing templates
2.8 Conclusions and summary
3 An Introduction to the Standard Template Library
3.1 Introduction and objectives
3.1.1 Why use STL?
3.2 A Bird’s-eye view of STL
3.3 Sequence containers
3.3.1 Programming lists
3.3.2 Vectors and arrays in STL
3.4 Associative containers
3.4.1 Sets in STL
3.4.2 Maps in STL
3.5 Iterators in STL
3.5.1 What kinds of iterators?
3.6 Algorithms
3.7 Using STL for financial instruments
3.8 Conclusions and summary
4 STL for Financial Engineering Applications
4.1 Introduction and objectives
4.2 Clever data structures
4.2.1 A simple output mechanism
4.3 Set theory and STL
4.4 Useful algorithms
4.5 STL adaptor containers
4.6 Conclusions and summary
5 The Property Pattern in Financial Engineering
5.1 Introduction and objectives
5.2 The Property pattern
5.2.1 Requirements for a Property pattern
5.3 An example
5.4 Extending the Property pattern: property sets and property lists
5.4.1 An example
5.5 Properties and exotic options
5.5.1 Example: Executive options
5.6 Conclusions and summary
PART II BUILDING BLOCK CLASSES
6 Arrays, Vectors and Matrices
6.1 Introduction and objectives
6.2 Motivation and background
6.3 A layered approach
6.4 The Array and Matrix classes in detail
6.4.1 Simple print functions
6.4.2 Array example
6.4.3 Matrix example
6.5 The Vector and NumericMatrix classes in detail
6.5.1 Vector example
6.5.2 NumericMatrix example
6.6 Associative arrays and matrices
6.7 Conclusions and summary
7 Arrays and Matrix Properties
7.1 Introduction and objectives
7.2 An overview of the functionality
7.3 Software requirements
7.3.1 Accuracy
7.3.2 Efficiency
7.3.3 Reliability
7.3.4 Understandability
7.4 The core processes
7.4.1 Interactions between matrices and vectors
7.4.2 Some examples
7.5 Other function categories
7.5.1 Measures of central tendency
7.5.2 Measures of dispersion
7.5.3 Moments, skewness, kurtosis
7.5.4 Inequalities
7.6 Using the functions
7.6.1 Calculating historical volatility
7.6.2 Variance of return of a portfolio
7.7 An introduction to exception handling
7.7.1 Try, throw and catch: A bit like tennis
7.8 Conclusions and summary
8 Numerical Linear Algebra
8.1 Introduction and objectives
8.2 An introduction to numerical linear algebra
8.2.1 Direct methods
8.2.2 Iterative methods
8.3 Tridiagonal systems
8.3.1 LU decomposition
8.3.2 Godunov’s Double Sweep method
8.3.3 Designing and implementing tridiagonal schemes
8.4 Block tridiagonal systems
8.5 What requirements should our matrix satisfy?
8.5.1 Positive-definite matrices and diagonal dominance
8.5.2 M-Matrices
8.6 Conclusions and summary
9 Modelling Functions in C++
9.1 Introduction and objectives
9.2 Function pointers in C++
9.3 Function objects in STL
9.3.1 Comparison functions
9.3.2 STL and financial engineering
9.4 Some function types
9.4.1 Applications in numerical analysis and financial engineering
9.4.2 An example: Functions in option pricing
9.5 Creating your own function classes
9.6 Arrays of functions
9.7 Vector functions
9.8 Real-valued functions
9.9 Vector-valued functions
9.10 Conclusions and summary
10 C++ Classes for Statistical Distributions
10.1 Introduction and objectives
10.2 Discrete and continuous probability distribution functions
10.3 Continuous distributions
10.3.1 Uniform (rectangular) distribution
10.3.2 Normal distribution
10.3.3 Lognormal distribution
10.3.4 Gamma distribution and its specialisations
10.4 Discrete distributions
10.4.1 Poisson distribution
10.4.2 Binomial and Bernoulli distributions
10.4.3 Pascal and geometric distributions
10.5 Tests
10.5.1 Continuous distributions
10.5.2 Discrete distributions
10.6 Conclusions and summary
PART III ORDINARY AND STOCHASTIC DIFFERENTIAL EQUATIONS
11 Numerical Solution of Initial Value Problems: Fundamentals
11.1 Introduction and objectives
11.2 A model problem
11.2.1 Qualitative properties of the solution
11.3 Discretisation
11.4 Common schemes
11.5 Some theoretical issues
11.6 Fitting: Special schemes for difficult problems
11.7 Non-linear scalar problems and predictor–corrector methods
11.8 Extrapolation techniques
11.9 C++ design and implementation
11.10 Generalisations
11.11 Conclusions and summary
12 Stochastic Processes and Stochastic Differential Equations
12.1 Introduction and objectives
12.2 Random variables and random processes
12.2.1 Random variables
12.2.2 Generating random variables
12.2.3 Random (stochastic) processes
12.3 An introduction to stochastic differential equations
12.4 Some finite difference schemes
12.4.1 Improving the accuracy: Richardson extrapolation
12.5 Which scheme to use?
12.6 Systems of SDEs
12.7 Conclusions and summary
13 Two-Point Boundary Value Problems
13.1 Introduction and objectives
13.2 Description of problem
13.3 (Traditional) centred-difference schemes
13.3.1 Does the discrete system have a solution?
13.3.2 Extrapolation
13.4 Approximation of the boundary conditions
13.4.1 Linearity boundary condition
13.5 Exponentially fitted schemes and convection–diffusion
13.6 Approximating the derivatives
13.7 Design issues
13.8 Conclusions and summary
14 Matrix Iterative Methods
14.1 Introduction and objectives
14.2 Iterative methods
14.3 The Jacobi method
14.4 Gauss–Seidel method
14.5 Successive overrelaxation (SOR)
14.6 Other methods
14.6.1 The conjugate gradient method
14.6.2 Block SOR
14.6.3 Solving sparse systems of equations
14.7 The linear complementarity problem
14.8 Implementation
14.9 Conclusions and summary
PART IV PROGRAMMING THE BLACK–SCHOLES ENVIRONMENT
15 An Overview of Computational Finance
15.1 Introduction and objectives
15.2 The development life cycle
15.3 Partial differential equations
15.4 Numerical approximation of PDEs
15.5 The class of finite difference schemes
15.6 Special schemes for special problems
15.7 Implementation issues and the choice of programming language
15.8 Origins and application areas
15.9 Conclusions and summary
16 Finite Difference Schemes for Black–Scholes
16.1 Introduction and objectives
16.2 Model problem: The one-dimensional heat equation
16.3 The Black–Scholes equation
16.4 Initial conditions and exotic options payoffs
16.4.1 Payoff functions in options modelling
16.5 Implementation
16.6 Method of lines: A whirlwind introduction
16.7 Conclusions and summary
17 Implicit Finite Difference Schemes for Black–Scholes
17.1 Introduction and objectives
17.2 Fully implicit method
17.3 An introduction to the Crank–Nicolson method
17.4 A critique of Crank–Nicolson
17.4.1 How are derivatives approximated?
17.4.2 Boundary conditions
17.4.3 Initial conditions
17.4.4 Proving stability
17.5 Is there hope? the Keller scheme
17.5.1 The advantages of the Box scheme
17.6 Conclusions and summary
18 Special Schemes for Plain and Exotic Options
18.1 Introduction and objectives
18.2 Motivating exponentially fitted schemes
18.2.1 A new class of robust difference schemes
18.3 Exponentially fitted schemes for parabolic problems
18.3.1 The fitted scheme in more detail: Main results
18.4 What happens when the volatility goes to zero?
18.4.1 Graceful degradation
18.5 Exponential fitting with explicit time
18.5.1 An explicit time-marching scheme
18.6 Exponential fitting and exotic options
18.7 Some final remarks
19 My First Finite Difference Solver
19.1 Introduction and objectives
19.2 Modelling partial differential equations in C++
19.2.1 Function classes in C++
19.2.2 Function classes for partial differential equations
19.3 Finite difference schemes as C++ classes, Part I
19.4 Finite difference schemes as C++ classes, Part II
19.5 Initialisation issues
19.5.1 Functions and parameters
19.5.2 The main program
19.6 Interfacing with Excel
19.7 Conclusions and summary
20 An Introduction to ADI and Splitting Schemes
20.1 Introduction and objectives
20.2 A model problem
20.3 Motivation and history
20.4 Basic ADI scheme for the heat equation
20.4.1 Three-dimensional heat equation
20.5 Basic splitting scheme for the heat equation
20.5.1 Three-dimensional heat equation
20.6 Approximating cross-derivatives
20.7 Handling boundary conditions
20.8 Algorithms and design issues
20.9 Conclusions and summary
21 Numerical Approximation of Two-Factor Derivative Models
21.1 Introduction and objectives
21.2 Two-factor models in financial engineering
21.2.1 Asian options
21.2.2 Convertible bonds with random interest rates
21.2.3 Options with two underlying assets
21.2.4 Basket options
21.2.5 Fixed-income applications
21.3 Finite difference approximations
21.4 ADI schemes for Asian options
21.4.1 Upwinding
21.5 Splitting schemes
21.6 Conclusions and summary
PART V DESIGN PATTERNS
22 A C++ Application for Displaying Numeric Data
22.1 Introduction and objectives
22.2 Input mechanisms
22.3 Conversion and processing mechanisms
22.4 Output and display mechanisms
22.4.1 Ensuring that Excel is started only once
22.5 Putting it all together
22.6 Output
22.7 Other functionality
22.7.1 Accessing cell data
22.7.2 Cell data for functions
22.7.3 Using Excel with finite difference schemes
22.8 Using Excel and property sets
22.9 Extensions and the road to design patterns
22.10 Conclusions and summary
23 Object Creational Patterns
23.1 Introduction and objectives
23.2 The Singleton pattern
23.2.1 The templated Singleton solution
23.2.2 An extended example
23.2.3 Applications to financial engineering
23.3 The Prototype pattern
23.3.1 The Prototype pattern: Solution
23.3.2 Applications to financial engineering
23.4 Factory Method pattern (virtual constructor)
23.4.1 An extended example
23.5 Abstract Factory pattern
23.5.1 The abstract factory: solution
23.5.2 An extended example
23.6 Applications to financial engineering
23.7 Conclusions and summary
24 Object Structural Patterns
24.1 Introduction and objectives
24.2 Kinds of structural relationships between classes
24.2.1 Aggregation
24.2.2 Association
24.2.3 Generalisation/specialisation
24.3 Whole–Part pattern
24.4 The Composite pattern
24.5 The Façade pattern
24.6 The Bridge pattern
24.6.1 An example of the Bridge pattern
24.7 Conclusions and summary
25 Object Behavioural Patterns
25.1 Introduction and objectives
25.2 Kinds of behavioural patterns
25.3 Iterator pattern
25.3.1 Iterating in composites
25.3.2 Iterating in property sets
25.4 The Visitor pattern
25.4.1 Visitors and the Extensible Markup Language (XML)
25.5 Notification patterns
25.6 Conclusions and summary
PART VI DESIGN AND DEPLOYMENT ISSUES
26 An Introduction to the Extensible Markup Language
26.1 Introduction and objectives
26.1.1 What’s the big deal with XML?
26.2 A short history of XML
26.3 The XML structure
26.3.1 XML files
26.3.2 XML syntax
26.3.3 Attributes in XML
26.4 Document Type Definition
26.4.1 DTD syntax
26.4.2 Validation issues
26.4.3 Limitations of DTDs
26.5 Extensible Stylesheet Language Transformation (XSLT)
26.5.1 Namespaces in XML
26.5.2 Main concepts in XSL
26.6 An application of XML: Financial products Markup Language
26.6.1 Product architecture overview
26.6.2 Example: Equity derivative options product architecture
26.7 Conclusions and summary
27 Advanced XML and Programming Interface
27.1 Introduction and objectives
27.2 XML Schema
27.2.1 Element declaration
27.2.2 User-defined simple and complex types
27.2.3 Multiplicity issues
27.2.4 An example
27.2.5 Comparing DTDs and the XML Schema
27.2.6 XML Schemas and FpML
27.3 Accessing XML data: The Document Object Model
27.3.1 DOM in a programming environment
27.4 DOM and C++: The essentials
27.5 DOM, entities and property sets
27.5.1 XML readers and writers
27.5.2 Examples and applications
27.6 XML structures for plain and barrier options
27.7 Conclusions and summary
28 Interfacing C++ and Excel
28.1 Introduction and objectives
28.2 Object model in Excel: An overview
28.3 Under the bonnet: Technical details of C++ interfacing to Excel
28.3.1 Startup
28.3.2 Creating charts and cell values
28.3.3 Interoperability with the SimplePropertySet
28.4 Implementing the core process
28.4.1 Registration: Getting basic input
28.4.2 Calculations
28.4.3 Displaying the results of the calculations
28.4.4 The application (main program)
28.5 Extensions
28.6 Application areas
28.7 Conclusions and summary
29 Advanced Excel Interfacing
29.1 Introduction and objectives
29.2 Status report and new requirements
29.3 A gentle introduction to Excel add-ins
29.3.1 What kinds of add-ins are there?
29.4 Automation add-in in detail
29.4.1 Functions with two parameters
29.4.2 Functions that accept a range
29.4.3 Using the Vector template class
29.5 Creating a COM add-in
29.6 Future trends
29.7 Conclusions and summary
30 An Extended Application: Option Strategies and Portfolios
30.1 Introduction and objectives
30.2 Spreads
30.3 Combinations: Straddles and strangles
30.4 Designing and implementing spreads
30.5 Delta hedging
30.6 An example
30.7 Tips and guidelines
Appendices
A1 My C++ refresher
A2 Dates and other temporal types
References
Index