微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-pandas-计算带有循环依赖关系的两个系列的更有效方法

我有一个表示股票收益的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值.

上面的方法可以工作,但是在循环部分速度却非常慢.有没有一种更有效的方式可以让我在大熊猫中做到这一点?给定“循环”依赖关系(鉴于滞后并不是真正的循环关系),我不确定如何进行常规的系列数学运算或使用常规的移位运算(例如,对现金返还而言).

解决方法:

您可以尝试一次创建一个累积调整因子系列,而无需循环:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