web-dev-qa-db-fra.com

Calcul des rendements d'une trame de données avec des données financières

J'ai une trame de données avec des données financières mensuelles:

In [89]: vfiax_monthly.head()
Out[89]: 
            year  month  day       d   open  close   high    low  volume  aclose
2003-01-31  2003      1   31  731246  64.95  64.95  64.95  64.95       0   64.95
2003-02-28  2003      2   28  731274  63.98  63.98  63.98  63.98       0   63.98
2003-03-31  2003      3   31  731305  64.59  64.59  64.59  64.59       0   64.59
2003-04-30  2003      4   30  731335  69.93  69.93  69.93  69.93       0   69.93
2003-05-30  2003      5   30  731365  73.61  73.61  73.61  73.61       0   73.61

J'essaie de calculer les retours comme ça:

In [90]: returns = (vfiax_monthly.open[1:] - vfiax_monthly.open[:-1])/vfiax_monthly.open[1:]

Mais je ne reçois que des zéros:

In [91]: returns.head()
Out[91]: 
2003-01-31   NaN
2003-02-28     0
2003-03-31     0
2003-04-30     0
2003-05-30     0
Freq: BM, Name: open

Je pense que c'est parce que les opérations arithmétiques sont alignées sur l'index et que le [1:] et [:-1] inutile.

Ma solution est la suivante:

In [103]: returns = (vfiax_monthly.open[1:].values - vfiax_monthly.open[:-1].values)/vfiax_monthly.open[1:].values

In [104]: returns = pd.Series(returns, index=vfiax_monthly.index[1:])

In [105]: returns.head()
Out[105]: 
2003-02-28   -0.015161
2003-03-31    0.009444
2003-04-30    0.076362
2003-05-30    0.049993
2003-06-30    0.012477
Freq: BM

Existe-t-il une meilleure façon de calculer les rendements? Je n'aime pas la conversion en tableau, puis de nouveau en série.

19
Daniel Velkov

Au lieu de trancher, utilisez .shift pour déplacer la position d'index des valeurs dans un DataFrame/Series. Par exemple:

returns = (vfiax_monthly.open - vfiax_monthly.open.shift(1))/vfiax_monthly.open.shift(1)

C'est quoi pct_change fait sous le capot. Vous pouvez également l'utiliser pour d'autres fonctions, par exemple:

(3*vfiax_monthly.open + 2*vfiax_monthly.open.shift(1))/5

Vous pouvez également vouloir examiner les fonctions roulement et fenêtre pour d'autres types d'analyse de données financières.

32
Matti John

La méthode la plus simple consiste à utiliser la méthode DataFrame.pct_change ().

Voici un petit exemple

In[1]: aapl = get_data_yahoo('aapl', start='11/1/2012', end='11/13/2012')

In[2]: appl
Out[2]: 
          Open    High     Low   Close    Volume  Adj Close
Date                                                           
2012-11-01  598.22  603.00  594.17  596.54  12903500     593.83
2012-11-02  595.89  596.95  574.75  576.80  21406200     574.18
2012-11-05  583.52  587.77  577.60  584.62  18897700     581.96
2012-11-06  590.23  590.74  580.09  582.85  13389900     580.20
2012-11-07  573.84  574.54  555.75  558.00  28344600     558.00
2012-11-08  560.63  562.23  535.29  537.75  37719500     537.75
2012-11-09  540.42  554.88  533.72  547.06  33211200     547.06
2012-11-12  554.15  554.50  538.65  542.83  18421500     542.83
2012-11-13  538.91  550.48  536.36  542.90  19033900     542.90

In[3]: aapl.pct_change()
Out[3]:
                Open      High       Low     Close    Volume  Adj Close
Date                                                                   
2012-11-01       NaN       NaN       NaN       NaN       NaN        NaN
2012-11-02 -0.003895 -0.010033 -0.032684 -0.033091  0.658945  -0.033090
2012-11-05 -0.020759 -0.015378  0.004959  0.013558 -0.117186   0.013550
2012-11-06  0.011499  0.005053  0.004311 -0.003028 -0.291453  -0.003024
2012-11-07 -0.027769 -0.027423 -0.041959 -0.042635  1.116864  -0.038263
2012-11-08 -0.023020 -0.021426 -0.036815 -0.036290  0.330747  -0.036290
2012-11-09 -0.036049 -0.013073 -0.002933  0.017313 -0.119522   0.017313
2012-11-12  0.025406 -0.000685  0.009237 -0.007732 -0.445323  -0.007732
2012-11-13 -0.027502 -0.007250 -0.004251  0.000129  0.033244   0.000129
20
spencerlyon2

La meilleure façon de calculer les rendements prospectifs sans aucune possibilité de biais est d'utiliser la fonction intégrée pd.DataFrame.pct_change(). Dans votre cas, il vous suffit d'utiliser cette fonction car vous disposez de données mensuelles et que vous recherchez le retour mensuel.

Si, par exemple, vous souhaitez consulter le rendement sur 6 mois, vous devez simplement définir le paramètre df.pct_change(periods = 6) et cela vous donnera le rendement en pourcentage sur 6 mois.

Étant donné que votre ensemble de données est relativement petit, le moyen le plus simple consiste à rééchantillonner les paramètres dont vous avez besoin pour calculer les données, puis à nouveau utiliser la fonction pct_change().

Cependant, en raison des propriétés Nice de log, il est courant d'utiliser la formule pour calculer les retours (si vous prévoyez de faire des statistiques sur la série de retours):

enter image description here

Que vous mettriez en œuvre en tant que tel:

log_return = np.log(vfiax_monthly.open / vfiax_monthly.open.shift())

7
rgalbo

Peut également utiliser un mélange de méthodes diff et shift de la série pandas:

retrun = vfiax_monthly.open.diff()/vfiax_monthly.open.shift(1)
1
salhin