蛇哥学Python

V1

2022/11/04阅读:16主题:萌绿

用Python筛选底部股票代码

大家好,我是蛇哥

今天学习一下用Python筛选底部股票代码

1、获取全量股票数据

1.1、先创建用于保存股票数据的mysql数据库表

创建表语句如下:

create table stock
(
    id       bigint auto_increment comment '自增主键'
        primary key,
    bs_code  varchar(16)  null comment 'bs股票代码',
    code     varchar(16)  null comment '股票代码',
    name     varchar(32)  null comment '股票名称',
    link     varchar(128null comment '链接',
    ipo_date varchar(32)  null comment '上市日期'
)
    comment '股票基础信息表' charset = utf8mb4;

1.2、写Python代码调用股票列表接口获取股票列表并保存到mysql数据库表中


import baostock as bs
import pymysql as pymysql

# 登录baostock
lg = bs.login()
rs = bs.query_stock_basic()
# 股票列表
stock_data_list = []
while rs.next():
    row_list = rs.get_row_data()
    if row_list[4] == '1' and row_list[5] == '1' and (
            row_list[0].split('.')[1].startswith('0'or row_list[0].split('.')[1].startswith('6')):
        row_list.pop(3)
        row_list.pop(3)
        row_list.pop(3)
        row_list.insert(1, row_list[0].split('.')[1])
        bs_code = row_list[0].split('.')
        link = '<a href="https://xueqiu.com/S/' + bs_code[0].upper() + bs_code[1] + '" target="_blank">' + row_list[
            2] + '</a>'
        row_list.insert(3, link)
        stock_data_list.append(row_list)

db = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='tushare', charset='utf8mb4')
cursor = db.cursor()
# 清空股票基础表数据
delete_stock_sql = 'delete from stock'
try:
    # 执行sql语句
    cursor.execute(delete_stock_sql)
    # 提交到数据库执行
    db.commit()
except Exception as e:
    print(e)
    # 如果发生错误则回滚
    db.rollback()

# SQL 插入语句
insert_stock_sql = 'INSERT INTO stock (bs_code, code, name, link, ipo_date) VALUES (%s,%s,%s,%s,%s)'
try:
    # 执行sql语句
    cursor.executemany(insert_stock_sql, stock_data_list)
    # 提交到数据库执行
    db.commit()
except Exception as e:
    print(e)
    # 如果发生错误则回滚
    db.rollback()

# 关闭游标
cursor.close()
# 关闭数据库连接
# 登出baostock
bs.logout()

运行结果如下:

股票列表存入数据库
股票列表存入数据库

2、获取每天历史交易数据

2.1、创建用于保存历史交易数据的MYSQL数据表


create table day
(
    id         bigint auto_increment comment '自增主键'
        primary key,
    code       varchar(16null comment '股票代码',
    trade_date varchar(32null comment '交易日期',
    open       float       null comment '开盘价',
    high       float       null comment '最高价',
    low        float       null comment '最低价',
    close      float       null comment '收盘价',
    pre_close  float       null comment '昨收价',
    amt_chg    float       null comment '涨跌额',
    pct_chg    float       null comment '涨跌幅',
    vol        float       null comment '成交量',
    amount     float       null comment '成交额'
)
    comment '日线行情表' charset = utf8mb4;

create index code
    on day (code);

create index pct_chg
    on day (pct_chg);

create index trade_date
    on day (trade_date);

2.2、调用tushare接口获取全量股票数据

调用tushare接口需要接口TOKEN,所以得有tushare账号。 没有tushare账号的先注册:https://tushare.pro/register?reg=500594 注册完在个人主页->接口TOKEN拿到接口TOKEN(该接口TOKEN会在后面的接口调用代码中使用到)

注册tushare并获取TOKEN
注册tushare并获取TOKEN

2.3、写Python代码调用tushare的daily接口获取日数据并保存到mysql表中


import pymysql as pymysql
import numpy as np
import tushare as ts
import baostock as bs
import time
import datetime

begin_trade_date = '20220727'

bs.login()
time_start = time.time()
token = '这里换成自己的TOKEN(上面有截图如何获取接口TOKEN)'
ts.set_token(token)
pro = ts.pro_api()
# 打开数据库连接
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='tushare', charset='utf8mb4')
cursor = db.cursor()


def day(trade_date):
    day_data = pro.daily(trade_date=trade_date,
                         fields='ts_code,trade_date,open,high,low,close,pre_close,change,pct_chg,vol,amount')
    day_data_list = np.array(day_data).tolist()
    insert_day_data_list = []
    for index, val in enumerate(day_data_list):
        if not val[0].startswith('0'and not val[0].startswith('6'):
            continue
        val[0] = val[0].split('.')[0]
        insert_day_data_list.append(val)

    delete_day_sql = 'delete from day where trade_date=' + trade_date
    try:
        # 先删除此交易日数据
        cursor.execute(delete_day_sql)
        db.commit()
        print(trade_date + ' 数据已删除')
    except Exception as e:
        print(e)
        db.rollback()

    insert_day_sql = 'INSERT INTO day (code, trade_date, open, high, low, close, pre_close, amt_chg, pct_chg, vol, amount) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    try:
        # 插入此交易日数据
        cursor.executemany(insert_day_sql, insert_day_data_list)
        db.commit()
        print(trade_date + ' 数据已插入')
    except Exception as e:
        print(e)
        db.rollback()


compare_date = datetime.datetime.strptime(begin_trade_date, "%Y%m%d")
now_time = time.strftime('%Y%m%d', time.localtime())
now_date = datetime.datetime.strptime(now_time, "%Y%m%d")
while compare_date <= now_date:
    # 调一次方法
    trade_date = compare_date.strftime("%Y%m%d")
    day(trade_date)
    compare_date = compare_date + datetime.timedelta(days=1)

# 关闭游标
cursor.close()
bs.logout()
# 关闭数据库连接
time_end = time.time()
time_sum = round((time_end - time_start) / 602)
print('执行结束 共耗时' + str(time_sum) + '分钟')

查看获取效果:

股票日数据保存到数据库
股票日数据保存到数据库

3、筛选底部股票数据

3.1、创建一个用于保存筛选数据的MYSQL数据库表


create table pick
(
    link varchar(128null comment '链接'
)
    comment '选股表' charset = utf8mb4;

3.2、查询近7天有6天收阴的股票数据,代码如下


from datetime import datetime as dtime
import datetime
import pymysql as pymysql
import baostock as bs
import numpy as np
import math
import time

# 最小市值
cir_min = 50
# 最大市值
cir_max = 3000
# 时间跨度
duration = 7
# 收阴个数
board = 6
now_time = '20221024'
sevenDayAgo = (datetime.datetime.strptime(now_time, "%Y%m%d") - datetime.timedelta(days=duration)).strftime("%Y%m%d")

# now_time = time.strftime('%Y%m%d', time.localtime())
# sevenDayAgo = (datetime.datetime.now() - datetime.timedelta(days=duration)).strftime("%Y%m%d")


bs.login()
time_start = time.time()
# 打开数据库连接
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='tushare', charset='utf8mb4')
cursor = db.cursor()

query_top_sql = " \
select b.bs_code,b.link,a.vol,a.close \
from day a inner join stock b on a.code=b.code \
where \
a.trade_date = %s"
 % now_time + " \
and a.code in ( \
select \
code \
from day \
WHERE \
1=1 \
and pct_chg < 0 \
and trade_date >= %s"
 % sevenDayAgo + " \
and trade_date <= %s"
 % now_time + " \
group by code \
HAVING count(trade_date)>=%s"
 % board + ")"
cursor.execute(query_top_sql)
top_list_all = cursor.fetchall()
top_list = np.array(top_list_all).tolist()
# 筛选这些票里流通值介于30亿到150亿的票
pic_top_list = []
start_date = dtime.strptime(now_time, '%Y%m%d').strftime('%Y-%m-%d')
end_date = dtime.strptime(now_time, '%Y%m%d').strftime('%Y-%m-%d')
for index, val in enumerate(top_list):
    bs_code = val[0]
    link = val[1]
    vol = val[2]
    close = val[3]
    turn_rs = bs.query_history_k_data_plus(bs_code, 'turn',
                                           start_date=start_date, end_date=end_date, frequency="d")

    while turn_rs.next():
        turn_row_list = turn_rs.get_row_data()
        turn_rate = turn_row_list[0]
        if turn_rate:
            cir = math.ceil(float(vol) / float(turn_rate) * float(close) / 10000)
            if cir_min < cir < cir_max:
                print(link)
                pic_top_list.append([link])
# 将这些筛选出来的票入表
delete_pick_table = 'delete from pick'
try:
    cursor.execute(delete_pick_table)
    db.commit()
except Exception as e:
    print(e)
    db.rollback()
insert_pick_sql = 'INSERT INTO pick (link) VALUES (%s)'
try:
    cursor.executemany(insert_pick_sql, pic_top_list)
    db.commit()
except Exception as e:
    print(e)
    db.rollback()

# 关闭游标
cursor.close()
bs.logout()
# 关闭数据库连接
time_end = time.time()
time_sum = round((time_end - time_start) / 602)
print('执行结束 共耗时' + str(time_sum) + '分钟')

执行效果如下:

执行记录
执行记录

存入pick表的数据如下

存入pick表的数据
存入pick表的数据

打开每一行的链接直接链接到雪球网。 注:例子里的股票代码只供数据筛选学习使用,不构成任何投资建议! 完!

分类:

后端

标签:

Python

作者介绍

蛇哥学Python
V1