Building on my knowledge of adjoint methods for engineering design optimisation, I wrote a paper with Professor Paul Glasserman of Columbia Business School on the use of adjoints for the efficient evaluation of pathwise sensitivities in Monte Carlo simulation. This appeared in Risk magazine in January 2006, and led to us being jointly named as Risk Quant of the Year 2007.
The earlier technical report is a slightly longer version with an appendix which discusses Algorithmic Differentiation which provides the theoretical basis for saying that any algorithm has an efficient adjoint counterpart for computing sensitivities.
For further papers on this topic see the publications of Luca Capriotti who is probably the leader in the use of adjoint methods within the finance industry. In particular,
Having convinced people that adjoint techniques are a good idea, the question that naturally came next was: how do I develop an adjoint code? This is the question I aimed to address in this invited paper I presented at the HERCMA conference in Athens in Sept.'07.
Automatic Differentiation software can be very helpful in simplifying or validating the development of an adjoint code. In previous research in CFD (Computational Fluid Dynamics), we used Tapenade, developed at INRIA, to generate the linear and adjoint versions of the key nonlinear "kernels" within the code -- the bits which would be very time-consuming and error-prone to write by hand. However, in 2007 Tapenade worked only with codes written in FORTRAN.
For the C/C++ Monte Carlo code for a LIBOR testcase we instead used the FADBAD++ package, developed by Ole Stauning and Claus Bendtsen. This is very easy to use with a particularly clean and simple programming interface. In terms of execution efficiency, it is roughly 4 times slower than a hand-coded implementation for the forward-mode pathwise sensitivity calculation, and it is roughly 10-20x slower than hand-coded for the reverse-mode calculation. However, that loss in execution efficiency should be considered relative to the very large savings in the human effort of programming the hand-coded implementations. One viewpoint is that one uses FADBAD++ as a key tool in developing and checking the hand-coded implementations. Alternatively, the paper also explains how FADBAD++ can be used for the payoff evaluation while using hand-coded adjoints for the calculation of the path evolution. This represents a good tradeoff between execution efficiency and programming effort.
I addressed this topic in 2008 in an internal report and a conference paper.
Note also these subsequent papers by others on adjoints for Cholesky factorisation and SVD solutions.