挑選五只股票:萬科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')