public void Calc() { // we abstracted Tony Finch's code for covariance // see Tony Finch, Incremental calculation of mean and variance // https://fanf2.user.srcf.net/hermes/doc/antiforgery/stats.pdf //--- average & variance for series double seriesNew = _series.LogReturn()[0]; double seriesDiff = seriesNew - _avgSeries; double seriesIncr = _alpha * seriesDiff; _avgSeries = _avgSeries + seriesIncr; _varSeries = (1.0 - _alpha) * (_varSeries + seriesDiff * seriesIncr); //--- average & variance for benchmark double benchNew = _benchmark.LogReturn()[0]; double benchDiff = benchNew - _avgBench; double benchIncr = _alpha * benchDiff; _avgBench = _avgBench + benchIncr; _varBench = (1.0 - _alpha) * (_varBench + benchDiff * benchIncr); //--- covariance _cov = (1.0 - _alpha) * (_cov + seriesDiff * benchIncr); //--- CAPM (Beta as TimeSeries <double>).Value = _cov / Math.Max(1e-10, _varBench); (Alpha as TimeSeries <double>).Value = _avgSeries - Beta[0] * _avgBench; }
public void Calc() { //--- average & variance for series double seriesNew = _series.LogReturn()[0]; double seriesDiff = seriesNew - _avgSeries; double seriesIncr = _alpha * seriesDiff; _avgSeries = _avgSeries + seriesIncr; _varSeries = (1.0 - _alpha) * (_varSeries + seriesDiff * seriesIncr); //--- average & variance for benchmark double benchNew = _benchmark.LogReturn()[0]; double benchDiff = benchNew - _avgBench; double benchIncr = _alpha * benchDiff; _avgBench = _avgBench + benchIncr; _varBench = (1.0 - _alpha) * (_varBench + benchDiff * benchIncr); //--- covariance _cov = (1.0 - _alpha) * (_cov + seriesDiff * benchIncr); //--- CAPM (Beta as TimeSeries <double>).Value = _cov / Math.Max(1e-10, _varBench); (Alpha as TimeSeries <double>).Value = _avgSeries - Beta[0] * _avgBench; }
/// <summary> /// Calculate historical volatility, based on log-returns. /// </summary> /// <param name="series">input time series</param> /// <param name="n">length</param> /// <param name="parentId">caller cache id, optional</param> /// <param name="memberName">caller's member name, optional</param> /// <param name="lineNumber">caller line number, optional</param> /// <returns>volatility as time series</returns> public static ITimeSeries <double> Volatility(this ITimeSeries <double> series, int n = 10, CacheId parentId = null, [CallerMemberName] string memberName = "", [CallerLineNumber] int lineNumber = 0) { var cacheId = new CacheId(parentId, memberName, lineNumber, series.GetHashCode(), n); return(series .LogReturn(cacheId) .StandardDeviation(n, cacheId)); }