// Annualized Historical Volatility // // annualized_historical_volatility - ahv // // y[t] = stddev(log(x[t-k..t])) * sqrt(252) // // X_n - 1 // Y_n - 1 // C_n - 1 #include #include "ts.h" typedef struct { uint_t k; } ts_annualized_historical_volatility_params_t; ts_parameter_t const ts_annualized_historical_volatility_p = { .n_inputs = 1, .n_outputs = 1, .n_constants = 1, .params_size = sizeof(ts_annualized_historical_volatility_params_t) }; uint_t ts_annualized_historical_volatility_offset( ts_constant_t const *c ) { ( void )c; return ( c ? ((ts_annualized_historical_volatility_params_t const *)c)->k : 0 ); } int ts_annualized_historical_volatility( fp_t * const *y, uint_t y_n, fp_t const * const *x, uint_t x_n, uint_t n, ts_constant_t const *c ) { TS_PROLOGUE( ts_annualized_historical_volatility_p ); if ( !c ) return -1; TS_CHECK_INPUT(x, x_n, n); uint_t k = ((ts_annualized_historical_volatility_params_t const *)c)->k; if (k == 0 || n <= k) return -1; for ( uint_t i = 0; i < k; ++i ) y[0][i] = NAN; /* Compute log returns, then stddev, then annualize */ for (uint_t i = k; i < n; ++i) { fp_t sum = 0; fp_t sum2 = 0; uint_t count = 0; for (uint_t j = i - k + 1; j <= i; ++j) { if (x[0][j - 1] <= 0 || x[0][j] <= 0) continue; fp_t ret = log(x[0][j] / x[0][j - 1]); sum += ret; sum2 += ret * ret; count++; } if (count == 0) { y[0][i] = 0; continue; } fp_t mean = sum / count; fp_t variance = sum2 / count - mean * mean; if (variance < 0) variance = 0; y[0][i] = sqrt(variance) * sqrt(252.0); } return 0; }