一.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 tstoken = 'your token'# 此处输入读者刚自己获取的tokents.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 tsimport pandas as pdfrom pyalgotrade.feed import csvfeeddef 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 pymysqlimport tushare as tsimport pandas as pdfrom pyalgotrade.feed import csvfeedimport csvimport timedef 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 jif __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()

运行成功效果图: