【发布时间】:2025-12-13 17:50:02
【问题描述】:
更新:不确定如果没有某种形式的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)
将“开始月份”添加到 value。此标签将包含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
问题是,我目前看不到矢量化是如何实现的,因为连续值取决于是否在前一个月进行了分布。我得到了想要的结果,但对于更高频率的数据或更长的时间段来说效率很低。
【问题讨论】:
-
Don't use floats for money. Ever.(除非在您的模型中,这是一个纯理论构造,结果总和不必匹配)
-
谢谢。让我们暂时忽略那个小细节......
-
哈哈。这句话让我很开心=)(我只是想象你老板听到的时候的表情)
标签: python python-3.x pandas recursion finance