gpt4 book ai didi

python - 递归:具有分布的账户值(value)

转载 作者:太空狗 更新时间:2023-10-29 17:06:31 25 4
gpt4 key购买 nike

更新:不确定如果没有某种形式的 loop 是否可行, 但 np.where 在这里不起作用。如果答案是“你不能”,那就这样吧。如果可以做到,它可能会使用 scipy.signal 中的内容。 .


我想对下面代码中的循环进行矢量化,但由于输出的递归性质,我不确定如何进行矢量化。

我当前设置的演练:

以起始金额(100 万美元)和季度美元分配(5,000 美元)为例:

dist = 5000.
v0 = float(1e6)

每月生成一些随机证券/账户返回(十进制形式):

r = pd.Series(np.random.rand(12) * .01,
index=pd.date_range('2017', freq='M', periods=12))

创建一个空系列来保存每月账户值:

value = pd.Series(np.empty_like(r), index=r.index)

将“开始月份”添加到。此标签将包含 v0

from pandas.tseries import offsets
value = (value.append(Series(v0, index=[value.index[0] - offsets.MonthEnd(1)]))
.sort_index())

我想摆脱的循环在这里:

for date in value.index[1:]:
if date.is_quarter_end:
value.loc[date] = value.loc[date - offsets.MonthEnd(1)] \
* (1 + r.loc[date]) - dist
else:
value.loc[date] = value.loc[date - offsets.MonthEnd(1)] \
* (1 + r.loc[date])

组合代码:

import pandas as pd
from pandas.tseries import offsets
from pandas import Series
import numpy as np

dist = 5000.
v0 = float(1e6)
r = pd.Series(np.random.rand(12) * .01, index=pd.date_range('2017', freq='M', periods=12))
value = pd.Series(np.empty_like(r), index=r.index)
value = (value.append(Series(v0, index=[value.index[0] - offsets.MonthEnd(1)])).sort_index())
for date in value.index[1:]:
if date.is_quarter_end:
value.loc[date] = value.loc[date - offsets.MonthEnd(1)] * (1 + r.loc[date]) - dist
else:
value.loc[date] = value.loc[date - offsets.MonthEnd(1)] * (1 + r.loc[date])

在伪代码中,循环所做的只是:

for each date in index of value:
if the date is not a quarter end:
multiply previous value by (1 + r) for that month
if the date is a quarter end:
multiply previous value by (1 + r) for that month and subtract dist

问题是,我目前看不到向量化是如何实现的,因为连续值取决于前一个月是否进行了分布。我得到了想要的结果,但对于更高频率的数据或更长的时间段来说效率很低。 enter image description here

最佳答案

您可以使用以下代码:

cum_r = (1 + r).cumprod()
result = cum_r * v0
for date in r.index[r.index.is_quarter_end]:
result[date:] -= cum_r[date:] * (dist / cum_r.loc[date])

你会:

  • 所有月度返回的 1 个累积产品。
  • 1 向量与标量的乘法v0
  • n 向量与标量的乘法 dist/cum_r.loc[date]
  • n 向量减法

其中 n 是季度末的数量。

基于这段代码我们可以进一步优化:

cum_r = (1 + r).cumprod()
t = (r.index.is_quarter_end / cum_r).cumsum()
result = cum_r * (v0 - dist * t)

这是

  • 1 个累积产品 (1 + r).cumprod()
  • 两个系列之间的 1 个分区 r.index.is_quarter_end/cum_r
  • 上述除法的1个累计数
  • 将上述总和与标量 dist 相乘 1
  • 1 标量 v0dist * t 的减法
  • cum_rv0 - dist * t 的 1 点乘法

关于python - 递归:具有分布的账户值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45820242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com