作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai
第一篇:计算股票回报率,均值和方差
第二篇:简单线性回归
第三篇:多元线性回归和残差分析
第四篇:现代投资组合理论
第五篇:市场风险
第六篇:Fama-French 多因子模型
在本文中,我们将介绍有关量化金融的一些基本概念。我们从收益率,均值和方差开始学习,你可能认为计算这些值非常简单,但是,这些值是能用很多不同的方法来进行计算的。根据具体情况选择合适的计算方法是非常重要的。
单期(一个时期)的收益率计算方法如下:
r = p t p 0 − 1 = p t − p 0 p 0 r=\frac{p_{t}}{p_{0}}-1=\frac{p_{t}-p_{0}}{p_{0}} r=p0pt−1=p0pt−p0
其中,r 是收益率,pt 是时间 t 时的资产价格,p0 是初始时间的资产价格。我们利用 Python 程序来实现这个过程:
import numpy as np
rate_return = 102.0/100 - 1
print(rate_return)
假设我们买了 100 美元的股票,半年后它涨到了 102 美元。一年后,价格又涨到了 104 美元。那么我们应该如何计算它的总回报呢?首先,我们可以把它看做是一个时期的投资回报,即股票直接从 100 美元涨到了 104 美元,那么我们的回报率可以这样计算:
r = 104 100 − 1 = 0.04 r = \frac{104}{100} - 1 = 0.04 r=100104−1=0.04
或者,我们也可以把这个当做两个时期的回报,即股票先从 100 美元涨到 102 美元,然后再从 102 美元涨到 104 美元,那么我们的回报率可以这样计算:
r = ( 1 + r 1 ) ∗ ( 1 + r 2 ) − 1 = 102 100 ∗ 104 102 − 1 = 0.04 r=(1+r_{1})*(1+r_{2})-1=\frac{102}{100}*\frac{104}{102}-1=0.04 r=(1+r1)∗(1+r2)−1=100102∗102104−1=0.04
在这里,我们对一年的回报进行了两次计算,这种计算被称为半年复合。那么季度复合呢?让我们假设一下,每个季度末的股票价格分别为 p1,p2,p3和p4。
r = ( 1 + r 1 ) ∗ ( 1 + r 2 ) ∗ ( 1 + r 3 ) ∗ ( 1 + r 4 ) − 1 r=(1+r_{1})*(1+r_{2})*(1+r_{3})*(1+r_{4})-1 r=(1+r1)∗(1+r2)∗(1+r3)∗(1+r4)−1
我们在此计算的回报率称为累积回报或者总回报。它衡量一段时间内该资产的总回报。
现在考虑以下一个问题:我们有两个策略,策略A和策略B。我们将策略A运行了一年,累积回报率是 20%。而我们运行策略B三年,累积回报率是65%。那么你觉得哪种策略的回报率更高呢?我们常用的比较方法是将所有收益转换为年复合收益率,无论每种策略的投资期限如何,我们都能通过这种方法来比较两种方法的收益率。我们通过计算获得策略 B 的年复合收益率如下:
( 1 + r ) 3 = 1 + 0.65 (1+r)^{3}=1+0.65 (1+r)3=1+0.65
r = 1.65 3 − 1 = 0.18167 r=\sqrt[3]{1.65}-1=0.18167 r=31.65−1=0.18167
所以,策略A有更高的年复合收益率(compounding annual return)。
我们介绍了年复合收益率,这是一种有效的回报率。但是,你也可以将其看做是一种 “假设回报”,因为策略 B 在三年的测试过程中,不可能每年的回报率都是 18.167% 。但是,我们可以假设策略B每年的回报率是 18.167%,所以它能达到三年的累积回报率是 65%。正如我们之前提到的,如果我们假设一个策略是季度复利的,那么季度有效收益率和年回报之间的关系为:
( 1 + r 4 ) 4 = 1 + r (1+\frac{r}{4})^{4}=1+r (1+4r)4=1+r
更一般的说,如果一年内复合的时间是 n,而年回报率是 r,那么我们可以得到如下的关系式:
( 1 + r n ) n = 1 + r (1+\frac{r}{n})^{n}=1+r (1+nr)n=1+r
现在想象一下股市,我们的资产是每秒都在变化,甚至每毫秒都是在变化的。如果符合的时间或 n 接近无限大,则称为连续复合。计算公式如下:
lim n → ∞ ( 1 + r n ) n = e r \lim_{n\rightarrow \infty }(1+\frac{r}{n})^{n}=e^{r} limn→∞(1+nr)n=er
从上面的方程中,我们知道如果我们假设复合收益是连续的:
e r = 1 + r = p t p 0 e^{r}=1+r=\frac{p_{t}}{p_{0}} er=1+r=p0pt
我们对等式两边都取自然对数 ln
,则:
r = l n p t p 0 = l n p t − l n p 0 r=ln\frac{p_{t}}{p_{0}}=lnp_{t} - lnp_{0} r=lnp0pt=lnpt−lnp0
在这里我们获取了对数收益率,或者称为连续复合收益。这在计算回报时经常被使用,因为一旦我们采用资产价格的对数,我们就可以通过简单的减法来计算对数回报。这里我们以 Apple 股票价格为例,如下:
import quandl
import numpy as np
import quandl
quandl.ApiConfig.api_key = 'XXXXXXXX'
aapl_table = quandl.get('WIKI/AAPL')
aapl = aapl_table.loc['2017-3',['Open','Close']]
#take log return
aapl['log_price'] = np.log(aapl.Close)
aapl['log_return'] = aapl.log_price.diff()
print(aapl)
程序输出结果为:
Open Close log_price log_return
Date
2017-03-01 137.890 139.79 4.940141 NaN
2017-03-02 140.000 138.96 4.934186 -0.005955
2017-03-03 138.780 139.78 4.940070 0.005884
2017-03-06 139.365 139.34 4.936917 -0.003153
2017-03-07 139.060 139.52 4.938208 0.001291
2017-03-08 138.950 139.00 4.934474 -0.003734
2017-03-09 138.740 138.68 4.932169 -0.002305
2017-03-10 139.250 139.14 4.935481 0.003311
2017-03-13 138.850 139.20 4.935912 0.000431
2017-03-14 139.300 138.99 4.934402 -0.001510
2017-03-15 139.410 140.46 4.944923 0.010521
2017-03-16 140.720 140.69 4.946559 0.001636
2017-03-17 141.000 139.99 4.941571 -0.004988
2017-03-20 140.400 141.46 4.952017 0.010446
2017-03-21 142.110 139.84 4.940499 -0.011518
2017-03-22 139.845 141.42 4.951734 0.011235
2017-03-23 141.260 140.92 4.948192 -0.003542
2017-03-24 141.500 140.64 4.946203 -0.001989
2017-03-27 139.390 140.88 4.947908 0.001705
2017-03-28 140.910 143.80 4.968423 0.020515
2017-03-29 143.680 144.12 4.970646 0.002223
2017-03-30 144.190 143.93 4.969327 -0.001319
2017-03-31 143.720 143.66 4.967449 -0.001878
在这里,我们计算了 Apple 股票的每日对数收益率。鉴于我们知道本月的每日对数回报率,我们可以通过简单的计算所有每日回报来计算每月回报。
month_return = aapl.log_return.sum()
print(month_return)
程序输出结果为:
0.0273081001636
我们直接将每日回报进行累加,这听起来好像是不正确的,但是我们可以从数学上证明它是正确的。让我们假设一段时间内的股票价格是 [p0, p1, p2, p3, …, pn] ,然后累积回报率如下:
r = l n p t p 0 = l n p t p t − 1 + l n p t − 1 p t − 2 + ⋯ + l n p 1 p 0 r=ln\frac{p_{t}}{p_{0}}=ln\frac{p_{t}}{p_{t-1}}+ln\frac{p_{t-1}}{p_{t-2}}+ \cdots +ln\frac{p_{1}}{p_{0}} r=lnp0pt=lnpt−1pt+lnpt−2pt−1+⋯+lnp0p1
根据上面的等式,我们可以简单的总结为对一段时间内的每个对数回报累加可以得到一段时间的累积回报。这种方法的便利性也是我们在量化金融中使用对数收益的原因之一。
均值是衡量数据集中趋势的指标。它能捕捉数据分布的关键特征。当我们谈论均值事,默认情况下,我们说的都是算术平均值。它被定义为:
μ = ∑ i = 1 n x i n \mu =\frac{\sum_{i=1}^{n}x_{i}}{n} μ=n∑i=1nxi
其中,(x1, x2, …, xn) 是我们的数据序列。
在 Python中,我们可以直接使用 Numpy.mean() 来进行计算序列的平均值:
print(np.mean(aapl.log_price))
程序输出结果为:
4.94597446551
几何平均数是对于正数数据序列非常有用的方法,根据其乘积我们可以非常好的解释一些指标,比如增长率,它的计算公式如下:
x ~ = x 1 x 2 x 3 ⋯ x n n \tilde{x}=\sqrt[n]{x_{1}x_{2}x_{3} \cdots x_{n}} x~=nx1x2x3⋯xn
让我们计算一个单周期收益的几何平均值:
1 + r ˉ = p t p t − 1 ∗ p t − 1 p t − 2 ∗ ⋯ ∗ p 2 p 1 n 1+\bar{r}=\sqrt[n]{\frac{p_{t}}{p_{t-1}}*\frac{p_{t-1}}{p_{t-2}}* \cdots *\frac{p_{2}}{p_{1}}} 1+rˉ=npt−1pt∗pt−2pt−1∗⋯∗p1p2
( 1 + r ˉ ) = p t p 0 n (1+\bar{r})=\sqrt[n]{\frac{p_{t}}{p_{0}}} (1+rˉ)=np0pt
现在,等式变成了我们熟悉的形式:
( 1 + r ˉ ) n = p t p 0 (1+\bar{r})^{n}=\frac{p_{t}}{p_{0}} (1+rˉ)n=p0pt
这就是为什么我们说它非常适用于增长率。
方差是衡量数据分散度的一种方法。在金融领域中,大多数情况下,差异是风险的同义词。资产价格的方差越大,资产承担的风险就越高。方差通常用 σ 2 σ^{2} σ2来表示,它的计算方法是:
σ 2 = ∑ i = 1 n ( x i − μ ) 2 n \sigma^{2}=\frac{\sum_{i=1}^{n}(x_{i}-\mu)^{2}}{n} σ2=n∑i=1n(xi−μ)2
在 Python 中,我们可以直接用 Numpy.var 来进行计算:
print(np.var(aapl.log_price))
程序输出结果为:
0.00014203280448152512
最常用的财务分散度指标是标准差。它通常用 σ \sigma σ 来表示,我们可以很明显的看到标准差和方差之间的关系:
σ = σ 2 = ∑ i = 1 n ( x i − μ ) 2 n \sigma=\sqrt{\sigma^{2}}=\sqrt{\frac{\sum_{i=1}^{n}(x_{i}-\mu)^{2}}{n}} σ=σ2=n∑i=1n(xi−μ)2
在 Python 中,我们也可以直接调用 np.std 来计算数据的标准差。
print(np.std(aapl.log_price))
程序输出结果为:
0.011917751653794651