吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11014|回复: 22
收起左侧

[Python 转载] Python3利用Tushare接口结合mysql进行股票量化分析入门

  [复制链接]
sirius0427 发表于 2019-12-14 17:00
本帖最后由 sirius0427 于 2019-12-14 17:02 编辑

Tushare给一些对量化分析有兴趣的朋友提供了非常方便的接口,使大家可以进入量化分析的门槛,但在实际应用过程中,发现很多朋友在用文件作为存储股票信息的介质。
这里介绍一种通过mysql数据库存放信息的方式,使用了python语言作为Tushare的接口语言,入库后各位可自行使用喜欢的语言进行分析。

第一步,注册tushare.pro账号,注册链接https://tushare.pro/register

第二步,找到自己账号的接口TOKEN,保存下来,后面代码内要用。账号积分的高低会对接口有不同的限制,详细可以观看积分说明。

第三步:在mysql中创新tushare数据库,我这里用的是navicat,图形化管理比较方便。
image.png image.png
建库语句如下:
[SQL] 纯文本查看 复制代码
CREATE DATABASE `tushare` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';


第四步:建立相应的表,首先建立trade_cal表,用于记录交易日信息;建立stock_list表,用于存放股票信息;建立stock_daily表,用于存放股票日交易数据。
[SQL] 纯文本查看 复制代码
/*
 Navicat Premium Data Transfer

 Source Server         : Quantization
 Source Server Type    : MySQL
 Source Server Version : 80018
 Source Host           : 127.0.0.1:3306
 Source Schema         : tushare

 Target Server Type    : MySQL
 Target Server Version : 80018
 File Encoding         : 65001

 Date: 14/12/2019 16:31:24
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for trade_cal
-- ----------------------------
DROP TABLE IF EXISTS `trade_cal`;
CREATE TABLE `trade_cal`  (
  `cal_date` date NOT NULL COMMENT '日历日期',
  `is_open` int(1) NULL DEFAULT NULL COMMENT '是否交易 0休市 1交易',
  `pretrade_date` date NULL DEFAULT NULL COMMENT '上一个交易日',
  PRIMARY KEY (`cal_date`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;


[SQL] 纯文本查看 复制代码
/*
 Navicat Premium Data Transfer

 Source Server         : Quantization
 Source Server Type    : MySQL
 Source Server Version : 80018
 Source Host           : 127.0.0.1:3306
 Source Schema         : tushare

 Target Server Type    : MySQL
 Target Server Version : 80018
 File Encoding         : 65001

 Date: 14/12/2019 16:34:11
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for stock_list
-- ----------------------------
DROP TABLE IF EXISTS `stock_list`;
CREATE TABLE `stock_list`  (
  `ts_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'TS代码',
  `symbol` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '股票代码',
  `name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '股票名称',
  `area` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所在地域',
  `industry` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属行业',
  `fullname` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '股票全称',
  `enname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '英文全称',
  `market` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '市场类型 (主板/中小板/创业板)',
  `exchange` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '交易所代码',
  `curr_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '交易货币',
  `list_status` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '        上市状态: L上市 D退市 P暂停上市',
  `list_date` date NULL DEFAULT NULL COMMENT '上市日期',
  `delist_date` date NULL DEFAULT NULL COMMENT '退市日期',
  `is_hs` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否沪深港通标的,N否 H沪股通 S深股通',
  PRIMARY KEY (`ts_code`, `symbol`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;


[SQL] 纯文本查看 复制代码
/*
 Navicat Premium Data Transfer

 Source Server         : Quantization
 Source Server Type    : MySQL
 Source Server Version : 80018
 Source Host           : 127.0.0.1:3306
 Source Schema         : tushare

 Target Server Type    : MySQL
 Target Server Version : 80018
 File Encoding         : 65001

 Date: 14/12/2019 16:34:55
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for stock_daily
-- ----------------------------
DROP TABLE IF EXISTS `stock_daily`;
CREATE TABLE `stock_daily`  (
  `ts_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '股票代码',
  `trade_date` date NOT NULL COMMENT '交易日期',
  `open` double NULL DEFAULT NULL COMMENT '开盘价',
  `high` double NULL DEFAULT NULL COMMENT '最高价',
  `low` double NULL DEFAULT NULL COMMENT '最低价',
  `close` double NULL DEFAULT NULL COMMENT '收盘价',
  `pre_close` double NULL DEFAULT NULL COMMENT '昨日收盘价',
  `change` double NULL DEFAULT NULL COMMENT '涨跌额',
  `pct_chg` double NULL DEFAULT NULL COMMENT '涨跌幅',
  `vol` double NULL DEFAULT NULL COMMENT '成交量 (手)',
  `amount` double NULL DEFAULT NULL COMMENT '成交额 (千元)',
  `turnover_rate` double NULL DEFAULT NULL COMMENT '换手率',
  `volume_ratio` double NULL DEFAULT NULL COMMENT '量比',
  UNIQUE INDEX `ts_code_date`(`ts_code`, `trade_date`) USING BTREE COMMENT '以股票代码和日期作为主键',
  INDEX `ts_code`(`ts_code`) USING BTREE,
  INDEX `trade_date`(`trade_date`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;


第五步,安装python3,因为不同平台的安装方法不一致,所以不在赘述,可自行查询相关平台的安装方法。
通过pip安装PyMysql、tushare、numpy、pandas,方法很简单,pip install +所需要安装的包名即可。

第六步,写Python代码,取交易日期存入trade_cal表中
[Python] 纯文本查看 复制代码
# coding:utf-8

import tushare as ts
import pymysql
import numpy as np

ts.set_token('你的接口TOKEN')

pro = ts.pro_api()
#调用trade_cal接口,设置起始日期和终止日期
data = pro.query('trade_cal', start_date='20190101', end_date='20201231', fields='cal_date,is_open,pretrade_date')
print(data)

dataset = np.array(data)
datalist = dataset.tolist()

# 打开数据库连接
db = pymysql.connect(host='localhost', port=3306, user='mysql用户名', passwd='mysql密码', db='tushare', charset='utf8mb4')


cursor = db.cursor()
# SQL 插入语句
sql = "INSERT INTO trade_cal (cal_date,is_open,pretrade_date) VALUES (%s,%s,%s)"

try:
    # 执行sql语句
    cursor.executemany(sql, datalist)
    # 提交到数据库执行
    db.commit()
except Exception as e:
    print(e)
    # 如果发生错误则回滚
    db.rollback()
# 关闭游标
cursor.close()
# 关闭数据库连接
db.close()


第七步,取股票列表存入stock_list表中。
[Python] 纯文本查看 复制代码
# coding:utf-8

import tushare as ts
import pymysql
import numpy as np

ts.set_token('你的TOKEN')

pro = ts.pro_api()

#查询当前所有正常上市交易的股票列表
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,fullname,enname,market,exchange,curr_type,list_status,list_date,delist_date,is_hs' )
print(data)
dataset = np.array(data)
datalist = dataset.tolist()

# 打开数据库连接
db = pymysql.connect(host='localhost', port=3306, user='mysql用户名', passwd='mysql密码', db='tushare', charset='utf8mb4')

# 使用cursor()方法获取操作游标
cursor = db.cursor()
sql = "delete from stock_list"
try:
    # 执行sql语句
    cursor.execute(sql)
    # 提交到数据库执行
    db.commit()
except Exception as e:
    print(e)
    # 如果发生错误则回滚
    db.rollback()
# 关闭游标
cursor.close()

cursor = db.cursor()
# SQL 插入语句
sql = "INSERT INTO stock_list (ts_code, symbol, name, area, industry, fullname, enname, market, exchange, curr_type, list_status, list_date, delist_date, is_hs) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"

try:
    # 执行sql语句
    cursor.executemany(sql, datalist)
    # 提交到数据库执行
    db.commit()
except Exception as e:
    print(e)
    # 如果发生错误则回滚
    db.rollback()
# 关闭游标
cursor.close()
# 关闭数据库连接

#查询当前所有正常上市交易的股票列表
data1 = pro.stock_basic(exchange='', list_status='P', fields='ts_code,symbol,name,area,industry,fullname,enname,market,exchange,curr_type,list_status,list_date,delist_date,is_hs' )
print(data1)
dataset1 = np.array(data1)
datalist1 = dataset1.tolist()

cursor = db.cursor()
try:
    # 执行sql语句
    cursor.executemany(sql, datalist1)
    # 提交到数据库执行
    db.commit()
except Exception as e:
    print(e)
    # 如果发生错误则回滚
    db.rollback()
# 关闭游标
cursor.close()
# 关闭数据库连接
db.close()


第八步:取股票当日交易信息,放入stock_daily表中。
[Python] 纯文本查看 复制代码
# coding:utf-8

import tushare as ts
import pymysql
import numpy as np
import datetime
import time
import pandas as pd
import sys

ts.set_token('你的token')
pro = ts.pro_api()

db = pymysql.connect(host='localhost', port=3306, user='mysql用户名', passwd='mysql密码', db='tushare', charset='utf8mb4')
db1 = pymysql.connect(host='localhost', port=3306, user='mysql用户名', passwd='mysql密码', db='tushare', charset='utf8mb4')
cursor = db1.cursor()
sql = "select cal_date from trade_cal where cal_date ='" + str(sys.argv[1]) + "' and is_open=1 order by cal_date"
cursor.execute(sql)
print("cursor.excute:", cursor.rowcount)
for each in cursor.fetchall():
    print(datetime.datetime.strftime(each[0], "%Y%m%d"))
    data = pro.daily(trade_date=datetime.datetime.strftime(each[0], "%Y%m%d"))
    cursor = db.cursor()
    datalist = np.array(data).tolist()
    sql = "insert into stock_daily( ts_code, trade_date, `open`, high, low, `close`, pre_close, `change`, pct_chg, vol, amount) values ( %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s )"
    print(sql)
    try:
        # 执行sql语句
        cursor.executemany(sql, datalist)
        # 提交到数据库执行
        db.commit()
    except Exception as e:
        print(e)
        # 如果发生错误则回滚
        db.rollback()


最后,执行上面的三个python文件,注意取stock_daily的python是需要加日期作为参数的,这样可以灵活的取一天的数据入表,或写一个批处理,将一年的数据一次性存入表中。
结尾,这样,最基础的股票交易日期、股票列表、股票日K线,就已经存入数据库表中了,后面即可按自己的想法进行量化分析。
Tushare的接口远不止以上三种,各位可自行参阅网站上的股票接口文档,进行相应的资料获取和存放。

进坛潜水多年,第一次发帖,如有不当之处,请版主指正。

免费评分

参与人数 6吾爱币 +5 热心值 +6 收起 理由
红烧排骨 + 1 热心回复!
yanyaneboy + 1 + 1 用心讨论,共获提升!
dengwen168 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zjjyl + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
我会开坦克 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
fih + 1 + 1 谢谢@Thanks!继续发一下量化分析的,

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xuanqi521 发表于 2019-12-17 10:47
tushare积分不够怎么办?
yhlko1388 发表于 2019-12-20 09:27
我会开坦克 发表于 2019-12-14 20:11
townx 发表于 2019-12-15 02:43
感谢分享,收藏以后看一下。
cangyu 发表于 2019-12-18 16:04
牛逼,关注了
richens 发表于 2019-12-27 16:43
谢谢,正在找相应的材料。
zxcuper 发表于 2019-12-28 13:54

保存一下下次来看
cj13888 发表于 2019-12-29 11:25

学习借鉴一下,谢谢分享
cj13888 发表于 2019-12-29 11:31
值得一试,谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 06:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表