2016-08-08 4 views
-1

Je cherche un moyen de faire fonctionner le code suivant:Calcul de la volatilité des cours des actions d'un 3 colonnes 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 

J'ai un tableau à 2 dimensions avec trois colonnes, les données se présente comme suit:

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 

maintenant, je veux calculer la volatilité réalisée x jour où x est venu d'un champ d'entrée et x ne devraient pas être plus grand que le nombre d'observations.

Les mesures qui doivent être prises:

  • Calculer le retour du journal pour chaque ligne
  • Prenez ces déclarations et exécutez l'écart-type au-dessus de celui-ci
  • Multiplier par la racine carrée de 255 Normaliser pour volatilité par an
+1

Veuillez fournir le message d'erreur que vous avez reçu comme vous l'avez dit 'Il plante déjà'. – albert

+0

Il semble que vous ayez besoin de 'data.reset_index (inplace = True)', car la première colonne est index. – jezrael

+0

a ajouté le message d'erreur. L'index de réinitialisation n'a pas atténué l'erreur. Peut-être que je l'ai mis au mauvais endroit? Je l'ai mis juste avant le genre. – Spurious

Répondre

0

Excuses, ce n'est pas clair sur le type de sortie que vous espérez, donc j'ai supposé que vous voulez entrer un ticker et un point (x) et voir la curr nombre de volatilité. Ci-dessous, j'ai également utilisé numpy, au cas où vous n'avez pas cette bibliothèque. Essentiellement, j'ai créé un DataFrame de toutes les données d'origine et ensuite un nouveau DF filtré pour le ticker donné (où l'utilisateur doit seulement taper dans la partie 'A' ou 'PCG', parce que 'UN Equity' est supposé constant). Dans ce nouveau DF, après avoir vérifié que l'entrée de votre période (x) n'est pas trop élevée, vous obtiendrez la plus récente valeur de volatilité annualisée.

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]) 

À titre d'exemple, avec une entrée de vol (« PCG », 6) la sortie est 0,187855386042

Probablement pas le plus élégant et des excuses si je l'ai mal compris votre demande.

+0

Je reçois toujours l'erreur et je pense que c'est dû au fait que l'ensemble de données est trop grand. Je vais essayer de le faire fonctionner et de voir si votre solution le résoudra également. – Spurious

+0

En attendant, j'ai corrigé mon problème et votre code est utile. Le problème ici est que je ne peux pas entrer de date. – Spurious