python量化投资期末复习

来自作者大大的温馨提示,本文章的代码块可以使用伟大的CSDN(平台能否少点收成呀,嘿嘿开个玩笑)直接运行的都没有直接附上结果,请读者谅解,需要读取数据而无法运行的均已经附上结果.最后留一下作业,请给作者大大点赞+好评

4.3.1投资组合理论(30分)

  1. 两个公式,计算表内数据
  2. 用编程语言编程实现上述两个公式

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分)【编程题】

  1. 读取文件内数据利用pandas
  2. 使用编程,会告诉无风险利率(将年利率转化为日线利率)
  3. 提取信息,计算收益率(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()    ###取前五行数据
OpnindexHiindexLoindexClsindexRetindex
Trddt
2014-01-023014.5403029.0423006.1463028.7490.002563
2014-01-033019.4903022.9802988.7943001.462-0.009009
2014-01-062995.2422995.2422922.0582927.477-0.024650
2014-01-072911.0572943.6812905.0712938.6020.003800
2014-01-082942.2762972.3392933.9702950.7330.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: float64
mktret = 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: float64

2.

计算公式

$$ \left( 1+R_f \right) ^{360}=R_{\text{年}} $$

#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()
OpenHighLowCloseVolume
Date
2014-01-0210.6210.9910.5810.9610984100
2014-01-0310.8911.0410.7110.857629900
2014-01-0610.8310.8310.0010.1014364700
2014-01-0710.0510.229.9510.115219100
2014-01-0810.1810.2810.0410.065764200
计算股份收益率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()
mktretreturns
2014-01-03-0.009009-0.010036
2014-01-06-0.024650-0.069124
2014-01-070.0038000.000990
2014-01-080.004128-0.004946
2014-01-09-0.011499-0.017893
Eret = Ret-rf  ##第一列为rm-rf,第二列为rt-rf,对比公式(3)
Eret.head()
mktretreturns
2014-01-03-0.009107-0.010135
2014-01-06-0.024748-0.069223
2014-01-070.0037020.000892
2014-01-080.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:returnsR-squared (uncentered):0.237
Model:OLSAdj. R-squared (uncentered):0.234
Method:Least SquaresF-statistic:75.07
Date:Wed, 11 Jun 2025Prob (F-statistic):6.58e-16
Time:23:45:21Log-Likelihood:577.85
No. Observations:243AIC:-1154.
Df Residuals:242BIC:-1150.
Df Model:1
Covariance Type:nonrobust
coefstd errtP>|t|[0.0250.975]
mktret1.10960.1288.6640.0000.8571.362
Omnibus:46.961Durbin-Watson:1.983
Prob(Omnibus):0.000Jarque-Bera (JB):216.063
Skew:0.655Prob(JB):1.21e-47
Kurtosis:7.430Cond. 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)

第四题(禁止人工智障)

谈一谈对量化投资的理解,感受

解:答案在下方,请下滑

想什么呢,自己写

想要....你求我啊,继续下滑

                                        求我我也不给你

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值