【Python】CAPM模型测算指增公募Alpha收益(stats OLS)

编程入门 行业动态 更新时间:2024-10-07 02:31:16

【Python】CAPM模型测算指增公募Alpha<a href=https://www.elefans.com/category/jswz/34/1768171.html style=收益(stats OLS)"/>

【Python】CAPM模型测算指增公募Alpha收益(stats OLS)

适合有一些基础的人阅读,具体名词不多解释

 

CAPM资产定价模型公式如下:

 市场回报率, 无风险回报率,组合回报率

金融工程做法一般是通过OLS线性回归模型拟合得出Alpha(Jensen‘s Alpha),用以衡量基金经理的超额收益能力,适用于足够分散的产品,本文选用数据为指数增强型的公募基金。

导入必要库:

import pandas as pd
import datetime
import akshare as ak
import numpy as np
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Kline, Line, Bar, Grid, Scatter
import warnings
import statsmodels.api as smwarnings.simplefilter('ignore')  # 忽略警告信息;

数据库用的Akshare,数据库原因需要稍微处理一下,先查询代码找到指数增强的开放式基金

# 确定一下业绩计算时间(后续都要用到)
start_date = datetime.date(2019, 1, 1)    # 股票型基金查询
股票型基金 = ak.fund_scale_open_sina(symbol='股票型基金')
股票型基金 = 股票型基金[(股票型基金['成立日期'] < start_date)]
股票型基金.index = 股票型基金['基金代码']# 指增基金打标签
指数型基金 = ak.fund_info_index_em(symbol="沪深指数", indicator="增强指数型")
指数型基金['投资风格'] = 指数型基金.apply(lambda x: '300指增' if (x['基金名称'].find("300") != -1) else np.nan, axis=1)# 合并到符合条件的成立日期/开放基金列表
指增基金 = 股票型基金.join(指数型基金['投资风格'], how='left').dropna()

查询指数每日数据: 

# 沪深300
沪深300 = ak.stock_zh_index_daily(symbol="sh000300")
沪深300 = 沪深300[(沪深300['date']>=start_date)]
沪深300.index = 沪深300['date']# 计算指数日回报率
returns = pd.DataFrame()
returns['沪深300'] = 沪深300['close']/沪深300['close'].shift()-1

还是数据库原因,用循环查询累计净值之后计算回报率

# 计算基金回报率
for symbol in 指增基金['基金代码'].tolist():净值走势 = ak.fund_open_fund_info_em(fund=symbol, indicator="累计净值走势")净值走势 = 净值走势[(净值走势['净值日期'] >= start_date)]净值走势.index = 净值走势.apply(lambda x: datetime.datetime.strptime(x['净值日期'].strftime("%Y-%m-%d"), "%Y-%m-%d"), axis=1)returns[symbol] = (净值走势['累计净值']/净值走势['累计净值'].shift())-1

无风险利率用了一个年4%,转化为日回报率方便计算:

# 计算rm-rf 和 r(portfolio)-rf
e_returns =returns.dropna()-(1.04**(1/252)-1)

循环跑OLS回归模型计算:

沪深300指增 = 指增基金[(指增基金['投资风格']=='300指增')]
指增300业绩 = []
for symbol in 沪深300指增['基金代码'].tolist():portfolio_returns = e_returns[symbol]market_returns = e_returns['沪深300']# 添加常数项X = sm.add_constant(market_returns)# 执行OLS回归model = sm.OLS(portfolio_returns, X)results = model.fit()# 提取回归结果alpha = results.params[0]  # 截距项即alpha值alpha_p_value = results.pvalues[0]  # alpha的p-valuebeta = results.params[1]  # 斜率项即beta值beta_p_value = results.pvalues[1]  # beta的p-value指增300业绩.append([symbol, alpha, alpha_p_value, beta, beta_p_value])
指增300业绩= pd.DataFrame(指增300业绩,columns = ['基金代码','Alpha收益','Alpha_p_value','Beta', 'beta_p_value'])# 转成年化方便查看
指增300业绩['Alpha收益'] = (指增300业绩['Alpha收益']+1)**252-1
指增300业绩.index = 指增300业绩['基金代码']
# 结果排序+存档
指增300业绩.sort_values(by = 'Alpha收益', ascending = False).to_csv('指增300Alpha排名.csv')

这一块可有可无,随便拉一个画出来看看指增基金和指数的跟踪度

df = returns[['沪深300','000512']]# 示例数据
market_returns = df['沪深300'].round(4).tolist()  # 市场回报率列表
portfolio_returns = df['000512'].round(4).tolist()  # 投资组合的回报率列表data = [[market_returns[i], portfolio_returns[i]] for i in range(len(market_returns))]
data.sort(key=lambda x: x[0])  # 按照横坐标升序排列# 创建散点图对象
scatter = Scatter(init_opts=opts.InitOpts(theme=ThemeType.MACARONS, width='900px', height='500px'))
# 添加数据
scatter.add_xaxis([x[0] for x in data])
scatter.add_yaxis("Returns", [x[1] for x in data],label_opts=opts.LabelOpts(is_show=False))# 设置图表标题、坐标轴标签
scatter.set_global_opts(title_opts=opts.TitleOpts(title="组合/市场相关度"),xaxis_opts=opts.AxisOpts(name="Market Returns", type_="value"),yaxis_opts=opts.AxisOpts(name="Portfolio Returns"))# 渲染图表scatter.render('随便画出来看看指增的和指数的跟踪度.html')

文章末尾说一下成果:

整体感受下来开放式公募大多不是满仓在跑(为了应对赎回很符合逻辑),这个基金这斜率未免有点太低了0.43的相关系数(跟随度低),Alpha超额还是不显著(p_values>0.05),顺手帮大家避个雷。

(本文数据均来自公开平台,基金历史业绩不代表未来,仅供学习交流,不做投资建议)

更多推荐

【Python】CAPM模型测算指增公募Alpha收益(stats OLS)

本文发布于:2024-03-11 21:09:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1729898.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:收益   模型   Python   CAPM   指增公募

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!