Modern Computational Finance xi
Preface by Leif Andersen xv
Acknowledgments xix
Introduction xxi
About the Companion C++ Code xxv
PART I Modern Parallel Programming 1
Introduction 3
CHAPTER 1 Effective C++ 17
CHAPTER 2 Modern C++ 25
2.1 Lambda expressions 25
2.2 Functional programming in C++ 28
2.3 Move semantics 34
2.4 Smart pointers 41
CHAPTER 3 Parallel C++ 47
3.1 Multi-threaded Hello World 49
3.2 Thread management 50
3.3 Data sharing 55
3.4 Thread local storage 56
3.5 False sharing 57
3.6 Race conditions and data races 62
3.7 Locks 64
3.8 Spinlocks 66
3.9 Deadlocks 67
3.10 RAII locks 68
3.11 Lock-free concurrent design 70
3.12 Introduction to concurrent data structures 72
3.13 Condition variables 74
3.14 Advanced synchronization 80
3.15 Lazy initialization 83
3.16 Atomic types 86
3.17 Task management 89
3.18 Thread pools 96
3.19 Using the thread pool 108
3.20 Debugging and optimizing parallel programs 113
PART II Parallel Simulation 123
Introduction 125
CHAPTER 4 Asset Pricing 127
4.1 Financial products 127
4.2 The Arbitrage Pricing Theory 140
4.3 Financial models 151
CHAPTER 5 Monte-Carlo 185
5.1 The Monte-Carlo algorithm 185
5.2 Simulation of dynamic models 192
5.3 Random numbers 200
5.4 Better random numbers 202
CHAPTER 6Serial Implementation 213
6.1 The template simulation algorithm 213
6.2 Random number generators 223
6.3 Concrete products 230
6.4 Concrete models 245
6.5 User interface 263
6.6 Results 268
CHAPTER 7 Parallel Implementation 271
7.1 Parallel code and skip ahead 271
7.2 Skip ahead with mrg32k3a 276
7.3 Skip ahead with Sobol 282
7.4 Results 283
PART III Constant Time Differentiation 285
Introduction 287
CHAPTER 8 Manual Adjoint Differentiation 295
8.1 Introduction to Adjoint Differentiation 295
8.2 Adjoint Differentiation by hand 308
8.3 Applications in machine learning and finance 315
CHAPTER 9 Algorithmic Adjoint Differentiation 321
9.1 Calculation graphs 322
9.2 Building and applying DAGs 328
9.3 Adjoint mathematics 340
9.4 Adjoint accumulation and DAG traversal 344
9.5 Working with tapes 349
CHAPTER 10 Effective AAD and Memory Management 357
10.1 The Node class 359
10.2 Memory management and the Tape class 362
10.3 The Number class 379
10.4 Basic instrumentation 398
CHAPTER 11 Discussion and Limitations 401
11.1 Inputs and outputs 401
11.2 Higher-order derivatives 402
11.3 Control flow 402
11.4 Memory 403
CHAPTER 12 Differentiation of the Simulation Library 407
12.1 Active code 407
12.2 Serial code 409
12.3 User interface 417
12.4 Serial results 424
12.5 Parallel code 426
12.6 Parallel results 433
CHAPTER 13 Check-Pointing and Calibration 439
13.1 Check-pointing 439
13.2 Explicit calibration 448
13.3 Implicit calibration 475
CHAPTER 14 Multiple Differentiation in Almost Constant Time 483
14.1 Multidimensional differentiation 483
14.2 Traditional Multidimensional AAD 484
14.3 Multidimensional adjoints 485
14.4 AAD library support 487
14.5 Instrumentation of simulation algorithms 494
14.6 Results 499
CHAPTER 15 Acceleration with Expression Templates 503
15.1 Expression nodes 504
15.2 Expression templates 507
15.3 Expression templated AAD code 524
Debugging AAD Instrumentation 541
Conclusion 547
References 549
Index 555