如何用Pandas从收益率推导收盘价?转ffn库价格索引遇阻求助
解决收益率转价格索引的问题
我看了你的代码,问题出在初始值的处理和累积计算的方式上。你现在的写法会导致第一个llt_close值变成NaN,因为shift(1)会把第一行的前值变成空值,再乘以(1+df['llt_return'])自然就得到空值了。而且这种逐行shift的方式也不是处理累积收益最简洁的办法。
正确的实现方式
要从收益率序列生成价格索引(模拟收盘价),核心是用累积乘积来计算,因为每一期的价格都是前一期价格乘以(1+当期收益率)。我们只需要设定一个初始价格(通常设为1或者100),然后对(1+收益率)做累积乘积即可。
方案1:直接用cumprod()生成价格序列
如果你的收益率是每一期相对于上一期的收益,可以直接这样写:
import pandas as pd times = pd.to_datetime(pd.Series(['2014-07-4', '2014-07-15','2014-08-25','2014-08-25','2014-09-10','2014-09-15'])) strategypercentage = [0.01, 0.02, -0.03, 0.04,0.5,-0.3] df = pd.DataFrame({'llt_return': strategypercentage}, index=times) # 初始价格设为1,然后计算累积乘积 df['llt_close'] = (1 + df['llt_return']).cumprod()
这样生成的llt_close第一行是1.01(对应第一个收益率0.01,即初始1元涨到1.01元),后续每一行都是前一行价格乘以(1+当期收益率),完全符合收益率和价格的数学关系。
方案2:让第一行价格为初始值(比如1)
如果你希望第一行的llt_close是初始值1,后续价格基于前一行和当期收益率计算,可以调整为:
# 先设置初始价格为1 df['llt_close'] = 1.0 # 从第二行开始,用前一行价格乘以(1+当期收益率) df['llt_close'] = df['llt_close'].mask(df.index == df.index[0], (1 + df['llt_return']).shift(1).fillna(1).cumprod())
或者更直观的循环写法(适合理解逻辑,数据量大时不推荐):
df['llt_close'] = 1.0 for i in range(1, len(df)): df.loc[df.index[i], 'llt_close'] = df.loc[df.index[i-1], 'llt_close'] * (1 + df.loc[df.index[i], 'llt_return'])
这个方案下,第一行价格是1,第二行是1*(1+0.02)=1.02,第三行是1.02*(1-0.03)=0.9894,以此类推。
处理重复日期的小提醒
注意你的数据里有重复的日期2014-08-25,如果后续用ffn做分析,可能需要先处理重复索引(比如合并重复日期的收益率,或者保留其中一个),避免出现异常。比如可以用:
# 合并重复日期的收益率(这里用求和,你可以根据需求改成平均等) df = df.groupby(df.index).agg({'llt_return': 'sum'})
内容的提问来源于stack exchange,提问作者Rami Ramich
相关产品推荐
相关产品推荐

