手动计算波动率与内置函数不一样

如何解决手动计算波动率与内置函数不一样

有人可以帮助我了解我错了吗?我不知道为什么每一栏的波动率都不同...

这是我的代码的示例:

from math import sqrt
from numpy import around
from numpy.random import uniform
from pandas import DataFrame
from statistics import stdev

data = around(a=uniform(low=1.0,high=50.0,size=(500,1)),decimals=3)
df = DataFrame(data=data,columns=['close'],dtype='float64')
df.loc[:,'delta'] = df.loc[:,'close'].pct_change().fillna(0).round(3)

volatility = []

for index in range(df.shape[0]):
    if index < 90:
        volatility.append(0)
    else:
        start = index - 90
        stop = index + 1
        volatility.append(stdev(df.loc[start:stop,'delta']) * sqrt(252))

df.loc[:,'volatility1'] = volatility
df.loc[:,'volatility2'] = df.loc[:,'delta'].rolling(window=90).std(ddof=0) * sqrt(252)

print(df)

      close   delta  volatility1  volatility2
0    10.099   0.000     0.000000          NaN
1    26.331   1.607     0.000000          NaN
2    32.361   0.229     0.000000          NaN
3     2.068  -0.936     0.000000          NaN
4    36.241  16.525     0.000000          NaN
..      ...     ...          ...          ...
495  48.015  -0.029    46.078037    46.132943
496   6.988  -0.854    46.036210    46.178820
497  23.331   2.339    46.003184    45.837245
498  25.551   0.095    45.608260    45.792188
499  46.248   0.810    45.793012    45.769787

[500 rows x 4 columns]

非常感谢您!

解决方法

需要进行三个小更改。内联添加评论。由于包含端点,因此需要89(与许多其他python东西不同)。需要ddof=1,因为stdev默认使用它。 This article讨论的是numpy std而不是stdev,但是ddof在做什么的理论仍然相同。

此外,将来尝试将大小更改为95。调试时不需要其他405行,很高兴看到从0 / NaN转换为实际波动率,看到需要89而不是90

0与NaN的差异仍然存在。这是因为您附加了0并滚动了默认行为。我不确定这是否是故意的,所以我离开了。

from math import sqrt
from numpy import around
from numpy.random import uniform
from pandas import DataFrame
from statistics import stdev

data = around(a=uniform(low=1.0,high=50.0,size=(500,1)),decimals=3)
df = DataFrame(data=data,columns=['close'],dtype='float64')
df['delta'] = df['close'].pct_change().fillna(0).round(3)

volatility = []

for index in range(df.shape[0]):
    if index < 89: #change to 89
        volatility.append(0)
    else:
        start = index - 89 #change to 89
        stop = index
        volatility.append(stdev(df.loc[start:stop,'delta']) * sqrt(252))

df['volatility1'] = volatility
df['volatility2'] = df.loc[:,'delta'].rolling(window=90).std(ddof=1) * sqrt(252) #change to ddof=1

print(df)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?