簡體   English   中英

為什么我在計算波動率時得到 NaN?

[英]Why I got NaN when computing volatility?

我正在嘗試按照本文中的方程式計算功率時間序列數據的歷史波動率。

數據的統計描述如下:

count    9855.000000
mean      291.135088
std       187.503344
min         0.000000
25%       112.408512
50%       332.370871
75%       449.527323
max       601.370058

這是我的實現:


# Computing Volatility
window_size=27
VOLATILITY = pd.DataFrame()
VOLATILITY['PV']= data
#'intra-hour
# Compute the logarithmic value  
VOLATILITY['Log_IA'] = np.log(VOLATILITY['PV'] / VOLATILITY['PV'].shift(1))
# Compute Volatility using the pandas rolling standard deviation function
VOLATILITY['intra-hour'] = VOLATILITY['Log_IA'].rolling(window=window_size).std() * np.sqrt(window_size)# *100

我的數據有 1 年的半小時觀察,每天 27 步

這是我在選定的 1 天得到的 output 的示例,其中存在 NaN 問題

    
Timestamp           PV          Log_IA     intra-hour
2019-03-01 06:00:00 0.000000    NaN         NaN
2019-03-01 06:30:00 2.946333    inf         NaN
2019-03-01 07:00:00 20.963667   1.962229    NaN
2019-03-01 07:30:00 38.284333   0.602250    NaN
2019-03-01 08:00:00 38.224667   -0.001560   NaN
2019-03-01 08:30:00 54.486667   0.354475    NaN
2019-03-01 09:00:00 54.608333   0.002230    NaN
2019-03-01 09:30:00 55.290667   0.012418    NaN
2019-03-01 10:00:00 54.317333   -0.017761   NaN
2019-03-01 10:30:00 54.680333   0.006661    NaN
2019-03-01 11:00:00 42.142333   -0.260451   NaN
2019-03-01 11:30:00 44.569000   0.055986    NaN
2019-03-01 12:00:00 36.988333   -0.186436   NaN
2019-03-01 12:30:00 35.802000   -0.032599   NaN
2019-03-01 13:00:00 29.006667   -0.210478   NaN
2019-03-01 13:30:00 43.254333   0.399572    NaN
2019-03-01 14:00:00 45.246333   0.045024    NaN
2019-03-01 14:30:00 29.768333   -0.418676   NaN
2019-03-01 15:00:00 37.510667   0.231180    NaN
2019-03-01 15:30:00 31.937000   -0.160860   NaN
2019-03-01 16:00:00 39.990333   0.224873    NaN
2019-03-01 16:30:00 32.263000   -0.214717   NaN
2019-03-01 17:00:00 40.707333   0.232487    NaN
2019-03-01 17:30:00 14.551333   -1.028726   NaN
2019-03-01 18:00:00 10.294333   -0.346089   NaN
2019-03-01 18:30:00 2.552667    -1.394455   NaN
2019-03-01 19:00:00 0.036333    -4.252158   NaN

那么,為什么我會因為波動性而得到 NaN?

我的實施有問題嗎?

您的實現是這樣的,無論PV的值如何,您總是會為Log_IA的第零個值獲得NaN 這是轉變的結果,可以通過運行以下代碼段來確認:

import numpy as np
import pandas as pd


VOLATILITY = pd.DataFrame()
VOLATILITY['PV'] = (1.0, 2.0, 3.0)
VOLATILITY['Log_IA'] = np.log(VOLATILITY['PV'] / VOLATILITY['PV'].shift(1))

你會看到VOLATILITY是:

    PV    Log_IA
0  1.0       NaN
1  2.0  0.693147
2  3.0  0.405465

Log_IA的第零個值是NaN ,因為您正在划分\日志{1.0} PV的前一個值,即索引 -1 處的PV值。 這就是shift()所做的,但是索引 -1 沒有值,所以你得到一個NaN 您可以使用fill_value參數設置一個值來代替任何不存在的值: shift(1, fill_value=123) 當前一個索引的PV值為 0 時,您還將獲得Log_IA的任何值的inf

那么,為什么你會得到所有intra-hour值的NaN呢? 您采用VOLATILITY['Log_IA'].rolling(window=window_size)的滾動標准偏差,它在索引 0 處包含inf ,對於包含inf的序列,標准偏差是未定義的。 所以滾動標准偏差是NaN ,任何使用NaN的算術運算都會導致NaN

現在,你也有一個問題\日志{0}在你的代碼中。 對於小於或等於 0 的值,對數未定義,但這不是導致您的NaN的原因。

https://www.varsitytutors.com/hotmath/hotmath_help/topics/logarithmic-functions.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM