# vratiotest

Variance ratio test for random walk

## Description

example

h = vratiotest(y) returns the rejection decision h from conducting the variance ratio test for assessing whether the univariate time series y is a random walk.

example

[h,pValue,stat,cValue] = vratiotest(y) also returns the p-value pValue, test statistic stat, and critical value cValue of the test.

example

StatTbl = vratiotest(Tbl) returns the table StatTbl containing variables for the test results, statistics, and settings from conducting the variance ratio test on the last variable of the input table or timetable Tbl. To select a different variable in Tbl to test, use the DataVariable name-value argument.

example

[___] = vratiotest(___,Name=Value) uses additional options specified by one or more name-value arguments, using any input-argument combination in the previous syntaxes. vratiotest returns the output-argument combination for the corresponding input arguments.

Some options control the number of tests to conduct. The following conditions apply when vratiotest conducts multiple tests:

• vratiotest treats each test as separate from all other tests.

• If you specify y, all outputs are vectors.

• If you specify Tbl, each row of StatTbl contains the results of the corresponding test.

For example, vratiotest(Tbl,DataVariable="GDP",Alpha=0.025,IID=[false true]) conducts two tests, at a level of significance of 0.025, on the variable GDP of the table Tbl. The first test does not assume that the innovations series is iid and the second test assumes that the innovations series is iid.

example

[___,ratio] = vratiotest(___) additionally returns the variance ratios of each test ratio.

## Examples

collapse all

Test whether a time series is a random walk using the default options of vratiotest. Input the time series data as a numeric vector.

Load the global large-cap equity indices data set, which contains daily closing prices during 1993–2003. Extract the closing prices of the S&P 500 series.

dt = datetime(dates,ConvertFrom="datenum");
sp = DataTable.SP;
plot(dt,sp)
title("S&P 500 Price Series")

The first half of the series exhibits exponential growth.

Scale the series by applying the log transformation.

logsp = log(DataTable.SP);

The logsp series is in levels.

Assess the null hypothesis that the log series is a random walk by applying the variance ratio test. Use default options.

h = vratiotest(logsp)
h = logical
0

h = 0 indicates that, at a 5% level of significance, the test fails to reject the null hypothesis that the series is a random walk.

Load the global large-cap equity indices data set, extract the closing prices of the S&P 500 price series, and apply the log transform to the series.

logsp = log(DataTable.SP);

Assess the null hypothesis that the log series is a random walk by applying the variance ratio test. Return the test decision, $\mathit{p}$-value, test statistic, and critical value.

[h,pValue,stat,cValue] = vratiotest(logsp)
h = logical
0

pValue = 0.7004
stat = 0.3847
cValue = 1.9600

Test whether a time series, which is one variable in a table, is a random walk using the default options.

Load the global large-cap equity indices data set. Convert the table DataTable to a timetable.

dates = datetime(dates,ConvertFrom="datenum");
TT = table2timetable(DataTable,RowTimes=dates);

Apply the log transform to all series.

LTT = varfun(@log,TT(:,2:end));
LTT.Properties.VariableNames{end}
ans =
'log_SP'

The last variable in the table is the log of the S&P 500 price series log_SP.

Assess the null hypothesis of the variance ratio test that the log of the S&P 500 price series is a random walk.

StatTbl = vratiotest(LTT)
StatTbl=1×7 table
h      pValue      stat      cValue    Alpha    Period     IID
_____    _______    _______    ______    _____    ______    _____

Test 1    false    0.70045    0.38471     1.96     0.05       2       false

vratiotest returns test results and settings in the table StatTbl, where variables correspond to test results (h, pValue, stat, and cValue) and settings (Alpha, Period, and IID), and rows correspond to individual tests (in this case, vratiotest conducts one test).

By default, vratiotest tests the last variable in the table. To select a variable from an input table to test, set the DataVariable option.

Test whether the S&P 500 series is a random walk using various step sizes, with and without the iid innovations assumption.

Load the global large-cap equity indices data set. Convert the table DataTable to a timetable and apply the log transform to all timetable variables.

dates = datetime(dates,ConvertFrom="datenum");
TT = table2timetable(DataTable,RowTimes=dates);
LTT = varfun(@log,TT(:,2:end));

Plot the S&P 500 returns.

plot(diff(LTT.log_SP))
axis tight

The plot indicates that the returns have possible conditional heteroscedasticity.

Conduct separate tests for whether the series is a random walk using periods 2, 4, and 8. For each period, conduct separate tests assuming the innovations are iid and without the assumption. Return the variance ratios of each test, and compute the first-order autocorrelation of the returns from the first ratio.

