一.tushare简介
Tushare是一个免费、开源的财经数据接口软件包,用python实现。 它实现对股票等金融数据从数据采集、清洗加工、到数据存储的管理。
Tushare Pro是一个全数据品类的金融大数据平台,为各类金融投资和研究人员提供适用的数据和工具。 最新版Tushare Pro版需要用户注册以后才能使用。
二.安装tushare
#直接在终端输入即可
pip install tushare
#或者输入以下即可
pip install tushare==1.2.48 -i https://pypi.douban.com/simple
#检查是否导入成功
import tushare
三.注册tushare
读者需要在Tushare Pro(https://tushare.pro/)网站上注册新用户,然后登录网站。接着点击用户头像,选择“个人主页”,再选择“接口TOKEN”,然后把用户Token复制下来,才能在python代码里正确登录。
四.利用tushare下载价格数据
笔者这里使用平安银行的股票作为案例,其他股票读者可自己选择,本文案例使用python3.6和pycharm,datagrip运行。
分为三步:
1,导入库 2,设置token,连接tushare 3,调用query
import tushare as ts
token = 'your token' # 此处输入读者刚自己获取的token
ts.set_token(token)
pro = ts.pro_api()
df = pro.query('daily', ts_code='000001.SZ', start_date='20130101', end_date='20230713')
print(df)
如果要打印和存盘读者可添加以下代码即可(注意要提前准备一个csv文件,以备存储使用)
df.to_csv('./000001.SZ.csv')
输出结果如下
五.转化文本格式
tushare下载的价格数据,每个字段的名称,以及排列顺序可能不符合PyAlgoTrade的格式要求,所以需要对文件进行改写(当然根据读者的需求来看是否要进行改写)。
可定义一个函数实现对文件的转化
def read_write_csv(from_file, to_file):
feed = csvfeed.Feed("trade_date", "%Y%m%d")
feed.addValuesFromCSV(from_file)
df = pd.DataFrame(columns=['Date Time', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close'])
file = open(to_file, "w")
file.write("Date Time,Open,High,Low,Close,Volume,Adj Close")
file.write("\n")
for dateTime, value in feed:
str_datetime = dateTime.strftime("%Y-%m-%d")
file.write("%s,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f" % (str_datetime, value['open'], value['high'], value['low'], value['close'], value['vol'], value['close']))
file.write("\n")
file.close()
转化后:
六.最终代码
import tushare as ts
import pandas as pd
from pyalgotrade.feed import csvfeed
def read_write_csv(from_file, to_file):
feed = csvfeed.Feed("trade_date", "%Y%m%d")
feed.addValuesFromCSV(from_file)
df = pd.DataFrame(columns=['Date Time', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close'])
file = open(to_file, "w")
file.write("Date Time,Open,High,Low,Close,Volume,Adj Close")
file.write("\n")
for dateTime, value in feed:
str_datetime = dateTime.strftime("%Y-%m-%d")
file.write("%s,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f" % (str_datetime, value['open'], value['high'], value['low'], value['close'], value['vol'], value['close']))
file.write("\n")
file.close()
if __name__ == '__main__':
token = 'your token'
ts.set_token(token)
pro = ts.pro_api()
df_closeData = pd.DataFrame()
# 获取往日的数据
df = pro.query('daily', ts_code='000001.SZ', start_date='19800203', end_date='20230706')
df_closeData = df_closeData.append(df, ignore_index=True)
# 转入到csv文件
df_closeData.to_csv('000001.SZ.csv')
# 格式转化
read_write_csv("000001.SZ.csv", "000001.SZ.new.csv")
七.导入数据库
这里笔者使用的是mysql的数据库和datagrip的可视化应用,datagrip能够直接导入文件,由于我们上面刚刚得到了一个csv文件,所以我们直接使用mysql的导入功能即可。
效果如下:
八.实现数据当日的更新以及导入数据库
首先读者需要在pycharm上安装pymysql这个库,以便实现连接数据库。
在sql上create stock_data这张表:
连接数据库代码如下:
# 连接自己的数据库
mysql_con = pymysql.connect(host='localhost', user='your user', password='your password', database='stock_data', charset='utf8')
print("数据库连接成功")
# 使用游标
cursor = mysql_con.cursor()
我们可以导入time库实现获取当日时间等操作:
import time
这里我们主要使用strftime这个函数:
%Y # 四位数的年份表示(000-9999)
%m # 月份(01-12)
%d # 月内中的一天(0-31)
由于笔者对于线程和进程的学习不够深入,暂时无法做到每日定时更新,所以在这里我们可以获取每日的股票数据,然后在通过pymysql插入到mysql数据库当中。
def insert_data(s):
j = pro.query('daily', ts_code='000001.SZ', start_date=s, end_date=s)
return j
上图是只获取当日数据的函数
下两图是获取csv文件第二行的内容,并且实现使用列表类型操作进行存储:
# 获取每日数据
token = 'your token'
ts.set_token(token)
pro = ts.pro_api()
# 获取当前时间
d = time.strftime('%Y%m%d')
df = insert_data(d)
df_closeData = pd.DataFrame()
df_closeData = df_closeData.append(df, ignore_index=True)
df_closeData.to_csv('temp.csv')
read_write_csv("temp.csv", "new_temp.csv")
# 得到new_temp.csv的第二行文件
with open('new_temp.csv', 'r') as csvfile:
reader = csv.reader(csvfile)
for i, rows in enumerate(reader):
if i == 1: # 这里为第二行的意思
r = rows # 类型为list
当我们获取到了文件的内容,我们即可实现对数据库的导入:
# 将数据导入进自己的数据库
try:
sql = "insert into stock_data values(%s, %s, %s, %s, %s, %s, %s)"
val = (r[0], r[1], r[2], r[3], r[4], r[5], r[6])
# (Date Time, Open, High, Low, Close, Volume, Adj Close)
# 运行sql语句
cursor.execute(sql, val)
# 修改
mysql_con.commit()
print("插入数据成功")
except Exception as e:
print(e)
mysql_con.rollback()
print("插入数据失败")
finally:
# 关闭游标
cursor.close()
# 关闭连接
mysql_con.close()
最终代码如下:
import pymysql
import tushare as ts
import pandas as pd
from pyalgotrade.feed import csvfeed
import csv
import time
def read_write_csv(from_file, to_file):
feed = csvfeed.Feed("trade_date", "%Y%m%d")
feed.addValuesFromCSV(from_file)
d_f = pd.DataFrame(columns=['Date Time', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close'])
file = open(to_file, "w")
file.write("Date Time,Open,High,Low,Close,Volume,Adj Close")
file.write("\n")
for dateTime, value in feed:
str_datetime = dateTime.strftime("%Y-%m-%d")
file.write("%s,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f" % (str_datetime, value['open'], value['high'], value['low'], value['close'], value['vol'], value['close']))
file.write("\n")
file.close()
def insert_data(s):
j = pro.query('daily', ts_code='000001.SZ', start_date=s, end_date=s)
return j
if __name__ == '__main__':
# 获取每日数据
token = 'your token'
ts.set_token(token)
pro = ts.pro_api()
# 获取当前时间
d = time.strftime('%Y%m%d')
df = insert_data(d)
df_closeData = pd.DataFrame()
df_closeData = df_closeData.append(df, ignore_index=True)
df_closeData.to_csv('temp.csv')
read_write_csv("temp.csv", "new_temp.csv")
# 得到new_temp.csv的第二行文件
with open('new_temp.csv', 'r') as csvfile:
reader = csv.reader(csvfile)
for i, rows in enumerate(reader):
if i == 1:
r = rows # 类型为list
# 连接自己的数据库
mysql_con = pymysql.connect(host='localhost', user='your user', password='your password', database='stock_data', charset='utf8')
print("数据库连接成功")
cursor = mysql_con.cursor()
# 将数据导入进自己的数据库
try:
sql = "insert into stock_data values(%s, %s, %s, %s, %s, %s, %s)"
val = (r[0], r[1], r[2], r[3], r[4], r[5], r[6])
# (Date Time, Open, High, Low, Close, Volume, Adj Close)
# 运行sql语句
cursor.execute(sql, val)
# 修改
mysql_con.commit()
print("插入数据成功")
except Exception as e:
print(e)
mysql_con.rollback()
print("插入数据失败")
finally:
# 关闭游标
cursor.close()
# 关闭连接
mysql_con.close()
运行成功效果图: