金融学习之十六——资本市场线

前面两讲在进行投资组合配置时均只考虑到了有风险的资产,而实际在进行投资时,也有可能包含无风险资产(如国债),在这种状况下进行投资,又会出现什么特点呢?这就要引出另一个概念——资本市场线。
资本市场线(CML)是一条从无风险收益率引出的与有效前沿相切的一条直线,该直线的斜率仅与无风险收益率相关,因此当无风险收益率确定时,该直线也就确定下来了。
在知乎上看到两张图片,对这个资本市场线的解释非常详细,于是我就借用过来,大致说说吧。文章地址为:
在这里插入图片描述
从这张图中可以看出,资本配置线是当引入无风险资产后,从无风险收益率引出的一条射线,其斜率为 ( E ( R ) − R f ) / σ p (E(R)-Rf)/\sigma_p (E(R)Rf)/σp,即期望收益与无风险收益之差与收益率波动率的比值,这个比值也称为夏普比率。
在这里插入图片描述
从这张图上又可以看出,当无风险收益率确定时,资本配置线是可以有很多条的,但仅有一条能与有效前沿相切,那么这条线就是资本市场线,切点所对应的投资组合称为市场组合。而且,从这些线也可以发现,对于可行集来说,在风险(x)相同时,资本市场线可以达到最大的收益率(y);在收益相同时(y),资本市场线可以取得最小的风险(x)。
因此,资本市场线的斜率实际上可以转化为带有约束的方程求最优解:
约束条件为 ∑ k = 1 n w i = 1 \displaystyle \sum_{k=1}^n w_i =1 k=1nwi=1 w i w_i wi>0,方程为
m a x   ( E ( R p ) − R f ) / σ p max\ (E(R_p)-R_f )/ \sigma_p max (E(Rp)Rf)/σp
下面,我们假设无风险利率为3%/年,依然利用前面的数据,来绘制资本市场线。整个过程我们再重新做一遍:

#获取股票基本信息表,目的是为了拿到前几个股票的代码
import tushare as ts
pro=ts.pro_api('b497571a3ddd7dde8ebe28b372879594b2f8356c918ad80dae01605b')
df=pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
df.head()    

接着获取数据,并进行处理后,计算收益率:

import pandas as pd
dt=pd.DataFrame()
for i in df.loc[:5][['ts_code','name']].values:
    dt[i[1]]=pro.daily(ts_code=i[0], start_date='20180101', end_date='20210731')['close']
dt.drop('国华网安',axis=1,inplace=True)
import numpy as np
r=np.log(dt/dt.shift(1))
r=r.dropna()
r

再计算出相关的年化收益率、协方差系数、相关系数和波动率

r_mean=r.mean()*252
r_cov=r.cov()*252
r_corr=r.corr()
r_vol=r.std()*np.sqrt(252)
r_mean,r_cov,r_corr,r_vol

绘制出投资组合的可行集:

from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
rp=[]
vp=[]
for i in np.arange(1000):
    x=np.random.random(5)
    weights=x/sum(x)
    rp.append(np.sum(weights*r_mean))
    vp.append(np.sqrt(np.dot(weights,np.dot(r_cov,weights.T))))
plt.figure(figsize=(10,8))
plt.scatter(vp,rp)
plt.xlabel(u'波动率',fontsize=12)
plt.ylabel(u'收益率',fontsize=12,rotation=90)
plt.title(u'资本市场线',fontsize=14)
plt.grid('True')
plt.show()

在这里插入图片描述
再计算并绘制出有效前沿:

import scipy.optimize as sco
def f(w):
    w=np.array(w)
    rp=np.sum(w*r_mean)
    vp=np.sqrt(np.dot(w,np.dot(r_cov,w.T)))
    return np.array([rp,vp])
def vmin(w):
    return f(w)[1]
cons=({'type':'eq','fun':lambda x:np.sum(x)-1})
bnds=tuple((0,1) for x in range(len(r_mean)))
result_min=sco.minimize(vmin,len(r_mean)*[1.0/len(r_mean),],method='SLSQP',bounds=bnds,constraints=cons)
rp_min=np.sum(r_mean*result_min['x'])
vp_min=result_min['fun']
rpt=np.linspace(rp_min,0.3,100)
vpt=[]
for i in rpt:
    cons=({'type':'eq','fun':lambda x:np.sum(x)-1},{'type':'eq','fun':lambda x:f(x)[0]-i})
    result=sco.minimize(vmin,len(r_mean)*[1.0/len(r_mean),],method='SLSQP',bounds=bnds,constraints=cons)
    vpt.append(result['fun'])
plt.figure(figsize=(10,8))
plt.scatter(vp,rp)
plt.plot(vpt,rpt,'r-',label=u'有效前沿',lw=2)
plt.plot(vp_min,rp_min,'y*',label=u'全局最小波动率',markersize=14)
plt.xlabel(u'波动率',fontsize=12)
plt.ylabel(u'收益率',fontsize=12,rotation=90)
plt.title(u'资本市场线',fontsize=14)
plt.grid('True')
plt.show()

在这里插入图片描述
接着假定无风险收益率为2%,计算出资本市场线斜率和市场组合,并进行绘制:

#定义相关函数
def ff(w):
    rf=0.02
    w=np.array(w)
    rp=np.sum(w*r_mean)
    vp=np.sqrt(np.dot(w,np.dot(r_cov,w.T)))
    sharp=(rp-rf)/vp
    return np.array([rp,vp,sharp])
def spmin(w):
    return -ff(w)[2]
#计算市场组合
cons1=({'type':'eq','fun':lambda x:np.sum(x)-1})
result_s=sco.minimize(spmin,len(r_mean)*[1.0/len(r_mean),],method='SLSQP',bounds=bnds,constraints=cons1)
rf=0.02
slope=-result_s['fun']
rm=np.sum(r_mean*result_s['x'])
vm=(rm-rf)/slope
print(slope,rm,vm)
#绘制整个图形
rp_cml=np.linspace(0.02,0.3)
vp_cml=(rp_cml-rf)/slope
plt.figure(figsize=(10,8))
plt.scatter(vp,rp)
plt.plot(vpt,rpt,'r-',label=u'有效前沿',lw=2)
plt.plot(vp_cml,rp_cml,'b--',label=u'资本市场线',lw=2)
plt.plot(vp_min,rp_min,'y*',label=u'全局最小波动率',markersize=14)
plt.xlabel(u'波动率',fontsize=12)
plt.ylabel(u'收益率',fontsize=12,rotation=90)
plt.title(u'资本市场线',fontsize=14)
plt.legend(fontsize=12)
plt.grid('True')
plt.show()

最后得到资本市场线的图形:
在这里插入图片描述

  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spark是一个开源的大数据处理框架,它可以在分布式计算集群上进行高效的数据处理和分析。Spark的特点是速度快、易用性高、支持多种编程语言和数据源。Spark的核心是基于内存的计算模型,可以在内存中快速地处理大规模数据。Spark支持多种数据处理方式,包括批处理、流处理、机器学习和图计算等。Spark的生态系统非常丰富,包括Spark SQL、Spark Streaming、MLlib、GraphX等组件,可以满足不同场景下的数据处理需求。 ### 回答2: Spark是一个分布式计算框架,其出现是为了解决Hadoop MapReduce计算模型中的许多性能问题。与MapReduce相比,Spark的计算速度更快,因为它可以在内存中缓存数据并使用更高效的调度算法。此外,Spark还支持多种语言,包括Scala、Java、Python和R等。 Spark有多个模块,包括Spark Core、Spark SQL、Spark Streaming、Spark MLlib和Spark GraphX等。Spark Core是Spark的基本组件,在其中实现了RDD这种抽象数据结构,它可以将数据分布在多台计算机上,从而实现分布式计算。Spark SQL提供了用于处理结构化数据的API和查询语言,它允许将Spark与现有的SQL工具和数据源一起使用。Spark Streaming可以在实时流处理中使用Spark来处理数据,并提供了与常见的消息队列和流处理系统的无缝集成。Spark MLlib提供了许多机器学习算法,可以在分布式环境中进行大规模的机器学习。Spark GraphX是用于图计算的组件,可以用于处理较大的网络图和社交网络图等。 Spark可以在各种场景下使用,例如大型金融数据分析、人工智能、机器学习和图计算等领域。与Hadoop相比,Spark具有更快的速度、更轻量的资源消耗和更广泛的开源社区支持,已经成为许多大规模数据分析和处理项目的首选技术之一。 总之,Spark是一个功能强大的分布式计算框架,具有快速、灵活和多语言支持等特点,并且在实际应用中表现出色,是大数据学习中不可或缺的重要技术之一。 ### 回答3: Spark是一个快速、通用、分布式计算引擎,可以在大规模数据集上进行高效的数据处理。Spark是基于内存的计算引擎,可以将数据存储在内存中,从而提高计算速度。Spark支持多种编程语言,包括Java、Scala、Python和R,因此很容易上手,并且可以适应各种应用场景。 Spark的核心组件包括Spark SQL、Spark Streaming、Spark MLlib和Spark GraphX等,在处理不同类型的数据上都具有很强的适应性。Spark SQL可以处理结构化数据,Spark Streaming可以实现实时数据处理,Spark MLlib可以进行机器学习任务,Spark GraphX可以处理图形数据。此外,Spark还提供了一个交互式的shell,方便用户测试和调试代码。 在分布式环境下,Spark使用集群模式进行计算。集群中的每个节点都有自己的内存和CPU资源,Spark通过将任务分发到不同的节点上进行并行计算以提高计算速度。Spark还提供了一些高级特性,如广播变量、累加器和检查点等,以提高计算性能和可靠性。 在大数据处理方面,Spark有着广泛的应用场景。例如,Spark可以用于数据清洗和转换、数据仓库构建、实时数据处理和机器学习等任务。Spark还支持多种数据源,包括关系型数据库、Hadoop HDFS、NoSQL数据库和云存储等,这些数据源都可以与Spark集成,以进行数据分析和处理。 总之,Spark是一个非常重要和流行的大数据处理工具,它有强大的功能和广泛的应用场景。对于想要学习大数据处理的人来说,掌握Spark是必不可少的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值