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()    ###取前五行数据
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: 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()
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)

第四题(禁止人工智障)

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

解:答案在下方,请下滑

想什么呢,自己写

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

                                        求我我也不给你

作者:郑在下海

物联沃分享整理
物联沃-IOTWORD物联网 » Python量化投资期末复习指南

发表回复