Advertisement

003 | 掌握金融量化交易库Tushare

阅读量:

👉👉👉 《玩转Python金融量化专栏》👈👈👈

订阅本专栏的可以下载对应的代码和数据集

🚀 上一篇 🌟 下一篇
⬅️ 002 常见的金融量化指标计算 004 掌握金融量化交易库Talib ➡️

金融量化交易库

1 Tushare

Tushare是一款免费提供、开源代码,且完全免费使用的Python财经数据接口工具,支持获取新浪财经、腾讯财经、上交所和深交所等主要财经机构提供的数据。

新版本的使用需要通过注册并获取token才能实现免费访问,注册网址为:https://tushare.pro。建议用户先访问个人主页,找到并点击"接口TOKEN"功能模块,按照提示复制token字段的值。具体操作步骤如图6-3所示。

安装 Tushare(进入cmd模式):pip install tushare

Tushare获取股票行情数据,使用的是ts.get_hist_data()函数,其输入参数为:

股票代码或指数代码,起始日期(YYYY-MM-DD格式),终止日期(YYYY-MM-DD格式),数据类型(D=日数据,W=周数据,M=月数据,5=5分钟数据,15=15分钟数据,30=30分钟数据,60=60分钟数据。默认为日数据)

(1)Tushare平安股票分析

以股票行情数据为例,介绍tushare的数据获取方式。股票行情数据,简要介绍获取数据的方法。

复制代码
    #先引入分析、可视化等库、
    import numpy as np
    import tushare as ts
    import pandas as pd  
    import matplotlib.pyplot as plt
    from pylab import mpl
    #正常显示画图时出现的中文和负号
    mpl.rcParams['font.sans-serif']=['SimHei']
    mpl.rcParams['axes.unicode_minus']=False
    # 设置token
    ts.set_token('your token here')
    pro = ts.pro_api('your token here')
    # 601318 平安股票代码
    pingan = ts.get_k_data('601318',start='2011-01-01')
    pingan.head()
    
    	date	open	close	high	low	volume	code
    0	2011-01-04	24.984	25.011	25.314	24.830	245626.0	601318
    1	2011-01-05	24.870	24.110	24.962	24.083	427554.0	601318
    2	2011-01-06	24.145	23.112	24.145	22.611	947078.0	601318
    3	2011-01-07	23.279	23.297	23.842	22.765	659013.0	601318
    4	2011-01-10	23.248	22.866	23.688	22.809	282919.0	601318
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI助手

将data变成dateframe的index,绘制收盘价的日趋势图

复制代码
    pingan['date'] = pd.to_datetime(pingan.date)
    pingan.set_index('date',inplace = True)
    pingan['close'].plot(figsize=(12,8))
    
    
      
      
      
    
    AI助手

绘制收盘价的日趋势图,如下图6-4所示

绘制特定年份,比如查看2017年平安收盘价的日趋势图

复制代码
    pingan['close'].loc['2017'].plot(figsize=(12,8))
    
    
      
    
    AI助手

绘制2017年收盘价的日趋势图,如下图6-5所示

制作收盘价趋势图,以年份为横坐标轴,每年分别绘制折线图,以便更直观地反映各年的升降趋势。

复制代码
    # to_period('A')将date切换成年份 groupby(level = 0)将同一个年份的分为一组
    pingan['close'].to_period('A').groupby(level = 0).first().plot(figsize=(12,8))
    
    
      
      
    
    AI助手

绘制收盘价趋势图,如下图6-6所示

对时间数据进行处理,Pandas提供了移动窗口这一概念。将某个点的数值扩展为包含该点的一个区间范围,通过区间进行判断,这个区间即为窗口。接下来,我们展示了21天(即一个月)和250天(即一年)的收盘价移动窗口。

复制代码
    # 计算移动窗口21 和250 的均值
    pingan['21d'] = pingan['close'].rolling(window=42).mean()
    pingan['250d'] = pingan['close'].rolling(window=250).mean()
    pingan[['close','21d','250d']].plot(figsize=(12,8),color = ['y','r','b'])
    
    
      
      
      
      
    
    AI助手

绘制收盘价移动窗口,如下图6-7所示

