我想要做的是将两个日期和一个证券传递到价格表中,并使用给定的证券计算这些日期之间的复合收益率。
我有一个价格表(prices_df):
security_id px_last asof
1 3.055 2015-01-05
1 3.360 2015-01-06
1 3.315 2015-01-07
1 3.245 2015-01-08
1 3.185 2015-01-09
我也有一个包含两个日期和安全性的表格(
events_df
):asof disclosed_on security_ref_id
2015-01-05 2015-01-09 16:31:00 1
2018-03-22 2018-03-27 16:33:00 3616
2017-08-03 2018-03-27 12:13:00 2591
2018-03-22 2018-03-27 11:33:00 3615
2018-03-22 2018-03-27 10:51:00 3615
使用这个表中的两个日期,我想使用价格表来计算收益。
我正在使用的两个函数:
import pandas as pd
# compounds returns
def cum_rtrn(df):
df_out = df.add(1).cumprod()
df_out['return'].iat[0] = 1
return df_out
# calculates compound returns from prices between two dates
def calc_comp_returns(price_df, start_date=None, end_date=None, security=None):
df = price_df[price_df.security_id == security]
df = df.set_index(['asof'])
df = df.loc[start_date:end_date]
df['return'] = df.px_last.pct_change()
df = df[['return']]
df = cum_rtrn(df)
return df.iloc[-1][0]
我随后使用 .iterrows
迭代遍历 events_df
,每次传递 calc_comp_returns
函数。然而,这是一个非常缓慢的过程,因为我有10K+次迭代,所以我正在寻找改进方法。解决方案不需要基于 pandas
。
# example of how function is called
start = datetime.datetime.strptime('2015-01-05', '%Y-%m-%d').date()
end = datetime.datetime.strptime('2015-01-09', '%Y-%m-%d').date()
calc_comp_returns(prices_df, start_date=start, end_date=end, security=1)
%prun
魔术函数,这真的很有用。谢谢! - roarkz