# template class xf::fintech::internal::HJMPcaEngine¶

#include "hjm_engine.hpp"

## Overview¶

Class for calculating the inputs to the MonteCarlo simulation of Heath-Jarrow-Morton framework. It deals with analysing historical data, calculating the risk neutral drift and the polynomial fitting of the discrete volatility vectors.

Parameters:

DT | DataType for the internal calculations |

MAX_TENORS | Maximum synthetisable tenors supported by the framework. |

MAX_CURVES | Maximum number of days analyzable from historical data |

NCU | Number of compute units on the historical data matrix. |

template < typename DT, unsigned int MAX_TENORS, unsigned MAX_CURVES, unsigned NCU > class HJMPcaEngine: public hjmModelParams

## Methods¶

### riskNeutralDrift¶

void riskNeutralDrift ( DT vol_c1] [PD[0], DT vol_c2] [PD[1], DT vol_c3] [PD[2], DT rnd [MAX_TENORS] )

Risk Neutral drift calculation. tau assumed to be 0.5 years.

RnD calculated as :math:` vol(t) * integral(vol(t)) ` for all volatilities and for :math:` t=1,…,n `

### volatility_polyfit¶

void volatility_polyfit ( DT discreteVols [MAX_TENORS][N], DT vol1] [VOL_POLYFIT_FANOUT][PD[0], DT vol2] [VOL_POLYFIT_FANOUT][PD[1], DT vol3] [VOL_POLYFIT_FANOUT][PD[2] )

Transforms each discrete volatility vector into a continuous least-squares fitting of a polynomial. The chosen degrees for the polynomial is a model specific parameter selected for better convergence. Each set of coefficients is also split into several copies for its use in different parts of the model. The outputs is a set of coefficients, ‘degree + 1’ elements wide that represent the function :math:` c_0 + c_1*x + c_2*x^2 + … + c_n*x^n ` .

Parameters:

discreteVols | Matrix with discrete volatilities arranged in sets of N vectors. |

vol1 | Polynomial coefficients for the first volatility vector |

vol2 | Polynomial coefficients for the second volatility vector |

vol3 | Polynomial coefficients for the third volatility vector |

### matdiffRows¶

template < unsigned R, unsigned C > void matdiffRows ( DT input [R][C], DT output [R-1][C], unsigned r, unsigned c )

matdiff function that computes the difference between rows in a matrix.

Parameters:

input | Input matrix data. |

output | Output containing the diff of the matrix data. It will contain 1 fewer row than the original. |

### mtransp¶

template < unsigned R, unsigned C > void mtransp ( unsigned r, unsigned c, DT input [R][C], DT output [C][R] )

Calculates the transpose of a matrix.

### calculateDiscreteVolatility¶

void calculateDiscreteVolatility ( DT ratesIn [MAX_CURVES][MAX_TENORS], DT discreteVols [MAX_TENORS][N] )

Extracts `N`

discrete volatility vectors from a matrix of historical interest rates. A Principal Component Analysis will be performed on the differences of the data, and a dimensionality reduction will be performed to extract the `noTenors`

datapoints for each vector.

Parameters:

ratesIn | Matrix with all the raw historical data, with size `noTenors` x `noObservations` |

discreteVols | Output vectors of the discrete volatilities arranged in sets of N. It will contain `noTenors` elements. |