股票收益率是用于反映股票收益水平的重要指标。投资者在购买股票或债券时,最关注的则是能获得的收益多少,而衡量证券投资收益大小的指标是收益率。常用的指标包括简单收益率和对数收益率。

简单收益率:今天的收盘价P1与上一日的收盘价P0的差额,除以上一日的收盘价P0,即为简单收益率。其计算公式为\frac{P_1 - P_0}{P_0} = \frac{P_1}{P_0} - 1。对数收益率则为今天的收盘价P1与上一日的收盘价P0的比值取自然对数,即ln(\frac{P_1}{P_0})。计算平安股票的简单总收益率时,可以通过最后一天的收盘价与初始收盘价的差额,除以初始收盘价来获得。总收益率的年平均值可以通过将总收益率开总年份次方得到,而平均年收益率的具体数值则需要对总收益率的年份倒数次方进行计算。类似地,对数总收益率可以通过对数运算直接获得。

复制代码
    simple_profit = (pingan['close'][-1] - pingan['close'][0])/pingan['close'][0]
    print("简单总收益率: " + str(simple_profit ))
    years = pingan.index[-1].year - pingan.index[0].year
    print("简单平均年收益率: " + str(simple_profit **(1/years)))
    log_profit = np.log(pingan['close'][-1]/pingan['close'][0])
    print("对数总收益率: " + str(log_profit))
    print("简单平均年收益率: " + str(log_profit**(1/years)))
    ######结果如下######
    简单总收益率: 2.338131222262205
    简单平均年收益率: 1.0989689730477454
    对数总收益率: 1.205411136109323
    简单平均年收益率: 1.0209747983893707
    
    
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI助手

从整体上讲,对数收益率更能体现其特性。股票价格的波动现象普遍存在,其定义为股票价格变化的形态,表现为大趋势中包含相反的小趋势运动的状态。在股价波动过程中,主要呈现出三种趋势:即上涨趋势中的波动、下跌趋势中的波动以及无趋势状态的波动。通过绘制对数收益率的波动图,可以更直观地反映股票价格的波动特征。

复制代码
    pingan['profit'] = np.log(pingan['close']/pingan['close'].shift(1))   
    pingan['profit'].plot(figsize=(12,8),linestyle="--",marker="o",color="g")
    
    
      
      
    
    AI助手

绘制对数收益率波动图,如下图6-8所示

对数收益率波动挺大的,真应了投资需谨慎,股票有风险

使用古老的蒙特卡洛法预测股票在未来的变化情况

蒙特卡洛方法是一种广泛使用的随机算法集合。自二十世纪电子计算机的诞生以来,已在多个领域展现了卓越的应用能力。蒙特卡洛方法亦称统计模拟方法,是20世纪中叶,随着科学技术和电子计算机的兴起而发展起来的一种数值计算方法,其理论基础是概率统计。蒙特卡洛方法通过生成大量随机数(或伪随机数)来估算和求解各种复杂的数学和物理问题。

对于明天的股价是不知道的,要通过已有的数据来预测。

