Расчет волатильности цены акций из 3-х столбцов CSV
Я ищу способ заставить следующий код работать:
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-day, где x пришло из поля ввода, а x не должно быть больше, чем количество наблюдений.
Шаги, которые необходимо предпринять:
- Рассчитать возврат журнала для каждой строки
- Возьмите эти возвращения и запустите стандартное отклонение сверху
- Умножьте на квадратный корень из 255, чтобы нормализовать годовую волатильность
1 ответ
Извините, не совсем ясно, на какой результат вы рассчитываете, поэтому я предположил, что вы хотите ввести тикер и точку (x) и посмотреть текущее число волатильности. Ниже я также использовал numpy, если у вас нет этой библиотеки.
По сути, я создал DataFrame из всех исходных данных, а затем новый DF, отфильтрованный для заданного тикера (где пользователю нужно только ввести часть "A" или "PCG", потому что "UN Equity" предполагается постоянным), В этом новом DF, после проверки того, что ваш входной период (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.
Наверное, не самый элегантный и извиняюсь, если я неправильно понял ваш запрос.