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

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

运行成功效果图:

 

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 量化因子IC值的计算是通过统计学分析来衡量因子与股票收益率的相关性。在Python中可以使用tushare获取股票数据,然后通过Pandas库进行数据处理和计算。 以下是一个示例代码,计算股票收益率和一个量化因子的IC值: ```python import tushare as ts import pandas as pd # 获取股票数据 df_stock = ts.get_k_data('600519', start='2020-01-01', end='2021-01-01') # 计算股票收益率 df_stock['return'] = df_stock['close'].pct_change() # 获取量化因子数据 df_factor = ts.get_hist_data('600519', start='2020-01-01', end='2021-01-01') # 计算因子值 df_factor['factor'] = (df_factor['high'] + df_factor['low']) / 2 # 合并数据 df = pd.merge(df_stock[['date', 'return']], df_factor[['date', 'factor']], on='date') # 计算IC值 ic = df['factor'].corr(df['return'], method='pearson') print('IC值为:', ic) ``` 在这个示例代码中,我们使用了tushare获取了茅台(股票代码为600519)的股票数据和一个量化因子数据,然后计算了股票收益率和因子值,并将它们合并在一起。最后,我们使用Pandas库中的corr()函数计算了因子值和收益率之间的相关性,得到了IC值。 ### 回答2: 股票量化因子IC值是衡量某一因子与股票收益率之间相关性的指标,可以用来评估因子的有效性和预测能力。在Python中,可以使用tushare库来获取股票数据,并通过编写代码来计算量化因子IC值。 首先,需要导入tushare库和其他需要使用的库: ```python import tushare as ts import pandas as pd import numpy as np ``` 接下来,使用tushare库的功能获取股票数据,例如获取某一只股票的历史行情数据: ```python # 设置tushare账号 ts.set_token('your_token') pro = ts.pro_api() # 获取股票行情数据 data = pro.daily(ts_code='000001.SZ', start_date='20190101', end_date='20201231') ``` 然后,通过编写代码来计算量化因子IC值。首先,需要根据因子的计算公式自定义相应的函数。例如,如果要计算某一因子的IC值,可以编写如下的函数: ```python def calculate_factor(data): # 通过股票数据计算因子值 # ... return factor_value def calculate_ic(data, factor_value): # 通过因子值和股票收益率计算IC值 # ... return ic_value ``` 在`calculate_factor`函数中,需要根据因子的计算公式来计算因子值。在`calculate_ic`函数中,根据因子值和股票收益率计算IC值。 最后,调用函数并打印结果: ```python factor_value = calculate_factor(data) ic_value = calculate_ic(data, factor_value) print("IC值为:", ic_value) ``` 这样,就可以通过Python代码使用tushare获取股票数据,并计算量化因子IC值了。在实际应用中,可以根据具体需要进行进一步的数据处理和分析。 ### 回答3: 股票量化因子IC值计算是量化投资中的重要指标,可以衡量因子与股票收益率之间的相关性。下面是通过Python代码实现通过tushare数据库获取数据并计算股票量化因子IC值的一个示例: 首先,需要安装tushare库并导入相关模块: ```python import tushare as ts import pandas as pd ``` 然后,使用tushare库中的get_hist_data函数获取股票历史数据,以计算因子: ```python # 获取股票历史数据 data = ts.get_hist_data('600519', start='2020-01-01', end='2021-01-01') ``` 接下来,根据你所选择的量化因子,计算因子的值,例如计算股票的5日均线: ```python # 计算5日均线 data['5日均线'] = data['close'].rolling(window=5).mean() ``` 然后,计算因子与股票收益率之间的相关性,以获取IC值: ```python # 计算因子与股票收益率之间的相关系数 IC = data['5日均线'].corr(data['pct_change']) ``` 最后,输出结果: ```python print("股票量化因子IC值为:", IC) ``` 以上就是使用Python代码实现通过tushare数据库获取数据并计算股票量化因子IC值的一个示例。需要注意的是,这只是一个简单的示例,具体的计算方法和量化因子的选择需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值