Nota:
Es computacionalmente sencillo determinar la volatilidad de cualquier serie de rendimientos, por lo que, de hecho, puede no ser necesaria esta aproximación.
Empecemos por la rentabilidad anualizada $r_a$ que es $$r_a = \sqrt[T]{1+R_t}-1$$
donde $R_t$ es el rendimiento acumulado durante todo el período $[0,T]$ . Consideremos la aproximación de Taylor $$log(1+y) = y - \frac{1}{2}y^2 + \frac{1}{3}y^3 - \frac{1}{4}y^4 +...$$
Tomando los dos primeros términos, se obtiene: $$log(1+r_a) \approx r_a - \frac{1}{2}\sigma_{r_a}^2$$
Sin embargo, si $r_a$ no es aproximadamente cero, el error se hace grande. La siguiente imagen muestra este error $log(1+y) - y$ dentro del intervalo $y \in [-0.8,0.8]$ :
Si cualquier rendimiento anualizado $r_a$ es menor que -39% o mayor que 52%, ¡el error de la aproximación supera el 10%!
Además, la mayoría de los rendimientos de los activos financieros tienen asimetría y leptocurtosis negativas, por lo que la aproximación anterior está sesgada al alza. De hecho, se puede ajustar por esto y utilizar la fórmula $$log(1+r_a) \approx r_a - k\frac{1}{2}\sigma_{r_a}^2$$ donde $k$ es un factor empírico (a menudo entre 5 y 10), véase aquí .
Reordenando se obtiene una aproximación a la volatilidad de la serie de rendimientos: $$\sigma_{r_a} \approx \sqrt{\frac{2r_a - 2log(1+r_a)}{k}}$$
EDITAR
OP está preguntando sobre cómo ajustar una curva de $\sigma(R_T)$ en términos de $T$ . Permítame proporcionarle los resultados de una simulación realizada en R. Utilizo 100.000 rendimientos diarios siguiendo una distribución normal $N(0.01/252, 0.005)$ por lo que asumo una rentabilidad media del 1% anual con una desviación estándar del 7,94% ( $0.005 \cdot \sqrt{252}$ ):
set.seed(100)
r = rnorm(100000, .01/252, .005)
## Vector containing the cumulative simple return up to T
cum <- vector(mode = "numeric", length = 100000)
## Vector containing the volatility up to T
vola <- vector(mode = "numeric", length = 100000)
for(i in 1:100000){cum[i] <- prod(1+r[1:i])}
for(i in 1:100000){vola[i] <- sd(cum[1:i])}
## vola[1] is NA due to vola[1] <- sd(cum[1:1]),
## so we set it to zero
vola[1] <- 0
summary(cum)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.8405 1.2581 2.1961 5.1116 5.0303 36.2721
summary(vola)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0000 0.1775 0.4096 1.1516 1.1164 6.3274
La siguiente imagen muestra la variable vola
es decir $\sigma (R_T)$ para $T \in [0; 100,000]$ :
Vemos que $\sigma (R_T)$ es no lineal y creciente en el tiempo. Implemento la regresión sugerida por usted $$\sigma(R_T)\sim aT^\alpha + b$$ utilizando el tiempo $T$ con pasos simples de $\frac{1}{100,000}$ , lo que da como resultado:
## set up variable time
time <- seq(0, 1, 0.00001)
## eliminate first value of time which is zero,
## so we have single time steps of 1/100,000
time <- time[-1]
reg <- nls(vola ~ a*(time^alpha)+b, start = list(a=1, alpha=1, b=1))
summary(reg)
Parameters:
Estimate Std. Error t value Pr(>|t|)
a 5.914458 0.003736 1582.9 <2e-16 ***
b 0.208985 0.001096 190.7 <2e-16 ***
alpha 5.274693 0.006115 862.6 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.245 on 99997 degrees of freedom
Number of iterations to convergence: 7
Achieved convergence tolerance: 1.396e-06
En resumen, el modelo de regresión no lineal que sugieres parece ser útil. Sin embargo, mis valores de partida se eligieron al azar, por lo que podría intentar evaluar si otras configuraciones no afectan demasiado a los resultados. Tal vez quiera probar el glmulti Paquete R que implementa esto Selección automática de modelos con modelos lineales (generalizados) .