3
我有一個代表股票收益的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()
注SAClose
(即關閉調整拆分)如何取決於滯後DivFactor
值。反過來,DivFactor
取決於滯後的DivFactor
值以及當前的SAClose
值。
上面的方法工作,但它在循環部分的速度令人難以置信。有沒有更有效的方法讓我在熊貓身上做到這一點?考慮到「循環」依賴性(考慮到滯後性,不是真正的循環),我不知道我如何能夠進行常規的數學運算或者使用正常的移位運算(例如,我如何處理Cash Return
)。
... DivFactor並不需要是圓形的, SAClose。這就是說,它似乎有一個不容易傳入'cumprod'的窗體(見編輯)。有什麼想法嗎? – MikeRand 2012-08-03 10:59:31