<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
As promised, here's my attempt at incorporating it into the original
volatility() function (for the sake of testing, I've renamed the new
function volatility2(..). Thanks to Murali for the suggestion to use
apply.rolling, I've added in a few new variables in the function
definition. So far it seems to work well here.<br>
<br>
volatility2 &lt;- function (OHLC, n = 10, N = 260, calc = "close",
roundValue=FALSE, roundNum=2, normalize=FALSE, nonOHLC=FALSE, ...) <br>
{<br>
&nbsp;&nbsp;&nbsp; if (nonOHLC == FALSE) {<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; OHLC &lt;- try.xts(OHLC, error = as.matrix)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; calc &lt;- match.arg(calc, c("close", "garman.klass",
"parkinson", <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "rogers.satchell"))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (calc == "close") {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;r &lt;- ROC(OHLC[, 4], 1, ...)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rBar &lt;- runSum(r, n - 1)/(n - 1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;s &lt;- sqrt(N/(n - 2) * runSum((r - rBar)^2, n - 1))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (calc == "garman.klass") {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s &lt;- sqrt(N/n * runSum(0.5 * log(OHLC[, 2]/OHLC[, 3])^2
- <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2 * log(2) - 1) * log(OHLC[, 4]/OHLC[, 1])^2, n))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (calc == "parkinson") {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s &lt;- sqrt(N/(4 * n * log(2)) * runSum(log(OHLC[,
2]/OHLC[, <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3])^2, n))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (calc == "rogers.satchell") {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s &lt;- sqrt(N/n * runSum(log(OHLC[, 2]/OHLC[, 4]) *
log(OHLC[, <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2]/OHLC[, 1]) + log(OHLC[, 3]/OHLC[, 4]) * log(OHLC[, <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3]/OHLC[, 1]), n))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; } else {<br>
&nbsp;&nbsp;&nbsp; #still using the OHLC object, since this is indeed a matrix<br>
&nbsp;&nbsp;&nbsp; # diff(log(OHLC)) provides the same output as ROC(x,1) so we should
be goog. Thanks to Murali Menon<br>
&nbsp;&nbsp;&nbsp; # for the suggested use of apply.rolling <br>
&nbsp;&nbsp;&nbsp; s &lt;- apply.rolling(R = diff(log(OHLC)), width=n, FUN="sd",
na.pad=FALSE) * sqrt(N)<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; if (roundValue == TRUE) {<br>
&nbsp;&nbsp;&nbsp; s &lt;- round(s, roundNum)<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; if (normalize == TRUE) {<br>
&nbsp;&nbsp;&nbsp; s &lt;- s * 100<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; reclass(s, OHLC)<br>
}<br>
<br>
<br>
Cedrick Johnson wrote:
<blockquote cite="mid:4ABA9629.5020703@cedrickjohnson.com" type="cite"><font
 size="-1"><font face="Calibri">Howdy-<br>
  <br>
I came up with some code that has served me well, perhaps if anyone
runs into the problem of needing to calculate historical
volatility(close) on a non-OHLC series (or a bunch of "univariate"
series stored in a matrix):<br>
  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; US2Y US5Y US10Y US30Y UKG5 UKG10 USSP2 USSP5 USSP10 USSP30<br>
2009-01-02 0.88 1.72&nbsp; 2.46&nbsp; 2.83 2.67&nbsp; 3.36&nbsp; 1.50&nbsp; 2.17&nbsp;&nbsp; 2.61&nbsp;&nbsp; 2.78<br>
2009-01-05 0.78 1.67&nbsp; 2.49&nbsp; 3.00 2.75&nbsp; 3.47&nbsp; 1.60&nbsp; 2.31&nbsp;&nbsp; 2.82&nbsp;&nbsp; 3.03<br>
2009-01-06 0.80 1.68&nbsp; 2.51&nbsp; 3.04 2.79&nbsp; 3.57&nbsp; 1.55&nbsp; 2.34&nbsp;&nbsp; 2.88&nbsp;&nbsp; 3.18<br>
2009-01-07 0.82 1.66&nbsp; 2.52&nbsp; 3.05 2.80&nbsp; 3.60&nbsp; 1.44&nbsp; 2.16&nbsp;&nbsp; 2.69&nbsp;&nbsp; 2.99<br>
....<br>
blahblah..<br>
  <br>
I adapted the code to use 'close' from Josh Ulrich's volatility
function (since all of these are closing prices), and here's my result:<br>
  <br>
volatility.matrix &lt;- function(Matrix, n = 10, N = 252, pretty=TRUE,
...) {<br>
&nbsp;&nbsp;&nbsp; volm &lt;- Matrix<br>
&nbsp;&nbsp;&nbsp; for(i in 1:ncol(Matrix)) {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; r &lt;- ROC(Matrix[,i], 1,...)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rBar &lt;- runSum(r, n -1)/(n - 1)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s &lt;- sqrt(N/(n - 2) * runSum((r - rBar)^2, n - 1))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; #because i like to make it pretty<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; volm[,i] &lt;- round(s,2) * 100<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; volm &lt;- na.omit(volm)<br>
&nbsp;&nbsp;&nbsp; reclass(volm, Matrix)<br>
}<br>
  <br>
  <br>
The Result:<br>
&gt; volatility.matrix(Yields, n=30)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; US2Y US5Y US10Y US30Y UKG5 UKG10 USSP2 USSP5 USSP10 USSP30<br>
2009-03-24&nbsp; 116&nbsp; 110&nbsp;&nbsp;&nbsp; 73&nbsp;&nbsp;&nbsp; 45&nbsp;&nbsp; 54&nbsp;&nbsp;&nbsp; 57&nbsp;&nbsp;&nbsp; 67&nbsp;&nbsp;&nbsp; 65&nbsp;&nbsp;&nbsp;&nbsp; 60&nbsp;&nbsp;&nbsp;&nbsp; 51<br>
2009-03-25&nbsp; 115&nbsp; 112&nbsp;&nbsp;&nbsp; 75&nbsp;&nbsp;&nbsp; 46&nbsp;&nbsp; 51&nbsp;&nbsp;&nbsp; 55&nbsp;&nbsp;&nbsp; 67&nbsp;&nbsp;&nbsp; 65&nbsp;&nbsp;&nbsp;&nbsp; 60&nbsp;&nbsp;&nbsp;&nbsp; 51<br>
2009-03-26&nbsp; 114&nbsp; 110&nbsp;&nbsp;&nbsp; 74&nbsp;&nbsp;&nbsp; 44&nbsp;&nbsp; 50&nbsp;&nbsp;&nbsp; 55&nbsp;&nbsp;&nbsp; 65&nbsp;&nbsp;&nbsp; 64&nbsp;&nbsp;&nbsp;&nbsp; 60&nbsp;&nbsp;&nbsp;&nbsp; 50<br>
2009-03-27&nbsp; 114&nbsp; 110&nbsp;&nbsp;&nbsp; 74&nbsp;&nbsp;&nbsp; 44&nbsp;&nbsp; 50&nbsp;&nbsp;&nbsp; 55&nbsp;&nbsp;&nbsp; 67&nbsp;&nbsp;&nbsp; 64&nbsp;&nbsp;&nbsp;&nbsp; 60&nbsp;&nbsp;&nbsp;&nbsp; 51<br>
2009-03-30&nbsp; 111&nbsp; 104&nbsp;&nbsp;&nbsp; 68&nbsp;&nbsp;&nbsp; 39&nbsp;&nbsp; 52&nbsp;&nbsp;&nbsp; 55&nbsp;&nbsp;&nbsp; 67&nbsp;&nbsp;&nbsp; 63&nbsp;&nbsp;&nbsp;&nbsp; 58&nbsp;&nbsp;&nbsp;&nbsp; 51<br>
2009-03-31&nbsp; 107&nbsp; 100&nbsp;&nbsp;&nbsp; 68&nbsp;&nbsp;&nbsp; 39&nbsp;&nbsp; 51&nbsp;&nbsp;&nbsp; 55&nbsp;&nbsp;&nbsp; 67&nbsp;&nbsp;&nbsp; 63&nbsp;&nbsp;&nbsp;&nbsp; 58&nbsp;&nbsp;&nbsp;&nbsp; 50<br>
2009-04-01&nbsp; 107&nbsp; 100&nbsp;&nbsp;&nbsp; 67&nbsp;&nbsp;&nbsp; 38&nbsp;&nbsp; 51&nbsp;&nbsp;&nbsp; 54&nbsp;&nbsp;&nbsp; 67&nbsp;&nbsp;&nbsp; 62&nbsp;&nbsp;&nbsp;&nbsp; 57&nbsp;&nbsp;&nbsp;&nbsp; 49<br>
2009-04-02&nbsp; 107&nbsp; 100&nbsp;&nbsp;&nbsp; 67&nbsp;&nbsp;&nbsp; 37&nbsp;&nbsp; 58&nbsp;&nbsp;&nbsp; 57&nbsp;&nbsp;&nbsp; 65&nbsp;&nbsp;&nbsp; 61&nbsp;&nbsp;&nbsp;&nbsp; 56&nbsp;&nbsp;&nbsp;&nbsp; 48<br>
......<br>
  <br>
What I get is a nice matrix of volatilities in a pretty format
(rounded, etc.)<br>
  <br>
I'll give it a shot tonight trying to implement it into the current
volatility function, however I'm sure the code that I have here could
be done better.<br>
  <br>
Regards,<br>
c<br>
  <br>
  <br>
  </font></font>
  <pre wrap="">
<hr size="4" width="90%">
_______________________________________________
<a class="moz-txt-link-abbreviated" href="mailto:R-SIG-Finance@stat.math.ethz.ch">R-SIG-Finance@stat.math.ethz.ch</a> mailing list
<a class="moz-txt-link-freetext" href="https://stat.ethz.ch/mailman/listinfo/r-sig-finance">https://stat.ethz.ch/mailman/listinfo/r-sig-finance</a>
-- Subscriber-posting only.
-- If you want to post, subscribe first.</pre>
</blockquote>
<br>
</body>
</html>