用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(128) null 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()

运行结果如下:


股票列表存入数据库.png

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

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

create table day
(
    id         bigint auto_increment comment '自增主键'
        primary key,
    code       varchar(16) null comment '股票代码',
    trade_date varchar(32) null 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.png

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) / 60, 2)
print('执行结束 共耗时' + str(time_sum) + '分钟')

查看获取效果:


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

3、筛选底部股票数据

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

create table pick
(
    link varchar(128) null 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) / 60, 2)
print('执行结束 共耗时' + str(time_sum) + '分钟')

执行效果如下:


执行记录.jpg

存入pick表的数据如下


存入pick表的数据.jpg

打开每一行的链接直接链接到雪球网。

注:例子里的股票代码只供数据筛选学习使用,不构成任何投资建议!

原创内容未经允许严禁转载!

完结!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容