2016-08-08 15 views
-1

Я ищу способ, чтобы сделать следующий код работы:Расчет волатильности цен на акции из CSV 3 столбцов

import pandas 

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

У меня есть 2 двумерный массив с тремя столбцами, данные выглядит следующим образом:

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 

Теперь я хочу, чтобы вычислить х дни поняли, волатильность, где х пришла из поля ввода и й не должен быть больше, чем число наблюдений.

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

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

Просьба сообщить сообщение об ошибке, которое вы получили, как вы сказали: «Это уже сбой там». – albert

+0

Похоже на необходимость 'data.reset_index (inplace = True)', потому что первый столбец является индексом. – jezrael

+0

добавлено сообщение об ошибке. Индекс сброса не уменьшил ошибку. Может, я поместил его в неправильное место? Я поставил это прямо перед тем видом. – Spurious

ответ

0

Извините, но не совсем ясно, на какой результат вы надеетесь, поэтому я предположил, что вы хотите ввести тикер и период (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]) 

В качестве примера, с входом т («PCG», 6) выход 0,187855386042

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

+0

Я все еще получаю ошибку, и я думаю, что это связано с тем, что набор данных слишком велик. Я попытаюсь заставить его работать и посмотреть, не решит ли ваше решение его решение. – Spurious

+0

Тем временем я исправил свою проблему, и ваш код полезен. Проблема здесь в том, что я не могу ввести дату. – Spurious