本文介绍python语言下的两个第三方库,Tushare(获取股票和基金数据)和Ta-Lib(用于数据指标分析),及其相关使用案例。
一、安装
- Tushare安装
# 方式1:pip install tushare# 如果安装网络超时可尝试国内pip源,
# 如pip install tushare -i https://pypi.tuna.tsinghua.edu.cn/simple# 方式2:访问https://pypi.python.org/pypi/tushare/下载安装 ,
# 执行 python setup.py install# 方式3:访问https://github.com/waditu/tushare,将项目下载或者clone到本地,
# 进入到项目的目录下,执行: python setup.py install
- Ta-Lib安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Ta-Lib
talib以上安装若失败,出现报错error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools",则需要进入talib下载(见下图)并手动安装(到talib解压目录下cmd:pip install TA-Lib )与电脑和python匹配的版本。另外解释器要基于自己设置的python-base目录
二、Tushare获取数据
Tushare的使用需要提前注册并获得Token,通过Token进行数据的获取,(部分数据接口需要一定的积分)。
以下仅对沪深股票和基金数据获取方式进行介绍。
- 沪深股票
1. 股票列表获取,获取基础信息数据,包括股票代码、名称、上市日期、退市日期等。
pro = ts.pro_api('your token')#查询当前所有正常上市交易的股票列表data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
2. 获取股票日线行情数据。
pro = ts.pro_api('your token')df = pro.daily(ts_code='000001.SZ', start_date='20180701', end_date='20180718')#多个股票
df = pro.daily(ts_code='000001.SZ,600000.SH', start_date='20180701', end_date='20180718')
除此之外还可以获取诸如财务数据、市场参考数据等,可参见Tushare数据接口。
- 公募基金
1. 获取公募基金数据列表,包括场内和场外基金。
pro = ts.pro_api('your token')df = pro.fund_basic(market='E')
2. 获取公募基金净值数据。
pro = ts.pro_api('your token')df = pro.fund_nav(ts_code='165509.SZ')
3. 获取场内基金日线行情,类似股票日行情。
pro = ts.pro_api('your token')df = pro.fund_daily(ts_code='150018.SZ', start_date='20180101', end_date='20181029')
三、Tushare数据存储至mysql
如果数据需要长期使用,尤其是历史数据,可以将提取到的数据存入本地数据库,例如MySQL。如下为python语言下tushare+pandas+sqlalchemy存储基金净值数据至mysql的代码。
import pandas as pd
import tushare as ts
from sqlalchemy import create_engine
import time
from datetime import datetime# 基金净值
# 参数
fd_code = '161028.SZ'
start = '2019-01-01'
# end = ''
end = str(time.strftime('%Y-%m-%d',time.localtime(time.time())))fd_filename = fd_code.replace('.', '').lower()
start_f = start.replace('-', '')
end_f = end.replace('-', '')
start_dt = datetime.strptime(start, '%Y-%m-%d')
end_dt = datetime.strptime(end, '%Y-%m-%d')try:engine = create_engine('mysql+pymysql://username:password@host:port/database')# 注意替换上行代码中的数据库连接相关信息try:table_com = 'select * from %s' % fd_filenameif (pd.read_sql_query(table_com, engine, index_col = 'ann_date',parse_dates = ['ann_date']).sort_values(by = "ann_date" , ascending=True).index[0]<=start_dt) & (pd.read_sql_query(table_com, engine, index_col = 'ann_date',parse_dates = ['ann_date']).sort_values(by = "ann_date" , ascending=True).index[-1]>=end_dt):df = pd.read_sql_query(table_com, engine, index_col = 'ann_date',parse_dates = ['ann_date']).sort_values(by = "ann_date" , ascending=True)[start:end]print('数据库读取成功!')else:print('数据库不包含给定时间!')aaaexcept:pro = ts.pro_api('your token')df = pro.fund_nav(ts_code = fd_code)engine = create_engine('mysql+pymysql://username:password@host:port/database')df.to_sql(name = fd_filename, con=engine, index=True, if_exists='replace', index_label='id')print('数据库写入成功!')df = pd.read_sql_query(table_com, engine, index_col = 'ann_date',parse_dates = ['ann_date']).sort_values(by = "ann_date" , ascending=True)[start:end]
except Exception as e:print(e)print(len(df))