【问题标题】:Calculating the stock price volatility from a 3-columns csv从 3 列 csv 计算股票价格波动率
【发布时间】:2016-08-08 11:57:34
【问题描述】:

我正在寻找使以下代码工作的方法:

import pandas

path = 'data_prices.csv'
data =  pandas.read_csv(path, sep=';')
data = data.sort_values(by=['TICKER', 'DATE'], ascending=[True, False])
data.columns

我有一个包含三列的二维数组,数据如下所示:

DATE;TICKER;PRICE
20151231;A UN Equity;41.81
20151230;A UN Equity;42.17
20151229;A UN Equity;42.36
20151228;A UN Equity;41.78
20151224;A UN Equity;42.14
20151223;A UN Equity;41.77
20151222;A UN Equity;41.22
20151221;A UN Equity;40.83
20151218;A UN Equity;40.1
20091120;PCG UN Equity;42.1
20091119;PCG UN Equity;41.53
20091118;PCG UN Equity;41.86
20091117;PCG UN Equity;42.23
20091116;PCG UN Equity;42.6
20091113;PCG UN Equity;41.93
20091112;PCG UN Equity;41.6
20091111;PCG UN Equity;42.01

现在,我想计算 x 天的实际波动率,其中 x 来自输入字段,并且 x 不应大于观察次数。

需要采取的步骤:

  • 计算每一行的日志回报
  • 获取这些回报并在其上运行标准差
  • 乘以 255 的平方根以标准化年波动率

【问题讨论】:

  • 请提供您收到的错误消息,因为您说“它已经在那里崩溃了”。
  • 看起来需要data.reset_index(inplace=True),因为第一列是索引。
  • 添加了错误信息。重置索引并没有减轻错误。也许我放错地方了?我把它放在排序之前。
  • 你能在排序前运行print(data.columns)吗(在读取文件之后)
  • 是的,可以,输出是:Index(['DATE', 'TICKER', 'PRICE'], dtype='object')

标签: python pandas stocks yield-return volatility


【解决方案1】:

抱歉,您希望的输出类型尚不完全清楚,因此我假设您想输入一个代码和一个句点 (x) 并查看当前的波动率数字。下面我也使用了 numpy,以防你没有那个库。

基本上我已经创建了一个包含所有原始数据的 DataFrame,然后为给定的代码过滤了一个新的 DF(用户只需要输入“A”或“PCG”部分,因为“UN Equity”是假定常数)。在这个新的 DF 中,在检查您的 period (x) 输入不是太高后,它将输出最近的年化波动率值。

import numpy as np
import pandas as pd

data = pd.read_csv('dump.csv', sep=';')
data = data.sort_values(by=['TICKER','DATE'],ascending=[True,True])


def vol(ticker, x):
    df = pd.DataFrame(data)
    df['pct_chg'] = df.PRICE.pct_change()
    df['log_rtn'] = np.log(1 + df.pct_chg)

    df_filtered = df[df.TICKER==ticker+' UN Equity']

    max_x = len(df_filtered) - 1
    if x > max_x:
        print('Too many periods. Reduce x')

    df_filtered['vol'] = pd.rolling_std(df_filtered.log_rtn, window=x) * (255**0.5)

    print(df_filtered.vol.iloc[-1])

例如,输入为 vol('PCG',6) 输出为 0.187855386042

如果我误解了您的要求,可能不是最优雅的道歉。

【讨论】:

  • 我仍然收到错误,我认为这是由于数据集太大。我会努力让它发挥作用,看看你的解决方案是否也能解决它。
  • 与此同时,我解决了我的问题,您的代码很有帮助。这里的问题是我无法输入日期。
猜你喜欢
  • 2021-11-09
  • 2016-04-03
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
相关资源
最近更新 更多