数据分析(Tushare模块应用)
一、TuShare简介和环境安装
TuShare是一个著名的免费、开源的python财经数据接口包。其官网主页为:TuShare -财经数据接口包。该接口包如今提供了大量的金融数据,涵盖了股票、基本面、宏观、新闻的等诸多类别数据(具体请自行查看官网),并还在不断更新中。TuShare可以基本满足量化初学者的回测需求
环境安装:pip install tushare。如果是老版本升级,可以用升级命令pip install tushare --upgrade3,在python中导入包:import tushare as ts
二、Tushare的应用
我们主要还是应该掌握如何用tushare获取股票行情数据,使用的是ts.get_hist_data()函数或者ts.get_k_data()函数。输入参数为:
code:股票代码,即6位数字代码,或者指数代码(sh=上证指数 sz=深圳成指 hs300=沪深300指数 sz50=上证50 zxb=中小板 cyb=创业板)
start:开始日期,格式YYYY-MM-DD
end:结束日期,格式YYYY-MM-DD
ktype:数据类型,D=日k线 W=周 M=月 5=5分钟 15=15分钟 30=30分钟 60=60分钟,默认为D
retry_count:当网络异常后重试次数,默认为3
pause:重试时停顿秒数,默认为0
返回值说明:
date:日期
open:开盘价
high:最高价
close:收盘价
low:最低价
volume:成交量
price_change:价格变动
p_change:涨跌幅
ma5:5日均价
ma10:10日均价
ma20:20日均价
v_ma5:5日均量
v_ma10:10日均量
v_ma20:20日均量
turnover:换手率[注:指数无此项]
三、案例分析一(某股票的历史行情数据)
from typing import Any, Union import tushare as ts import numpy as np import pandas as pd # 使用 df = ts.get_k_data(code="600519", start="2000-01-01") # print(df) # 保存数据到文件 df.to_csv("./600519.csv") # index_col='date' 将源数据中date这一列转换成行索引index。 # parse_dates=['date'] 将data这一列的数据由str类型转换成date类型 df = pd.read_csv('./600519.csv', index_col='date', parse_dates=['date']) # 删除DataFrame数据中多余行 “Unnamed: 0” # 在DataFrame中axis=1表示列 # inplace=True 表示替换源数据 df.drop(labels='Unnamed: 0', axis=1, inplace=True) # print(df) # 需求:输出该股票所有收盘比开盘上涨3%以上的日期。 #(收盘-开盘)/开盘 >= 0.03 # 伪代码分析:(df['close'] - df['open']) / df['open'] >= 0.03 # 将上述表达式返回的布尔值作为df的行索引:取出了所有符合需求的行数据 df_row = df.loc[(df['close'] - df['open']) / df['open'] >= 0.03] # print(df_row) # 只获取行数据的index日期 df_date = df.loc[(df['close'] - df['open']) / df['open'] >= 0.03].index print(df_date) # 需求:输出该股票所有开盘比前日收盘跌幅超过2%的日期。 # 伪代码分析:(开盘 - 前日收盘) / 前日收盘 < -0.02 # 获取满足条件的返回结果True # shift(1) 当前列向下移一位 df_flag = Union[bool, Any] = (df['open'] - df['close'].shift(1)) / df['close'].shift(1) < -0.02 print(df_flag) # 获取满足条件的结果 df_row = df.loc[(df['open'] - df['close'].shift(1)) / df['close'].shift(1) < -0.02] # 只获取行数据的index日期 df_date = df_row.index print(df_date) # 需求:假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何? # 数据的重新取样 # 获取每月的第一条数据 df_monthly = df.resample('M').first() print(df_monthly) # 获取每年的最后一条数据,切片[:-1]不获取最后一年 df_yearly = df.resample('A').last()[:-1] # 所有年份每月第一个交易日购买的股票总数 cost_money = df_monthly['open'].sum()*100 # 所有年份每年最后一个交易日卖出的股票总数 recv_monry = df['open'][-1] * 800 + df_yearly['open'].sum()*1200 # 卖出的股票数-买入的股票数 = 获取的盈利 print(recv_monry - cost_money)
四、案例分析二(某股票的历史行情数据)
#o使用tushare包获取某股票的历史行情数据 df = pd.read_csv("600519.csv",index_col='date', parse_dates=['date'])[['open','close','low','high']] #o使用pandas包计算该股票历史数据的5日均线和60日均线 df['ma5']=df['open'].rolling(5).mean() df['ma30']=df['open'].rolling(30).mean() 什么是均线? 对于每一个交易日,都可以计算出前N天的移动平均值,然后把这些移动平均值连起来,成为一条线,就叫做N日移动平均线。移动平均线常用线有5天、10天、30天、60天、120天和240天的指标。 5天和10天的是短线操作的参照指标,称做日均线指标; 30天和60天的是中期均线指标,称做季均线指标; 120天和240天的是长期均线指标,称做年均线指标。 均线计算方法:MA=(C1+C2+C3+...+Cn)/N C:某日收盘价 N:移动平均周期(天数)
o使用matplotlib包可视化历史数据的收盘价和两条均线 plt.plot(df[['close','ma5','ma30']].iloc[:100]) o分析输出所有金叉日期和死叉日期 sr1 = df['ma5'] < df['ma30'] sr2 = df['ma5'] >= df['ma30'] death_cross = df[sr1 & sr2.shift(1)].index golden_cross = df[~(sr1 | sr2.shift(1))].index 股票分析技术中的金叉和死叉,可以简单解释为: 分析指标中的两根线,一根为短时间内的指标线,另一根为较长时间的指标线。 如果短时间的指标线方向拐头向上,并且穿过了较长时间的指标线,这种状态叫“金叉”; 如果短时间的指标线方向拐头向下,并且穿过了较长时间的指标线,这种状态叫“死叉”; 一般情况下,出现金叉后,操作趋向买入;死叉则趋向卖出。当然,金叉和死叉只是分析指标之一,要和其他很多指标配合使用,才能增加操作的准确性。 o如果我从假如我从2010年1月1日开始,初始资金为100000元,金叉尽量买入,死叉全部卖出,则到今天为止,我的炒股收益率如何? first_money = 100000 money = first_money hold = 0#持有多少股 sr1 = pd.Series(1, index=golden_cross) sr2 = pd.Series(0, index=death_cross) #根据时间排序 sr = sr1.append(sr2).sort_index() for i in range(0, len(sr)): p = df['open'][sr.index[i]] if sr.iloc[i] == 1: #金叉 buy = (money // (100 * p)) hold += buy*100 money -= buy*100*p else: money += hold * p hold = 0 p = df['open'][-1] now_money = hold * p + money print(now_money - first_money)