利用tushare获取股票数据并实现导入数据库和数据库插入当日数据等操作

本文介绍了如何使用TusharePython库下载股票历史数据,并进行数据转换以适应特定格式。通过注册TusharePro获取Token,使用pip安装库,然后调用API获取平安银行的股票数据。数据被保存为CSV文件,经过转化以符合PyAlgoTrade的格式,最后通过pymysql将数据导入MySQL数据库。文章还展示了如何获取并插入每日最新数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.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()

运行成功效果图:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值