DataFrame
株式のリターンを表す があります。終値を分割調整するには、次の方法があります。
def returns(ticker, start=None, end=None):
p = historical_prices(ticker, start, end, data='d', convert=True)
d = historical_prices(ticker, start, end, data='v', convert=True)
p['Dividends'] = d['Dividends']
p['Dividends'].fillna(value=0, inplace=True)
p['DivFactor'] = 1.
p['SAClose'] = p['Close']
records, fields = p.shape
for t in range(1, records):
p['SAClose'][t] = p['Adj Close'][t] / p['DivFactor'][t-1] + \
p['Dividends'][t-1]
p['DivFactor'][t] = p['DivFactor'][t-1] * \
(1 - p['Dividends'][t-1] / p['SAClose'][t])
p['Lagged SAClose'] = p['SAClose'].shift(periods=-1)
p['Cash Return'] = p['Dividends'] / p['Lagged SAClose']
p['Price Return'] = p['SAClose'] / p['Lagged SAClose'] - 1
return p.sort_index()
(つまり、Split Adjusted Close) がラグ値にどのようSAClose
に依存するかに注意してください。DivFactor
次に、遅延値と現在の値のDivFactor
両方に依存します。DivFactor
SAClose
上記の方法は機能しますが、ループ セクションでは非常に遅くなります。パンダでこれを行うためのより効率的な方法はありますか? 「循環」依存関係 (ラグを考えると実際には循環ではない) を考えると、通常の級数演算を行うか、通常のシフト操作を使用する方法がわかりません (たとえば、 で行うようにCash Return
)。