本文主要基于tushare数据进行Treynor-Black模型投资组合的分析(个人的tushareID:498867)
Treynor-Black 方法旨在利用若干 alpha 值不为 0 的资产构建积极投资组合,并与被动组合搭配成为最优的风险资产组合。
Treynor ratio=(总收益-无风险收益)/投资组合贝塔值
import statsmodels.api as sm
from statsmodels import regression
import pandas as pd
# 导入tushare
import tushare as ts
import pandas as pd
dff=pd.DataFrame()
df_close=pd.DataFrame()
df_open=pd.DataFrame()
# 初始化pro接口
pro = ts.pro_api('你的token')
name=['600418.SH', '603355.SH', '002429.SZ', '002945.SZ', '002423.SZ',
'300376.SZ', '000656.SZ', '600985.SH', '600392.SH', '002085.SZ',
'601106.SH', '600188.SH', '002958.SZ', '601611.SH', '688321.SH',
'300724.SZ', '603267.SH', '002152.SZ', '603056.SH', '600968.SH']
for i in name:
# 导入tushare
# 拉取数据
try:
df = pro.daily(**{
"ts_code": i,
"trade_date": "",
"start_date": "20191231",
"end_date": "20220101",
"offset": "",
"limit": ""
}, fields=[
"ts_code",
"trade_date",
"open",
"high",
"low",
"close",
"pre_close",
"change",
"pct_chg",
"vol",
"amount"
])
dff[i]=df['pct_chg'].values
df_close[i]=df['close'].values
df_open[i]=df['open'].values
except:
pass
print(df_close)
print(df)
print(df_open)
得到以下三个表输出
f
dff['trade_date']=df['trade_date'].values
dff=dff.sort_values('trade_date')
df_close['trade_date']=df['trade_date'].values
df_close=df_close.sort_values('trade_date')
df_open['trade_date']=df['trade_date'].values
df_open=df_open.sort_values('trade_date')
dff=dff.set_index('trade_date')
df_close=df_close.set_index('trade_date')
df_open=df_open.set_index('trade_date')
df_close.loc['return2020']=df_close.loc['20201231']/df_close.loc['20191231']-1
df_close=df_close.drop('return2020')
def linreg(x,y):
x=sm.add_constant(x)
model=regression.linear_model.OLS(y,x).fit()
x=x[:,1]
return model.params[0],model.params[1]
X500=dff['000905.SH'].values
Y1=dff[name[0]].values
alpha,beta=linreg(X500,Y1)
print("alpha:",alpha)
print("beta:",beta)
alpha_sum=[]
beta_sum=[]
for i in range(20):
yy=dff[name[i]].values
alpha,beta=linreg(X500,yy)
alpha_sum.append(alpha)
beta_sum.append(beta)
dff.describe().loc['mean'].values[0:20]*243
df3=pd.DataFrame()
df3['alpha']=alpha_sum
df3['beta']=beta_sum
df3['returnMean']=dff.describe().loc['mean'].values[0:20]*243
df3.set_index('')
df3