Variance Ratio

Modified on 2010/09/13 15:29 by Eugene — Categorized as: Community Indicators

VarianceRatio: Indicator Documentation


public VarianceRatio(Bars bars, DataSeries ds, int lookback, int period)
public VarianceRatio(Bars bars, DataSeries ds, int lookback, int period, string description)

Parameter Description

bars Bars object
ds The price series to work on
lookback The lookback period
period The averaging period


The Variance Ratio indicator by Dr. Rene Koch (originally developed here) is a measure for the trendiness or degree of mean reversion in a price series.

From "A Small-Sample Overlapping Variance-Ratio Test" by Tse et al:

Since the works of Cochrane (1988) and Lo and MacKinlay (1988, 1989) the variance ratio (VR) statistic has been used widely as a test for the random-walk hypothesis. Campbell and Mankiw (1987a, 1987b, 1989), Cogley (1990) and Poterba and Summers (1988) used the VR statistic to measure the persistence in economic time series. Lo and MacKinlay (1989) demonstrated that the VR test is more powerful than either the Dickey-Fuller test or the Box-Pierce Q test for several interesting alternatives. Cecchetti and Lam (1994) summarized the advantages of using the VR test.



This is a very simplistic implementation of a "rolling" variance ratio test. Any outliers in the price series will bias the results towards smaller values. There is another bias for small samle sizes (small Period). The usual disadvantages of the SMA() which is used internally in the StdDev() function apply.


This strategy is a port of the V4 chartscript RSI + Variance Ratio Filter by slow_learner and tests the impact of using the variance ratio as a filter on a standard RSI system:

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using Community.Indicators;

namespace WealthLab.Strategies { public class RSI_VarianceRatio_Filter : WealthScript { protected override void Execute() { LineStyle ls = LineStyle.Solid; LineStyle ld = LineStyle.Dotted; Color silver = Color.Silver; VarianceRatio vr = VarianceRatio.Series(Bars, Close, 20, 400); double sensitivity = 0.9; ChartPane vr_p = CreatePane(30, true, false); PlotSeries(vr_p, vr, Color.Blue, ls, 1 ); DrawHorzLine(vr_p, sensitivity, Color.Red, ls, 2 ); RSI rsi_s = RSI.Series(Close, 14); ChartPane RSI_p = CreatePane( 30, true, false ); int RSI_lower = 30; int RSI_upper = 70; PlotSeries( RSI_p, rsi_s, Color.Blue, ls, 1 ); DrawHorzLine(RSI_p, RSI_lower, silver, ld, 2 ); DrawHorzLine(RSI_p, 50, silver, ld, 2 ); DrawHorzLine(RSI_p, RSI_upper, silver, ld, 2 ); for(int bar = 20; bar < Bars.Count; bar++) { if (vr[bar] > sensitivity) SetBackgroundColor(bar, Color.FromArgb(50,Color.LightGreen)); if( ( ActivePositions.Count > 0 ) & CrossOver(bar, rsi_s, RSI_upper) ) SellAtMarket( bar + 1, Position.AllPositions, "RSI Exit" );

if( CrossOver(bar, rsi_s, RSI_lower) & (vr[bar] > sensitivity) ) BuyAtMarket( bar + 1, "RSI Entry" ); } } } }