来自作者大大的温馨提示,本文章的代码块可以使用伟大的CSDN(平台能否少点收成呀,嘿嘿开个玩笑)直接运行的都没有直接附上结果,请读者谅解,需要读取数据而无法运行的均已经附上结果.最后留一下作业,请给作者大大点赞+好评
4.3.1投资组合理论(30分)
- 两个公式,计算表内数据
- 用编程语言编程实现上述两个公式
1.两个公式,会给出A和B的收益率方差和期望以及投资比例与相关系数
$$
E\left( x_p \right) =w_AE\left( x_A \right) +w_BE\left( x_B \right)
\\
\sigma ^2\left( x_p \right) =w_{A}^{2}\sigma ^2\left( x_A \right) +w_{B}^{2}\left( x_B \right) \sigma ^2\left( x_B \right) +2w_Aw_B\sigma \left( x_A,x_B \right)
\\
=w_{A}^{2}\sigma ^2\left( x_A \right) +w_{B}^{2}\left( x_B \right) \sigma ^2\left( x_B \right) +2w_Aw_B\rho _{A,B}\sigma \left( x_A \right) \sigma \left( x_B \right)
$$
2.编程##导包 import numpy as np import math ##定义投资组合期望函数 def cal_mean(w_A): return(0.15-0.07*w_A) ##计算期望收益率 mean = list(map(cal_mean,[w_A/50 for w_A in range(51)])) ##map函数,将后面的数据应用到前面的函数中 ##定义std计算函数,此处亦可以使用课件上面的匿名函数 def cal_std(w_A): std = [] ##初始化空列表 for i in range(5): std.append(math.sqrt(w_A**2*0.12**2+(1-w_A)**2*0.25**2+2*w_A*(1-w_A)*(-1+0.5*i)*0.12*0.25)) ##将算出的数据放入std空列表中 return(std) ##计算投资风险 std = np.array(list(map(cal_std,[w_A/50 for w_A in range(51)]))) ##课件中设置的参数为50,感觉不合理,可以自己调试查看结果 ##以下步骤可以不要,作者自己添加 mean = np.array([mean]).T ##注意:np.array(mean)是数组不是向量,np.array([mean])是行向量 result = np.concatenate((mean,std),axis=1)##axis=1按照列拼接 display(result)
4.4.2CAPM的应用(30分)【编程题】
- 读取文件内数据利用pandas
- 使用编程,会告诉无风险利率(将年利率转化为日线利率)
- 提取信息,计算收益率(3个公式哪个都行,或者直接用包里面自带的函数)算Ri,利用公式(3),拟合CAMP模型
解:
1.
##导包 import pandas as pd ##读取数据 df_902 = pd.read_csv('中证流通指数.csv',index_col='Trddt') ##注意:输入的是子路径,该文件与此ipynb文件在同一路径下 ##index_col参数设置的是显示在第一列的标签,可将此参数去掉对比区别,设置有助于后面使用merge函数时候设置left_index与right_index参数 df_902.index = pd.to_datetime(df_902.index) ##将时间的所有格式统一为pandas可以操作的格式 df_902.head() ###取前五行数据
Opnindex Hiindex Loindex Clsindex Retindex Trddt 2014-01-02 3014.540 3029.042 3006.146 3028.749 0.002563 2014-01-03 3019.490 3022.980 2988.794 3001.462 -0.009009 2014-01-06 2995.242 2995.242 2922.058 2927.477 -0.024650 2014-01-07 2911.057 2943.681 2905.071 2938.602 0.003800 2014-01-08 2942.276 2972.339 2933.970 2950.733 0.004128
## 提取中证流通指数收益率:matret mktret = df_902.Retindex mktret.name = 'mktret'##给dataframe改名 mktret.head()
Trddt 2014-01-02 0.002563 2014-01-03 -0.009009 2014-01-06 -0.024650 2014-01-07 0.003800 2014-01-08 0.004128 Name: mktret, dtype: float64mktret = mktret['2014'] ##读取2014年数据 ##注意:若前面不输入datetime此处无法进行操作 mktret.tail() #索引后五行
Trddt 2014-12-25 0.024282 2014-12-26 0.020379 2014-12-29 -0.005938 2014-12-30 -0.008057 2014-12-31 0.015834 Name: mktret, dtype: float642.
计算公式
#rf为已知,将年无风险收益率转化为日无风险利率 rf = 1.036**(1/360)-1 rf
3.
读取新安股份数据
df_596 = pd.read_csv('新安股份.csv',index_col='Date') df_596.index = pd.to_datetime(df_596.index) df_596.head()
Open High Low Close Volume Date 2014-01-02 10.62 10.99 10.58 10.96 10984100 2014-01-03 10.89 11.04 10.71 10.85 7629900 2014-01-06 10.83 10.83 10.00 10.10 14364700 2014-01-07 10.05 10.22 9.95 10.11 5219100 2014-01-08 10.18 10.28 10.04 10.06 5764200
计算股份收益率Rt## 用收盘价(close)计算股份收益率 #xin_anret = (df_596.Close-df_596.Close.shift(1))/df_596.Close.shift(1) xin_anret = df_596.Close.pct_change() ##pct_change为上述公式的包装函数,都会造成缺失值 xin_anret.name = 'returns' xin_anret = xin_anret.dropna() ##删除存在缺失值所在的行 xin_anret.head()
Date 2014-01-03 -0.010036 2014-01-06 -0.069124 2014-01-07 0.000990 2014-01-08 -0.004946 2014-01-09 -0.017893 Name: returns, dtype: float64##合并新安股份和市场指数收益率 #Ret = pd.merge(mktret,xin_anret,left_index=True,right_index=True,how='inner') ##inner取交集 left_index.right_index合并index Ret = pd.concat([mktret,xin_anret],axis=1).dropna() Ret.head()
mktret returns 2014-01-03 -0.009009 -0.010036 2014-01-06 -0.024650 -0.069124 2014-01-07 0.003800 0.000990 2014-01-08 0.004128 -0.004946 2014-01-09 -0.011499 -0.017893
Eret = Ret-rf ##第一列为rm-rf,第二列为rt-rf,对比公式(3) Eret.head()
mktret returns 2014-01-03 -0.009107 -0.010135 2014-01-06 -0.024748 -0.069223 2014-01-07 0.003702 0.000892 2014-01-08 0.004030 -0.005044 2014-01-09 -0.011597 -0.017991
拟合CAMP模型,ls##绘制散点图,观察rt-rf与rm-rf的关系,有助于后面的ls ## 导包 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['simhei'] plt.rcParams['axes.unicode_minus'] = False plt.figure(figsize=(8,4)) #设置画布 plt.scatter(Eret.iloc[:,0],Eret.iloc[:,1]) ##绘制散点图,横坐标为rm-rf,纵坐标为rt-rf ##注意:iloc索引的是index,loc索引的是label plt.title('新安股份和中正物流指数日益收益率',loc='center')##设置图像主题 plt.show()
## 拟合CAPM模型 ##导入统计学包 import statsmodels.api as sm model = sm.OLS(Eret.iloc[:,1],Eret.iloc[:,0]) ##OLS(Y,X) Y=rt-rf,X=rm-rf,选定数据与训练模型的方法 result = model.fit() #进行拟合 result.summary() ##展示结果
OLS Regression Results Dep. Variable: returns R-squared (uncentered): 0.237 Model: OLS Adj. R-squared (uncentered): 0.234 Method: Least Squares F-statistic: 75.07 Date: Wed, 11 Jun 2025 Prob (F-statistic): 6.58e-16 Time: 23:45:21 Log-Likelihood: 577.85 No. Observations: 243 AIC: -1154. Df Residuals: 242 BIC: -1150. Df Model: 1 Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975] mktret 1.1096 0.128 8.664 0.000 0.857 1.362
Omnibus: 46.961 Durbin-Watson: 1.983 Prob(Omnibus): 0.000 Jarque-Bera (JB): 216.063 Skew: 0.655 Prob(JB): 1.21e-47 Kurtosis: 7.430 Cond. No. 1.00
Notes:
[1] R² is computed without centering (uncentered) since the model does not contain a constant.
[2] Standard Errors assume that the covariance matrix of the errors is correctly specified.
R方只有0.237垃圾
第三题(手算题目)
P306.7电子书 谁α大选谁,还是考察公式(3)
第四题(禁止人工智障)
谈一谈对量化投资的理解,感受
解:答案在下方,请下滑
想什么呢,自己写
想要....你求我啊,继续下滑
求我我也不给你