利用tushare-pro进行时间序列分析

利用tushare-pro进行时间序列分析

tushare-id:371594

一些预备知识

我们称一个时间序列 { x t } \left\{ {{x}_{t}} \right\} {xt},满足在这里插入图片描述
称其服从 G A R C H ( m , s ) GARCH\left( m,s \right) GARCH(m,s)模型,即广义自回归条件异方差模型。其中, μ t {{\mu }_{t}} μt为均值项, a t {{a}_{t}} at为残差项, a t {{a}_{t}} at的条件方差是时变的,即条件异方差。 a 2 t − i {{a}^{2}}_{t-i} a2ti是 ARCH项,反映第前 i i i期的新消息; σ 2 t − i {{\sigma }^{2}}_{t-i} σ2ti 是条件方差即 GARCH 项,是对第前 j j j期方差的预测。同时,各项的系数应该满足非负条件。

准备工作,导入需要的包

import pandas as pd
import numpy as np
import statsmodels.tsa.api as smt     
#tsa为Time Series analysis缩写
import statsmodels.api as sm
import scipy.stats as scs
from arch import arch_model
#画图
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False

登录tushare

import tushare as ts
token='输入你的token'
pro=ts.pro_api(token)

编写函数反映金融数据特征

def ts_plot(data, lags=None,title=''):
    if not isinstance(data, pd.Series):   
        data = pd.Series(data)
    #matplotlib官方提供了五种不同的图形风格,
    #包括bmh、ggplot、dark_background、
    #fivethirtyeight和grayscale
    with plt.style.context('ggplot'):    
        fig = plt.figure(figsize=(10, 8))
        layout = (3, 2)
        ts_ax = plt.subplot2grid(layout, (0, 0))
        acf_ax = plt.subplot2grid(layout, (1, 0))
        pacf_ax = plt.subplot2grid(layout, (1, 1))
        qq_ax = plt.subplot2grid(layout, (2, 0))
        pp_ax = plt.subplot2grid(layout, (2, 1))
        data.plot(ax=ts_ax)
        ts_ax.set_title(title+'时序图')
        smt.graphics.plot_acf(data, lags=lags,
              ax=acf_ax, alpha=0.5)
        acf_ax.set_title('自相关系数')
        smt.graphics.plot_pacf(data, lags=lags,
             ax=pacf_ax, alpha=0.5)
        pacf_ax.set_title('偏自相关系数')
        sm.qqplot(data, line='s', ax=qq_ax)
        qq_ax.set_title('QQ 图')        
        scs.probplot(data, sparams=(data.mean(), 
          data.std()), plot=pp_ax)
        pp_ax.set_title('PP 图') 
        plt.tight_layout()
    return

调用tusharepro数据,进行分析

df=pro.index_daily(ts_code='000300.SH')#调用沪深300指数日线情况
df.index=pd.to_datetime(df.trade_date)#换时间戳
df=df.sort_index()#按照index排序
df['ret']=np.log(df.close/df.close.shift(1))#计算ret率
#df.head()
ts_plot(df.ret.dropna(),lags=30,title='沪深300收益率')

结果在这里插入图片描述

从上图可以看出,沪深300指数收益率时间序列呈现出以下几个现象,具有一定的普遍性。

自相关性比较弱,但对其进行变换后,如取平方、绝对值等,则表现出很强的自相关性(见后文);

收益率的条件方差(Conditional Variance)随着时间而变化,即存在条件异方差的特征。

收益率序列的波动具有持续性,即存在波动集聚(Volatility Clustering)的现象。比如2007-2008、2015-2016、2019具有较大的波动性。

QQ图显示,收益率并不服从正态分布,极端值较多,具有厚尾的现象。

GARCH模型

模拟garch(1,1)模型
# 模拟GARCH(1, 1) 过程
np.random.seed(1)
a0 = 0.2
a1 = 0.5
b1 = 0.3
n = 10000
w = np.random.normal(size=n)
garch = np.zeros_like(w)
sigsq = np.zeros_like(w)
for i in range(1, n):
    sigsq[i] = a0 + a1*(garch[i-1]**2) + b1*sigsq[i-1]
    garch[i] = w[i] * np.sqrt(sigsq[i])
_ = ts_plot(garch, lags=30,title='模拟GARCH')

在这里插入图片描述

使用模拟的数据,进行模型拟合
#update_freq=0表示不输出中间结果,只输出最终结果

