pandas - 计算存在循环依赖关系的两个Series的更高效方法

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值。
上面的方法可行,但在循环部分非常慢。在pandas中有没有更有效的方法可以做到这一点?鉴于"循环"依赖关系(考虑到滞后),我不确定我如何进行正常的系列数学或使用正常的移位操作(例如我在Cash Return中所做的)。
1个回答

3
您可以尝试一次性创建一个累积调整因子系列,这样您就不需要循环:
(p['Dividends'].fillna(1.) + 1.).cumprod()

你把我推向了正确的方向... DivFactor 不需要与 SAClose 循环。话虽如此,它似乎有一个形式(见编辑),不容易传递到 cumprod 中。有什么想法吗? - MikeRand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接