2012-08-03 65 views
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)。

回答

3

你可以嘗試創建一次性累計調整因子系列那麼你並不需要循環:你把我推在正確的方向

(p['Dividends'].fillna(1.) + 1.).cumprod() 
+0

... DivFactor並不需要是圓形的, SAClose。這就是說,它似乎有一個不容易傳入'cumprod'的窗體(見編輯)。有什麼想法嗎? – MikeRand 2012-08-03 10:59:31