q = [2 4 8 2 4 8];
iid = logical([1 1 1 0 0 0]);
[StatTbl,ratio] = vratiotest(LTT,Period=q,IID=iid,DataVariable="log_SP")
StatTbl=6×7 table
h       pValue       stat      cValue    Alpha    Period     IID
_____    ________    ________    ______    _____    ______    _____

Test 1    false     0.56704     0.57242     1.96     0.05       2       true
Test 2    false     0.33073    -0.97265     1.96     0.05       4       true
Test 3    true     0.030933     -2.1579     1.96     0.05       8       true
Test 4    false     0.70045     0.38471     1.96     0.05       2       false
Test 5    false     0.50788    -0.66214     1.96     0.05       4       false
Test 6    false     0.13034     -1.5128     1.96     0.05       8       false

ratio = 6×1

1.0111
0.9647
0.8763
1.0111
0.9647
0.8763

rho1 = ratio(1) - 1 % First-order autocorrelation of returns
rho1 = 0.0111

StatTbl.h indicates that the test fails to reject that the series is a random walk at 5% level, except in the case where period = 8 and IID = true. This rejection is likely due to the test not accounting for the heteroscedasticity.

## Input Arguments

collapse all

Univariate time series data in levels, specified as a numeric vector. Each element of y represents an observation.

Data Types: double

Time series data, specified as a table or timetable. Each row of Tbl is an observation.

Specify a single series (variable) to test by using the DataVariable argument. The selected variable must be numeric.

Note

• vratiotest removes missing observations, represented by NaN values, from the input series.

• vratiotest assumes that the specified input data is in levels. To convert a return series r to levels, define y(1) appropriately and let y = cumsum([y(1) r]).

### Name-Value Arguments

Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Before R2021a, use commas to separate each name and value, and enclose Name in quotes.

Example: vratiotest(Tbl,DataVariable="GDP",Alpha=0.025,IID=[false true]) conducts two tests, at a level of significance of 0.025, on the variable GDP of the table Tbl. The first test does not assume that the innovations series is iid and the second test assumes that the innovations series is iid.

Period q used to create overlapping return horizons for the variance ratio, specified as an integer that is greater than 1 and less T/2 or a vector of such integers, where T is the effective sample size of yt.

When Period = 2 (the default), the first-order autocorrelation of the returns is asymptotically equal to ratio − 1.

vratiotest conducts a separate test for each value in Period.

Example: Period=2:4 runs three tests; the first test sets Period to 2, the second test sets Period to 3, and the third test sets Period to 4.

Data Types: double

Flag for whether to assume the innovations are iid, specified as a value in this table or a vector of such values.

ValueDescription
false

Innovations are not iid; the alternative hypothesis is the innovations series εt is a correlated series.

Set false when the input series is a long-term macroeconomic or financial price series because often, for such series, the iid assumption is unreasonable and rejection of the random-walk null hypothesis is due to heteroscedasticity is uninteresting.

true

Innovations are iid; the alternative hypothesis is εt is a dependent or not identically distributed series (for example, heteroscedastic).

Set true to strengthen the random-walk null hypothesis.

vratiotest conducts a separate test for each value in IID.

Example: IID=true

Data Types: double

Nominal significance level for the hypothesis test, specified as a numeric scalar in the interval (0,1) or a numeric vector of such values.

vratiotest conducts a separate test for each value in Alpha.

Example: Alpha=[0.01 0.05] uses a level of significance of 0.01 for the first test, and then uses a level of significance of 0.05 for the second test.

Data Types: double

Variable in Tbl to test, specified as a string scalar or character vector containing a variable name in Tbl.Properties.VariableNames, or an integer or logical vector representing the index of a name. The selected variable must be numeric.

Example: DataVariable="GDP"

Example: DataVariable=[false true false false] or DataVariable=2 tests the second table variable.

Data Types: double | logical | char | string

Note

• If you perform sequential testing using multiple values of q (Period), small-sample size distortions, beyond those that result from the asymptotic approximation of critical values, can result [2].

• When vratiotest conducts multiple tests, the function applies all single settings (scalars or character vectors) to each test.

• All vector-valued specifications that control the number of tests must have equal length.

• If you specify the vector y and any value is a row vector, all outputs are row vectors.

## Output Arguments

collapse all

Test rejection decisions, returned as a logical scalar or vector with length equal to the number of tests. vratiotest returns h when you supply the input y.

