挑选五只股票:万科A、中国平安、贵州茅台、万华化学和科大讯飞,然后我们以沪深300作为市场基准。
import pandas as pd
import tushare as ts
# 获取数据
pro = ts.pro_api()
wanke = pro.daily(ts_code='000002.SZ', start_date='20170101')
pingan = pro.daily(ts_code='601318.SH', start_date='20170101')
maotai = pro.daily(ts_code='600519.SH', start_date='20170101')
wanhua = pro.daily(ts_code='002415.SZ', start_date='20170101')
keda = pro.daily(ts_code='002230.SZ', start_date='20170101')
hs300 = pro.index_daily(ts_code='000300.SH', start_date='20170101')
# 仅保留收益率数据,且用日期作为index
# 然后按照日期排序(增序)
stock_list = [wanke, pingan, maotai, wanhua, keda, hs300]
for stock in stock_list:stock.index = pd.to_datetime(stock.trade_date)
df = pd.concat([stock.pct_chg / 100 for stock in stock_list], axis=1)
df.columns = ['wanke', 'pingan', 'maotai', 'wanhua', 'keda', 'hs300']
df = df.sort_index(ascending=True)
df.describe()
df = df.fillna(0)
returns = (df + 1).product() - 1
print('累计收益率:\n', returns)
print('\n标准差:\n', df.std())
#两年来的收益率波动情况:
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
sns.set()
mpl.rcParams['font.family'] = 'sans-serif'
mpl.rcParams['font.sans-serif'] = 'SimHei'
plt.figure(figsize=(10, 5))
for col in df.columns:plt.plot(df[col], label=col)
plt.title('日收益率时序图(2017至今)', fontsize=20)
plt.legend();
plt.figure(figsize=(10, 5))
for col in df.columns:plt.plot((df[col]+1).cumprod()-1, label=col)
plt.title('累计收益率时序图(2017至今)', fontsize=20)
plt.legend();
#我们先假设无风险固定收益为3.2%,那么平均每日的无风险收益率为:rf = 1.032 ** (1/360) - 1
print(rf)#需要计算出这些股票和沪深300各自的风险溢酬。df_rp = df - rf
df_rp.head()sns.pairplot(df_rp);
我们这次使用statsmodels来求解,在这里我们使用sm.add_constant()方法增加一个常数项,用于求解α。
import statsmodels.api as sm
stock_names = {'wanke': '万科A','pingan': '中国平安','maotai': '贵州茅台','wanhua': '万华化学','keda': '科大讯飞'
}
for stock in ['wanke', 'pingan', 'maotai', 'wanhua', 'keda']:model = sm.OLS(df_rp[stock], sm.add_constant(df_rp['hs300']))result = model.fit()print(stock_names[stock] + '\n')print(result.summary())print('\n\n')