# 使用模拟的数据进行 GARCH(1, 1) 模型拟合
#arch_model默认建立GARCH(1,1)模型
am = arch_model(garch)
res = am.fit(update_freq=0)

print(res.summary())

在这里插入图片描述

拟合沪深300收益率数据
Y=ret*100.0
am = arch_model(Y,p=1, o=1, q=1, dist='StudentsT')
res = am.fit(update_freq=0)
#update_freq=0表示不输出中间结果,只输出最终结果
print(res.summary())

在这里插入图片描述

res.resid.plot(figsize=(12,5))
plt.title('沪深300收益率拟合GARCH(1,1)残差',size=15)
plt.show()
res.conditional_volatility.plot(figsize=(12,5),color='r')
plt.title('沪深300收益率条件方差',size=15)
plt.show()

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个示例python代码,用于利用tushare的pro版本获取股票数据并执行alpha因子选取: ```python import tushare as ts import pandas as pd import numpy as np # 设置tushare的token ts.set_token('your_token_here') # 初始化tushare的pro api pro = ts.pro_api() # 获取股票列表 stock_list = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,industry') # 准备alpha因子选取所需的数据 start_date = '20200101' end_date = '20211231' benchmark = '000300.SH' factor_list = ['pe', 'pb', 'roe'] # 获取股票因子数据 def get_stock_factors(code): # 获取股票的日线数据 daily_data = pro.daily(ts_code=code, start_date=start_date, end_date=end_date) # 获取股票的财务数据 financial_data = pro.fina_indicator(ts_code=code, start_date=start_date, end_date=end_date) # 合并数据 merged_data = pd.merge(daily_data, financial_data, on='trade_date', how='inner') # 计算因子值 pe = merged_data['close'] / merged_data['eps_basic'] pb = merged_data['close'] / merged_data['bvps'] roe = merged_data['roe'] # 返回因子值 return pd.DataFrame({'pe': pe, 'pb': pb, 'roe': roe}) # 计算alpha因子 def calc_alpha(stock_factors): # 计算每个因子的z-score pe_z = (stock_factors['pe'] - stock_factors['pe'].mean()) / stock_factors['pe'].std() pb_z = (stock_factors['pb'] - stock_factors['pb'].mean()) / stock_factors['pb'].std() roe_z = (stock_factors['roe'] - stock_factors['roe'].mean()) / stock_factors['roe'].std() # 计算alpha因子 alpha = pe_z * 0.3 + pb_z * 0.3 + roe_z * 0.4 return alpha # 获取股票因子数据和alpha因子 def get_stock_alpha(code): # 获取股票因子数据 stock_factors = get_stock_factors(code) # 计算alpha因子 alpha = calc_alpha(stock_factors) # 返回因子数据和alpha因子 return stock_factors, alpha # 获取股票alpha因子数据 stock_alpha_data = {} for code in stock_list['ts_code']: try: stock_factors, alpha = get_stock_alpha(code) stock_alpha_data[code] = {'factors': stock_factors, 'alpha': alpha} except: pass # 将alpha因子转换为DataFrame alpha_data = pd.DataFrame({code: data['alpha'] for code, data in stock_alpha_data.items()}) # 计算每支股票的alpha因子得分 alpha_score = (alpha_data - alpha_data.mean()) / alpha_data.std() # 获取市场指数数据 index_data = pro.index_daily(ts_code=benchmark, start_date=start_date, end_date=end_date) index_data = index_data.set_index('trade_date').sort_index() # 计算市场指数收益率 index_return = index_data['close'] / index_data['close'].shift(1) - 1 # 计算每支股票的超额收益率 excess_return = alpha_score * index_return # 计算每日的投资组合收益率 portfolio_return = excess_return.mean(axis=1) # 计算投资组合的夏普比率 sharpe_ratio = np.sqrt(252) * portfolio_return.mean() / portfolio_return.std() # 输出结果 print('Sharpe Ratio:', sharpe_ratio) ``` 该代码的基本思路是首先获取股票列表,然后循环遍历每支股票,获取其日线数据和财务数据,计算出其对应的pe、pb和roe因子值,然后根据这些因子值计算出该股票的alpha因子。接下来,将每支股票的alpha因子转换为DataFrame,并计算每支股票的alpha因子得分。然后获取市场指数数据,计算出市场指数收益率,再根据每支股票的alpha因子得分和市场指数收益率计算出每支股票的超额收益率,最后计算投资组合的夏普比率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值