量化交易30天 Day28 - 投资组合概念(八) CAPM实际应用

量化交易30天
本系列文章是纪录一位量化交易新手的学习过程,除了基础的Python语法不说明,其他金融相关的东西都会一步步地说明,希望让更多想学习量化交易但是没有学过相关金融知识的朋友们,透过这系列的文章,能够对量化交易略知一二,也欢迎量化交易的高手们多多交流。

上一篇的Jensen alpha公式,是再分析资产是否有超额报酬,这篇就要实际拿个股来测试看看,怎麽将价格资料带入,计算alpha、beta。

# 回顾一下公式
Ra = α + Rf + β * ( Rm - Rf ) + 误差项

如果将上面公式的Rf移到等号左边,会变成下面这个公式

( Ra - Rf ) = α + β * ( Rm - Rf ) + 误差项

这个式子可以看成下面这条

Y = a + bX + 误差项

Y:Ra - Rf,每天的报酬率扣掉无风险报酬率
X:Rm - Rf,市场报酬率扣掉无风险报酬率

而我们之所以用CAPM,就是想知道资产跟市场报酬的关系,所以想求出计算式中的 a 及 b,但是由於每天的Y及X是会一直变动的,所以我们不太可能透过一组(X, Y)数组就算出 a 及 b,只能用一堆(X, Y)数组去估计,这边就需要运用统计学的知识了。

Ordinary Least Squares Regression (OLS 回归模型)

要找出X跟Y的关系,可以用回归模型来找找看,因为只有两个变数X,Y,所以只需要OLS即可,OLS的概念大概就是在下图这些红点中,找出一条蓝色直线,最小化每一点跟这条线的垂直距离的平方和。

CAPM用来计算苹果(AAPL)跟标普500指数ETF(SPY)的关系

要套用CAPM,我们需要有一档商品的报酬率、市场报酬率,以及无风险报酬率,这边就用AAPL来练习,市场报酬则是采用SPY为基准,无风险利率则是采用美国十年期公债殖利率作为参考。

爬资料

import os
import pandas_datareader as pdr
SPY = pdr.get_data_tiingo('SPY', api_key='YOUR API KEY')
AAPL = pdr.get_data_tiingo('AAPL', api_key='YOUR API KEY')

整理资料

# SPY 2019 日报酬率
SPY = SPY.reset_index(level=[0,1])
SPY.index = SPY['date']
SPY_adj = SPY.iloc[:,7:11]
SPY_adj.columns = ['Close','High','Low','Open']
SPY_Close_adj = SPY_adj.Close
ret1 = SPY_Close_adj.shift(-2) / SPY_Close_adj.shift(-1)
spy_daily_ret = ret1 - 1
spy_daily_ret_2019 = spy_daily_ret['2019']

# AAPL 2019 日报酬率
AAPL = AAPL.reset_index(level=[0,1])
AAPL.index = AAPL['date']
AAPL_adj = AAPL.iloc[:,7:11]
AAPL_adj.columns = ['Close','High','Low','Open']
AAPL_Close_adj = AAPL_adj.Close
ret1 = AAPL_Close_adj.shift(-2) / AAPL_Close_adj.shift(-1)
aapl_daily_ret = ret1 - 1
aapl_daily_ret_2019 = aapl_daily_ret['2019']

# 整合成一个dataframe
import pandas as pd
ret_data = pd.concat([aapl_daily_ret_2019,spy_daily_ret_2019], axis = 1)
ret_data.columns = ['AAPL', 'SPY']
ret_data
	                        AAPL	      SPY
date		
2019-01-02 00:00:00+00:00	0.042689	0.033496
2019-01-03 00:00:00+00:00	-0.002226	0.007885
2019-01-04 00:00:00+00:00	0.019063	0.009395
2019-01-07 00:00:00+00:00	0.016982	0.004673
2019-01-08 00:00:00+00:00	0.003196	0.003528
...	...	...
2019-12-24 00:00:00+00:00	-0.000379	-0.000248
2019-12-26 00:00:00+00:00	0.005935	-0.005513
2019-12-27 00:00:00+00:00	0.007307	0.002429
2019-12-30 00:00:00+00:00	0.022816	0.009352
2019-12-31 00:00:00+00:00	-0.009722	-0.007572

