(八) tushare模块的应用
今日概要
- TuShare简介和环境安装
- 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:换手率[注:指数无此项]
案例应用1:
# 获取k线数据,加载至DataFrame中 df = ts.get_k_data("600519",start="2001-01-01") # 将从Tushare中获取的数据存储至本地 df.to_csv("600519.csv") # 将原数据中的时间作为行索引,并将字符串类型的时间序列化成时间对象类型 df = pd.read_csv("600519.csv", index_col='date',parse_dates=['date'])[['open','close','high','low']] df.drop(labels="Unnamed: 0", axis=1, inplace=True)
# 指定条件 condition = (df['close']-df['open'])/df['open'] >= 0.03 # 获取满足条件的行索引 df[condition].index 执行后结果为: DatetimeIndex(['2001-08-27', '2001-08-28', '2001-09-10', '2001-12-21', '2002-01-18', '2002-01-31', '2003-01-14', '2003-10-29', '2004-01-05', '2004-01-14', ... '2018-06-20', '2018-08-09', '2018-08-21', '2018-08-27', '2018-09-18', '2018-09-26', '2018-10-19', '2018-10-31', '2018-11-13', '2018-12-28'], dtype='datetime64[ns]', name='date', length=291, freq=None)
condition = (df['open'] - df['close'].shift(1))/df['close'].shift(1) <= -0.02 df[condition].index 执行结果为: DatetimeIndex(['2001-09-12', '2002-06-26', '2002-12-13', '2004-07-01', '2004-10-29', '2006-08-21', '2006-08-23', '2007-01-25', '2007-02-01', '2007-02-06', '2007-03-19', '2007-05-21', '2007-05-30', '2007-06-05', '2007-07-27', '2007-09-05', '2007-09-10', '2008-03-13', '2008-03-17', '2008-03-25', '2008-03-27', '2008-04-22', '2008-04-23', '2008-04-29', '2008-05-13', '2008-06-10', '2008-06-13', '2008-06-24', '2008-06-27', '2008-08-11', '2008-08-19', '2008-09-23', '2008-10-10', '2008-10-15', '2008-10-16', '2008-10-20', '2008-10-23', '2008-10-27', '2008-11-06', '2008-11-12', '2008-11-20', '2008-11-21', '2008-12-02', '2009-02-27', '2009-03-25', '2009-08-13', '2010-04-26', '2010-04-30', '2011-08-05', '2012-03-27', '2012-08-10', '2012-11-22', '2012-12-04', '2012-12-24', '2013-01-16', '2013-01-25', '2013-09-02', '2014-04-25', '2015-01-19', '2015-05-25', '2015-07-03', '2015-07-08', '2015-07-13', '2015-08-24', '2015-09-02', '2015-09-15', '2017-11-17', '2018-02-06', '2018-02-09', '2018-03-23', '2018-03-28', '2018-07-11', '2018-10-11', '2018-10-24', '2018-10-25', '2018-10-29', '2018-10-30'], dtype='datetime64[ns]', name='date', freq=None)
import pandas as pd import tushare as ts # 1. 使用tushare包获取某股票的历史行情数据 df = ts.get_k_data(code="600519", start="2010-01-01") df.to_csv('./贵州茅台.csv') # 2. 将date列的数据转成时间序列,然后将该列作为整个数据源的行索引 df = pd.read_csv('./贵州茅台.csv', index_col='date', parse_dates=["date"]) df.drop(labels="Unnamed: 0", axis=1, inplace=True) # 3. 过滤数据 price_last = df["open"][-1] df_monthly = df.resample('M').first() df_yearly = df.resample('Y').last()[:-1] # 去除最后一年 cost_money = 0 # 基础资金 hold = 0 # 持有的股票 for year in range(2010, 2021): # 4.算出当年购买所有股票所花费资金的总金额, 并从基础资金扣除 cost_money += df_monthly.loc[str(year)]["open"].sum() * 100 # 5.算出当年购买的所有股票数量, 并加入持久股票中 hold += len(df_monthly.loc[str(year)]) * 100 # 6.如果不是2020年,则按要求正常在每年最后一个交易日卖出股票 if year != 2020: cost_money += df_yearly.loc[str(year)]["open"][0] * hold hold = 0 # 每年持有的股票 # 7.如果是2020年,则当年持有的股票数量也应计算入持有资产中, 所以在此计算总资产 cost_money += hold * price_last print(cost_money)
案例应用2:
df = pd.read_csv("600519.csv",index_col='date', parse_dates=['date'])[['open','close','low','high']]
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:移动平均周期(天数)
plt.plot(df[['close','ma5','ma30']].iloc[:100])
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 股票分析技术中的金叉和死叉,可以简单解释为: 分析指标中的两根线,一根为短时间内的指标线,另一根为较长时间的指标线。 如果短时间的指标线方向拐头向上,并且穿过了较长时间的指标线,这种状态叫“金叉”; 如果短时间的指标线方向拐头向下,并且穿过了较长时间的指标线,这种状态叫“死叉”; 一般情况下,出现金叉后,操作趋向买入;死叉则趋向卖出。当然,金叉和死叉只是分析指标之一,要和其他很多指标配合使用,才能增加操作的准确性。
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)
作者:TigerLee
出处:http://www.cnblogs.com/tiger666/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!