一、模型前提与假设

设策略总天数为\(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)

大盘及策略收益率的公式推导与Python代码的更多相关文章

  1. 最小二乘法公式推导及Python实现

    机器学习使用线性回归方法建模时,求损失函数最优解需要用到最小二乘法.相信很多朋友跟我一样,想先知道公式是什么,然后再研究它是怎么来的.所以不多说,先上公式. 对于线性回归方程\(f(x) = ax + ...

  2. 一个 11 行 Python 代码实现的神经网络

    一个 11 行 Python 代码实现的神经网络 2015/12/02 · 实践项目 · 15 评论· 神经网络 分享到:18 本文由 伯乐在线 - 耶鲁怕冷 翻译,Namco 校稿.未经许可,禁止转 ...

  3. XGBoost参数调优完全指南(附Python代码)

    XGBoost参数调优完全指南(附Python代码):http://www.2cto.com/kf/201607/528771.html https://www.zhihu.com/question/ ...

  4. 学习TensorFlow,浅析MNIST的python代码

    在github上,tensorflow的star是22798,caffe是10006,torch是4500,theano是3661.作为小码农的我,最近一直在学习tensorflow,主要使用pyth ...

  5. PEP 8 - Python代码样式指南

    PEP 8 - Python代码样式指南 PEP: 8 标题: Python代码风格指南 作者: Guido van Rossum <python.org上的guido>,Barry Wa ...

  6. catboost原理以及Python代码

    原论文:    http://learningsys.org/nips17/assets/papers/paper_11.pdf catboost原理: One-hot编码可以在预处理阶段或在训练期间 ...

  7. 一种部署 Python 代码的新方法

    在Nylas,我们喜欢使用Python进行开发.它的语法简单并富有表现力,拥有大量可用的开源模块和框架,而且这个社区既受欢迎又有多样性.我们的后台是纯用 Python 写的,团队也经常在 PyCon ...

  8. Python代码编码规范

    目录 1. Introduction 介绍 2. A Foolish Consistency is the Hobgoblin of Little Minds 尽信书,则不如无书 3. Code la ...

  9. 改改Python代码,运行速度还能提升6万倍

    这份最新研究指出,在后摩尔定律时代,人类所获得的的算力提升将更大程度上来源于计算堆栈的「顶层」,即软件.算法和硬件架构,这将成为一个新的历史趋势. 很多人学习python,不知道从何学起.很多人学习p ...

随机推荐

  1. 解决com.netflix.zuul.FilterProcessor : null异常

    ZuulFilter过滤器的filterType方法返回一个字符串代表过滤器的类型,如果return null就会出现以上错误. 在zuul中有以下四种不同生命周期的过滤器类型 pre:路由之前 ro ...

  2. ListVIew中包含水平滑动控件,左右滑动时容易触发上下滑动

    自定义ListView import android.content.Context;import android.util.AttributeSet;import android.view.Moti ...

  3. Java学习笔记(十)面向对象---接口

    理解 初期理解 可以认为接口是一个特殊的抽象类.当接口中的方法都是抽象的,那么该类可以通过接口的形式来表示. class用于定义类 interface用于定义接口 格式特点 接口中常见定义:常量,抽象 ...

  4. 1+x证书Web 前端开发初级——理论考试(试卷1)

    1+x证书Web 前端开发初级——理论考试(试卷1) 一.单选题(每小题 2 分,共 30 小题,共 60 分) 1.HTML 语言中,设置表格中文字与边框距离的标签是() A.<table b ...

  5. python正则分组

    python的正则表达式本身每一个字符串都是独立的 看下面的例子就理解分组的含义了~ ab*表示的是查找a和(0个或多个b),就是*是单独针对b的,所以返回a (ab)*则表示ab是一个组是一个整体, ...

  6. C++指针和引用及区别

    1.变量 首先最重要的,variable的定义,当你申明一个变量的时候,计算机会将指定的一块内存空间和变量名进行绑定:这个定义很简单,但其实很抽象,例如:int x = 5; 这是一句最简单的变量赋值 ...

  7. 《一句话理解Vue核心内容》阅读笔记

    Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架. 在解释什么是渐进式框架之前,有必要了解一下什么是框架 在最初的前端开发中,我们利用JS获取HTML中的DOM元素 ...

  8. 设置idea的快捷键组合 设置为默认

    ubuntu中,idea的快捷键组合 为 “Default for GNOME”,和windows中不一样了,需要修改为“Default”:

  9. python连接oracle数据库报错"DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: "解决方案

    操作系统,python3.5, oracle_11, 均为64位:plsql 正常连接. 也顺利安装了cx_oracle 6.3,但是python进行连接的时候就会报错"DatabaseEr ...

  10. ping命令基于ICMP协议的返回信息分析

    Ping是潜水艇人员的专用术语,表示回应的声纳脉冲,在网络中 Ping 是一个十分好用的 TCP/IP 工具.它主要的功能是用来检测网络的连通情况和分析网络速度.可以利用 PING 命令检查网络连通状 ...