上面这张表就是2019年AAPL与SPY的日报酬率资料

无风险利率

因为2019年共有252个交易日,所以要将年利率取252次方根

# risk free return
rf_ret = 1.0078 ** ( 1 / 252 ) - 1

AAPL与SPY的日报酬率扣掉无风险利率

可以对照上面的数字,会有些微的差距。

Ex_ret = ret_data - rf_ret
Ex_ret
	                        AAPL	         SPY
date		
2019-01-02 00:00:00+00:00	0.042659	0.033465
2019-01-03 00:00:00+00:00	-0.002257	0.007854
2019-01-04 00:00:00+00:00	0.019032	0.009365
2019-01-07 00:00:00+00:00	0.016951	0.004643
2019-01-08 00:00:00+00:00	0.003165	0.003497
...	...	...
2019-12-24 00:00:00+00:00	-0.000410	-0.000279
2019-12-26 00:00:00+00:00	0.005904	-0.005544
2019-12-27 00:00:00+00:00	0.007276	0.002398
2019-12-30 00:00:00+00:00	0.022785	0.009321
2019-12-31 00:00:00+00:00	-0.009753	-0.007603

AAPL与SPY 日报酬率散布图

import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus']=False

plt.scatter(Ex_ret.values[:,0],Ex_ret.values[:,1])
plt.title('AAPL return and SPY return')

下面就是要用这个散布图里面,用OLS去估计一条直线,来代表AAPL与SPY的关系。

使用statsmodels OLS模组

statsmodels是python的一个统计函数库,里面就有OLS模组可以直接套用,非常方便。

import statsmodels.api as sm
model=sm.OLS(Ex_ret.AAPL[1:],sm.add_constant(Ex_ret.SPY[1:]))
result=model.fit()
result.summary()

根据上述的计算,可以求出:

Ra - Rf = 0.0014 + 1.464 * ( Rm - Rf ) + 误差项

观察统计数据,SPY的p-value小於0.05,表示风险系数beta显着不等於0,beta取值1.464表示AAPL这档个股的波动度高於SPY,另外alpha取值0.0014表示有存在超额报酬率,且p-value小於0.05,表示alpha显着不等於0。

本篇总结
这篇实作用CAPM理论去计算AAPL跟SPY的关系,用到了一些统计学的概念,包含最小平方和、假设检定...等等,算是有点深入,应该会需要消化一下或是google相关知识,不过还是挺有趣的。

P.S.
如果大家对於量化交易有兴趣的话,我自己有上过以下这门课,课程内容从串接股市资料API、储存至资料库、将自己的策略转化成程序码、自动下单,并且可以把整个流程自动化,每天早上执行一次,一整天就不用看盘了,觉得是蛮实战的,可以参考看看。

笔者 Sean
奈米户投资人 / Python爱用者
喜欢用Python玩转金融数据,从个股基本面、技术面、筹码面相关资料,一直到总体经济数据,都是平常接触到的素材;对於投资,除了研究历史数据,也喜欢了解市场上大家在玩些什麽。


<<:  Day 26 初学者补给站 学习方向讨论

>>:  [Day27] Room | 官方目前推荐不使用Sqlite

【第四天 - Queue 介绍】

Q1. Queue是什麽? 与 Stack 一样,是一种资料结构的概念,假设有一个容器是装马克杯的盒...

[Day16]ISO 27001 标准:持续改善

这是 ISO 27001 的最後一个章节,要表达的精神很简单! 就是如果有人发现【机房的门没有关】,...

【课程推荐】2022/3/5~3/6、3/12~3/13 软件架构师技能培训班

课程目标 了解软件架构师所应具备的技能与素养,分析与规划软件架构模型,撰写符合国际标准的SAD (S...

Day13 - 解决状态大爆炸 - 1: Parallel States (平行式状态)

以昨天的例子而言,我们的 input 有 [Invalid / Valid]、[Disabled /...

每秒几十万上下 - 1分K 当冲策略是否有搞头 ?!

最近股市只有一个字 怕.jpg 今天研究了大多的回测策略,大多都是以日计算,想想可不可以用 1分K ...