Вычисление волатильности курса акций из 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 дней, где x получено из поля ввода, и x не должно быть больше, чем количество наблюдений.

Шаги, которые необходимо предпринять:

  • Рассчитать возврат журнала для каждой строки
  • Возьмите эти результаты и запустите стандартное отклонение поверх него.
  • Умножьте на квадратный корень из 255, чтобы нормализовать годовую волатильность.

person Spurious    schedule 08.08.2016    source источник
comment
Пожалуйста, предоставьте сообщение об ошибке, которое вы получили, когда сказали: «Это уже дает сбой».   -  person albert    schedule 08.08.2016
comment
Похоже, нужно data.reset_index(inplace=True), потому что первый столбец индекс.   -  person jezrael    schedule 08.08.2016
comment
добавил сообщение об ошибке. Сброс индекса не устранил ошибку. Может я не туда поставил? Ставлю прямо перед сортировкой.   -  person Spurious    schedule 08.08.2016
comment
Можете ли вы запустить print(data.columns) перед сортировкой (сразу после чтения файла)   -  person ayhan    schedule 08.08.2016
comment
Да, это работает, и вывод: Index(['DATE', 'TICKER', 'PRICE'], dtype='object')   -  person Spurious    schedule 08.08.2016
comment
С этим файлом и кодом, который вы предоставили, я не могу воспроизвести вашу проблему. Это работает нормально. Может еще раз попробовать отсортировать?   -  person ayhan    schedule 08.08.2016
comment
Хорошо, спасибо, это должно быть в .csv, потому что, если я использую более короткую версию, которую я указал выше, она работает нормально.   -  person Spurious    schedule 08.08.2016
comment
Теперь мне нужно только рассчитать доходность и волатильность. Я отредактировал свой исходный пост, чтобы отразить только текущие проблемы.   -  person Spurious    schedule 08.08.2016
comment
Итак... что вы пробовали?   -  person Wayne Werner    schedule 08.08.2016
comment
stackoverflow.com/questions/31287552/ Что делается здесь, но 'DataFrame' object has no attribute 'price' это неправда, у меня есть столбец с названием цена.   -  person Spurious    schedule 08.08.2016
comment
хорошо, я не написал это заглавными буквами, что вызвало ошибку. Теперь мне нужно только получить волатильность x-day   -  person Spurious    schedule 08.08.2016


Ответы (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.

Вероятно, не самый элегантный, и извините, если я неправильно понял вашу просьбу.

person sk877    schedule 08.08.2016
comment
Я все еще получаю ошибку, и я думаю, что это связано с тем, что набор данных слишком велик. Я постараюсь заставить его работать и посмотреть, решит ли это ваше решение. - person Spurious; 08.08.2016
comment
Тем временем я исправил свою проблему, и ваш код полезен. Проблема в том, что я не могу ввести дату. - person Spurious; 09.08.2016