大家好,今天学习一下用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
打开每一行的链接直接链接到雪球网。
注:例子里的股票代码只供数据筛选学习使用,不构成任何投资建议!
原创内容未经允许严禁转载!
完结!