import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tushare as ts
import statsmodels.api as sm
pro = ts.pro_api('')
s = {}
stock_name = ['600521.SH', '600522.SH','600523.SH','000001.SZ',\
'600525.SH', '600526.SH', '600527.SH', '600528.SH']
#导入数据
for i in range(8):
s[i] = pro.daily(ts_code = stock_name[i], start_date = '20000101', end_date = '20190101')
bm = pro.index_daily(ts_code='399300.SZ', start_date='20000101', end_date='20190101')
#处理日期格式
for i in range(8):
s[i]['trade_date'] = pd.to_datetime(s[i]['trade_date'], format='%Y%m%d')
bm['trade_date'] = pd.to_datetime(bm['trade_date'])
#时间对齐
us = {}
for i in range(8):
us[i] = pd.merge(s[i]['close'], bm['close'], how='inner', left_on=s[i]['trade_date'], right_on=bm['trade_date'])
#计算收益率
r = {}
bm = {}
for i in range(8):
r[i] = np.log(us[i]['close_x'].shift(1)) - np.log(us[i]['close_x'])
bm[i] = np.log(us[i]['close_y'].shift(1)) - np.log(us[i]['close_y'])
#画图
for i in range(8):
plt.figure(i)
plt.scatter(r[i],bm[i])
#单资产时间序列检验
beta = []
p = []
for i in range(8):
model = sm.OLS(bm[i][1:],r[i][1:]).fit()
beta.append(model.params.values) #params是series格式
p.append(model.pvalues.values)
#惯性效应,翻转效应--------------------------------------------------
df = pd.merge(s[0][['trade_date', 'close']], s[1][['trade_date', 'close']], left_on=s[0]['trade_date'], right_on=s[1]['trade_date'])
del df['trade_date_x']
del df['trade_date_y']
df = df.rename(columns = {'key_0':'trade_date', 'close_x': 'close'+ str(1), 'close_y': 'close'+str(2)})##列名重新命名
for i in np.arange(3,8):
df = pd.merge(df, s[i][['trade_date', 'close']], left_on=df['trade_date'], right_on=s[i]['trade_date'])
del df['trade_date_x']
del df['trade_date_y']
df = df.rename(columns={'key_0': 'trade_date', 'close': 'close' + str(i)}) ##列名重新命名
df['year'] = df['trade_date'].apply(lambda x: x.year)
df['month'] = df['trade_date'].apply(lambda x: x.month)
#由每日数据计算月度收益
ind = 0
stock_ret = []
stock_name= ['close' + str(i) for i in range(1,8)]
for i in stock_name:
df[i] = df[i].apply(lambda x: np.log(x))
close = np.array(df.iloc[:,1:8])
time = df['month']
while ind < int(len(time) - 1):
initial = close[-1]
if time[ind+1] == time[ind]:
ind = ind+1
else:
last = close[ind]
stock_ret.append( last - initial)
initial = close[ind+1]
ind += 1
stock_ret = pd.DataFrame(stock_ret)
column_name = ['ret'+str(i) for i in range(1,8)]
stock_ret.columns = column_name
#计算前1,2,3,6,12月的赢家组合
win_time = [1, 2, 3, 6, 12]
after_time = [1, 3, 6, 12]
ret_hist= np.array(stock_ret)
win_ret = []
lose_ret = []
name = []
for i in win_time:
for j in after_time:
win_index = []
lose_index = []
temp_max = []
temp_min = []
name.append(str(i)+'_'+str(j))
temp = list((1+ret_hist[:i,:]).prod(axis = 0)-1)
temp_max = list(np.sort(temp)[-1::-1][:3])
temp_min = list(np.sort(temp)[-1::-1][3:])
for k in temp_max:
win_index.append(temp.index(k))#只有list才有index, index一次只能加入一个数字。// 只有np.array()才能一次引用很多
for k in temp_min:
lose_index.append(temp.index(k))
temp = np.array(((1 + ret_hist[i:i+j, :]).prod(axis=0) - 1)) ##list引用不能用[],只能是一个,但是np.array()引用可以用[]
win_ret.append(np.sum(1/3 * np.ones(3) * temp[win_index]))
lose_ret.append(np.sum(1/4 * np.ones(4) * temp[lose_index]))
result = np.vstack([name, win_ret, lose_ret]).T
table = pd.DataFrame(result, columns = ['date', 'win_ret', 'lose_ret'])
惯性效应与反转效应——tushare实验
最新推荐文章于 2022-02-11 17:52:24 发布