私は毎月の財務データを含むデータフレームを持っています:
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
私はそのようなリターンを計算しようとしています:
In [90]: returns = (vfiax_monthly.open[1:] - vfiax_monthly.open[:-1])/vfiax_monthly.open[1:]
しかし、私はゼロしか得ていません:
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
これは、算術演算がインデックスで整列され、[1:]
および[:-1]
役に立たない。
私の回避策は:
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
リターンを計算するより良い方法はありますか?配列に変換してからシリーズに戻すのは好きではありません。
スライスする代わりに、.shift
は、DataFrame/Series内の値のインデックス位置を移動します。例えば:
returns = (vfiax_monthly.open - vfiax_monthly.open.shift(1))/vfiax_monthly.open.shift(1)
これは何 pct_change
はボンネットの下でやっています。他の機能にも使用できます。例:
(3*vfiax_monthly.open + 2*vfiax_monthly.open.shift(1))/5
これを行う最も簡単な方法は、DataFrame.pct_change()メソッドを使用することです。
ここに簡単な例があります
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
バイアスの可能性なしに前向きなリターンを計算する最良の方法は、組み込み関数pd.DataFrame.pct_change()
を使用することです。あなたの場合、毎月のデータがあり、毎月の収益を探しているので、使用する必要があるのはこの関数だけです。
たとえば、6か月間の収益を確認したい場合は、param df.pct_change(periods = 6)
を設定するだけで、6か月の収益率が得られます。
データセットが比較的小さいため、最も簡単な方法は、データの計算に必要なパラメーターをリサンプリングしてから、再度pct_change()
関数を使用することです。
ただし、log
のNiceプロパティにより、リターンを計算するために式を使用するのが一般的です(リターンシリーズで統計を行う予定の場合)。
あなたはそのように実装します:
log_return = np.log(vfiax_monthly.open / vfiax_monthly.open.shift())
pandasシリーズのdiff
メソッドとshift
メソッドの組み合わせを使用することもできます。
retrun = vfiax_monthly.open.diff()/vfiax_monthly.open.shift(1)