大盘及策略收益率的公式推导与Python代码

一、模型前提与假设

设策略总天数为\(n\)、第\(t\)日大盘的收盘价为\(P_t\)、第\(t\)日的单日收益率为\(r_t\)\(n\)天的累积收益率为\(r_{cum}\)

假设策略仅买卖大盘指数,第\(t\)日的头寸是根据第\((t-1)\)日收盘价计算出的\(s_{t-1}\),因此第1天的收益率\(r_{1}=0\)

特别注意:为避免未来函数,不能使用\(s_{t}\)计算第\(t\)日的头寸。

二、大盘单日收益率

1. 离散型

\[ r_t=\frac{P_t}{P_{t-1}}-1 \]

对应的Python代码为:

df['market_dis'] = df['close']/df['close'].shift()-1
或
df['market_dis'] = df['close'].pct_change()

2. 连续型

\[ r_t=ln\frac{P_t}{P_{t-1}} \]

对应的Python代码为:

df['market_con'] = np.log(df['close'] / df['close'].shift())

三、大盘累积收益率

1. 离散型

\[ \begin{align} 1+r_{cum}&=(1+r_{1})(1+r_{2})\cdots(1+r_{n})\\[1.5ex] &=\frac{P_{1}}{P_{0}}\cdot \frac{P_{2}}{P_{1}}\cdots\frac{P_{n}}{P_{n-1}}\\[1.5ex] &=\frac{P_{n}}{P_{0}} \end{align} \]

对应的Python代码为:

# 注意:这里的累积收益率是以净值形式体现的,在实际应用中可能需要在此结果基础上-1
df['market_dis_cum'] = (1+df['market_dis']).cumprod()

2. 连续型

\[ \begin{align} \text{exp}(r_{cum})& = \text{exp}(r_{1}+r_{2}+\cdots+r_{n}) \\[1.5ex] & = \text{exp}\left({ln\frac{P_{1}}{P_{0}}+ln\frac{P_{2}}{P_{1}}+\cdots+ln\frac{P_{n}}{P_{n-1}}}\right)\\[1.5ex] & =\frac{P_{1}}{P_{0}}\cdot\frac{P_{2}}{P_{1}}\cdots\frac{P_{n}}{P_{n-1}}\\[1.5ex] & =\frac{P_{n}}{P_{0}}\\[2ex] \end{align} \]

对应的Python代码为:

# 注意:这里的累积收益率是以净值形式体现的,在实际应用中可能需要在此结果基础上取np.log()
df['market_con_cum'] = df['market_con'].cumsum().apply(np.exp)

四、策略单日收益率

1. 离散型

\[ r_t= \begin{cases} 0&,t=1\\[2ex] s_{t-1}\left(\cfrac{P_t}{P_{t-1}}-1\right)&,t=2,3,\cdots,n\\[2ex] \end{cases} \]

对应的Python代码为:

df['strategy_dis'] = df['position'].shift()*df['market_dis']

2. 连续型

\[ r_t= \begin{cases} 0&,t=1\\[2ex] s_{t-1}ln\cfrac{P_t}{P_{t-1}}&,t=2,3,\cdots,n\\[2ex] \end{cases} \]

对应的Python代码为:

df['strategy_con'] = df['position'].shift()*df['market_con']

五、策略累积收益率

1. 离散型

\[ \begin{align} 1+r_{cum}&=(1+r_{2})(1+r_{3})\cdots(1+r_{n})\\[1.5ex] &=\left[1+s_{1}\left(\frac{P_{2}}{P_{1}}-1\right)\right]\left[1+s_{2}\left(\frac{P_{3}}{P_{2}}-1\right)\right]\cdots\left[1+s_{n-1}\left(\frac{P_{n}}{P_{n-1}}-1\right)\right]\\[1.5ex] \end{align}\\ \]

对应的Python代码为:

# 注意:这里的累积收益率是以净值形式体现的,在实际应用中可能需要在此结果基础上-1
df['strategy_dis_cum'] = (1+df['strategy_dis']).cumprod()

2. 连续型

\[ \begin{align} \text{exp}(r_{cum})& = \text{exp}(r_{2}+r_{3}\cdots+r_{n}) \\[1.5ex] & = \text{exp}\left({s_1ln\frac{P_{2}}{P_{1}}+s_2ln\frac{P_{3}}{P_{2}}+\cdots+s_{n-1}ln\frac{P_{n}}{P_{n-1}}}\right)\\[1.5ex] & =\left(\frac{P_{2}}{P_{1}}\right)^{s_1}\left(\frac{P_{3}}{P_{2}}\right)^{s_2}\cdots\left(\frac{P_{n}}{P_{n-1}}\right)^{s_{n-1}}\\[1.5ex] \end{align} \]

对应的Python代码为:

# 注意:这里的累积收益率是以净值形式体现的,在实际应用中可能需要在此结果基础上取np.log()
df['strategy_con_cum'] = df['strategy_con'].cumsum().apply(np.exp)

猜你喜欢

转载自www.cnblogs.com/oddgod/p/11516169.html
今日推荐