• Values of 1 indicate rejection of the random-walk null hypothesis in favor of the alternative.

• Values of 0 indicate failure to reject the random-walk null hypothesis.

Test statistic p-values, returned as a numeric scalar or vector with length equal to the number of tests. vratiotest returns pValue when you supply the input res.

p-values are standard normal probabilities.

Test statistics, returned as a numeric scalar or vector with length equal to the number of tests. vratiotest returns stat when you supply the input y.

Test statistics are asymptotically standard normal.

Critical values, returned as a numeric scalar or vector with length equal to the number of tests. vratiotest returns cValue when you supply the input y.

Critical values are for two-tail probabilities.

Test summary, returned as a table with variables for the outputs h, pValue, stat, and cValue, and with a row for each test. vratiotest returns StatTbl when you supply the input Tbl.

StatTbl contains variables for the test settings specified by Period, Alpha, and IID.

Variance ratios, returned as a numeric vector with length equal to the number of tests. Each ratio is the ratio of the following quantities:

• The variance of the q-fold overlapping return horizon

• q times the variance of the return series

For a random walk, the ratios are asymptotically equal to one. For a mean-reverting series, the ratios are less than one. For a mean-averting series, the ratios are greater than one.

collapse all

### Variance Ratio Test

The variance ratio test assesses the null hypothesis that a univariate time series yt is a random walk. The null model is

yt = c + yt–1 + εt,

where c is a drift constant and εt is an uncorrelated innovations series with zero mean.

• When the innovations are not iid (the IID argument is false), the alternative is εt is a correlated series.

• When innovations are iid (IID is true), the alternative is εt is either a dependent or not identically distributed series (for example, heteroscedastic).

The test statistic is based on a ratio of variance estimates of returns rt = ytyt−1 and period q (Period argument) return horizons t + … + rtq+1.

The variance ratio (ratio output) is for a test is

$\frac{\text{VAR}\left({r}_{t}+...+{r}_{t-q+1}\right)}{q\text{VAR}\left({r}_{t}\right)}.$

The horizon overlaps to increase the efficiency of the estimator and power of the test. Under either null hypothesis, an uncorrelated εt series implies that the period q variance is asymptotically equal to q times the period 1 variance. However, the variance of the ratio depends on the degree of heteroscedasticity, and, therefore, the variance of the ratio depends on the null hypothesis.

Rejection of the null hypothesis due to dependence of the innovations does not imply that the εt are correlated. If the innovations are dependent, nonlinear functions of εt can be correlated, regardless of whether εt are correlated. For example, if Cov(εt,εtk) = 0 for all k ≠ 0, a k ≠ 0 can exist such that Cov(εt2,εtk2) ≠ 0.

The test is two-tailed; therefore, the test rejects the random-walk null hypothesis when the test statistic is outside of the critical interval [−cValue,cValue]. Each tail outside of the critical interval has probability Alpha/2.

## Tips

• The test finds the largest integer n such that nq ≤ T – 1, where q is the vaule of the Period argument and T is the sample size. Then, the test discards the final (T–1) – nq observations. To include these final observations, remove the initial (T–1) – nq observations from the input series before you run the test.

## References

[1] Campbell, J. Y., A. W. Lo, and A. C. MacKinlay. Chapter 12. “The Econometrics of Financial Markets.” Nonlinearities in Financial Data. Princeton, NJ: Princeton University Press, 1997.

[2] Cecchetti, S. G., and P. S. Lam. “Variance-Ratio Tests: Small-Sample Properties with an Application to International Output Data.” Journal of Business and Economic Statistics. Vol. 12, 1994, pp. 177–186.

[3] Cochrane, J. “How Big is the Random Walk in GNP?” Journal of Political Economy. Vol. 96, 1988, pp. 893–920.

[4] Faust, J. “When Are Variance Ratio Tests for Serial Dependence Optimal?” Econometrica. Vol. 60, 1992, pp. 1215–1226.

[5] Lo, A. W., and A. C. MacKinlay. “Stock Market Prices Do Not Follow Random Walks: Evidence from a Simple Specification Test.” Review of Financial Studies. Vol. 1, 1988, pp. 41–66.

[6] Lo, A. W., and A. C. MacKinlay. “The Size and Power of the Variance Ratio Test.” Journal of Econometrics. Vol. 40, 1989, pp. 203–238.

[7] Lo, A. W., and A. C. MacKinlay. A Non-Random Walk Down Wall St. Princeton, NJ: Princeton University Press, 2001.

## Version History

Introduced in R2009b