蒙特卡洛提出:
PriceToday = PriceYesterday * e^{(\mu-{\frac{\sigma^2}{2}+\sigma*Z[Rand(0,1)]}}

通过正态分布的概率面积计算坐标x。例如,当阴影部分的面积为0.75时,通过查表确定x位于0.67至0.68之间。

Python通过scipy中的norm.ppf计算Z值

复制代码
    >> from scipy.stats import norm
    >> norm.ppf(3/4)
    0.6744897501960817
    
    
      
      
      
    
    AI助手

在分析中,利用Python代码应用蒙特卡洛方法进行10次预测模拟,对未来的平安股票价格变动情况进行分析。

复制代码
    from scipy.stats import norm
    # 对数收益率
    log_returns = np.log(1 + pingan["close"].pct_change())
    # 对数收益率平均值
    u = log_returns.mean()
    # 对数收益率方差
    var = log_returns.var()
    # 对数收益率标准差
    std = log_returns.std()
    # 一年交易252(预测一年)
    t_intervals = 252
    # 迭代10次
    iterations = 10
    # 蒙特卡洛预测
    daily_returns = np.exp(u - (0.5 * var) + std * norm.ppf(np.random.rand(t_intervals, iterations)))
    daily_returns.shape # (252, 10)
    # 将最后一天作为开始
    S0 = pingan["close"].iloc[-1]
    # 创建(252,10)的零矩阵
    price_list = np.zeros_like(daily_returns)
    # 将S0 赋予 price_list[0]
    price_list[0] = S0
    
    #在范围(1,t_间隔)内创建一个循环,该循环将日价格(t-1)与日回报值(t)的乘积重新分配给时间t中的价格。
    for t in range(1, t_intervals):
    price_list[t] = price_list[t - 1] * daily_returns[t]
    
    plt.figure(figsize=(10,6))
    plt.plot(price_list)
    plt.show()
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI助手

蒙特卡洛预测结果,如下图6-10所示

值得注意的是,传统蒙特卡洛方法在预测股票走势时存在预测偏差,其变动受到多种其他因素的影响。

(2)分析多只股票的日收益率均值

使用均值和标准差分别对应刻画股票(指数)的收益率和波动率,对比研究不同股票(指数)的收益与风险特征。

构建一个计算股票收益率和标准差的函数

复制代码
    def return_risk(stocks,startdate='2005-01-01'):
    '''
    stocks:多只股票的字典组合
    默认起始时间为'2005-01-01'
    '''
    close=pd.DataFrame()
    for stock in stocks.values():
        # 读取股票的收盘价
        close[stock]=ts.get_k_data(stock,ktype='D',start=startdate)['close']
    # 计算收益率    
    tech_rets = close.pct_change()[1:]
    rets = tech_rets.dropna()
    # 转换为%
    ret_mean=rets.mean()*100
    ret_std=rets.std()*100
    return ret_mean,ret_std
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI助手

构建日收益率和标准差画图函数

复制代码
    def plot_return_risk(stocks):
    ret,vol=return_risk(stocks)
    color=np.array([0.1,0.3,0.5,0.7,0.9,0.95])
    plt.scatter(ret, vol, marker = 'o', 
    c=color,s = 500,cmap=plt.get_cmap('Spectral'))
    plt.xlabel("日收益率均值%")     
    plt.ylabel("标准差%")
    for label,x,y in zip(stocks.keys(),ret,vol):
        plt.annotate(label,xy = (x,y),xytext = (20,20),textcoords = "offset points", ha = "right",va = "bottom",bbox = dict(boxstyle = 'round,pad=0.5',fc = 'yellow', alpha = 0.5),
    arrowprops = dict(arrowstyle = "->", connectionstyle = "arc3,rad=0"))
    
    
      
      
      
      
      
      
      
      
      
      
    
    AI助手

对主要金融企业的日收益率均值和标准差指标进行考察。

复制代码
    stocks={'中国平安':'601318','格力电器':'000651', '招商银行':'600036',
        '恒生电子':'600570','中信证券':'600030','贵州茅台':'600519'}
    plot_return_risk(stocks=stocks)
    
    
      
      
      
    
    AI助手

结果如下图6-11所示

首先,研究上证综指、深成指、沪深300指数、上证50指数、中证中小板指数以及创业板指的日收益率均值和标准差,以评估各市场表现。

复制代码
    stocks={'上证指数':'sh','深证指数':'sz','沪深300':'hs300',
        '上证50':'sz50','中小板指数':'zxb','创业板指数':'cyb'}
    plot_return_risk(stocks)
    
    
      
      
      
    
    AI助手

结果如下图6-12所示

研究中国联通、东风汽车、长安汽车、浦发银行、工商银行及农业银行的日收益率均值与标准差。

复制代码
    stocks={'中国联通':'600050','东风汽车':'600006','长安汽车':'000625',
        '浦发银行':'600000','工商银行':'601398','农业银行':'601288'}
    plot_return_risk(stocks)
    
    
      
      
      
    
    AI助手

结果如下图6-13所示

在选择股票时,建议优先考虑日收益率较高且标准差较低的标的。如贵州茅台股票,其累计涨幅高达118.46%,从而引发了股票市场的热烈讨论。

更多Tushare教程查看官方文档:http://tushare.waditu.com/

👉👉👉 《玩转Python金融量化专栏》👈👈👈

订阅本专栏的可以下载对应的代码和数据集

🚀 上一篇 🌟 下一篇
⬅️ 002 常见的金融量化指标计算 004 掌握金融量化交易库Talib ➡️

全部评论 (0)

还没有任何评论哟~