我有 10 年每日股市数据框 df
,其中包含 Date
、Open
、Close
列。
我想计算收盘价
的每日标准差。为此,数学公式为:
第一步:计算收盘价
每日日间变化
步骤2:接下来,计算最近1年数据的每日日间变化(从步骤1计算)的每日标准差
目前,我已经按照下面的代码弄清楚了Step1。 Interday_Close_change
列计算每行与一天前的值之间的差异。
df = pd.DataFrame(data, columns=columns)
df['Close_float'] = df['Close'].astype(float)
df['Interday_Close_change'] = df['Close_float'].diff()
df.fillna('', inplace=True)
问题:
(a)。如何获取 Daily_SD
列来查找过去 252 天(即 1 年的交易日)的标准差?在 Excel 上,我们使用公式 STDEV.S()
来执行此操作。
(b)。 Daily_SD
应从数据的第 252 行开始,因为此时数据将有 252 个数据点可供计算。我如何认识到这一点?
最佳答案
您似乎正在尝试计算滚动标准差,滚动窗口由之前的 252 行组成。
Pandas 有很多 .rolling()
methods ,包括标准差:
df['Daily_SD'] = df['Interday_Close_change'].rolling(252).std().shift()
如果可用于计算标准差的行数少于 252 行,则该行的结果将为空值 (NaN
)。考虑一下您是否真的想应用 .fillna('')
方法来填充 null 值,就像您正在做的那样。这会将整个列从数字 (float
) 数据类型转换为 object
数据类型。
如果没有.shift()
方法,当前行的值将包含在计算中。 .shift()
方法会将所有滚动标准差值下移 1 行,因此当前行的结果将是前 252 行的标准差,如您所愿。
对于 pandas
版本 >= 1.2,您可以使用它:
df['Daily_SD'] = df['Interday_Close_change'].rolling(252, closed='left').std()
close=left
参数将从计算中排除窗口中的最后一个点。
关于Python数据帧: Standard deviation of last one year of data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72251703/