大家好,今天学习一下用Python筛选底部股票代码
获取全量股票数据
先创建用于保存股票数据的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;
写Python代码调用股票列表接口获取股票列表并保存到mysql数据库表中
运行结果如下:
股票列表存入数据库
获取每天历史交易数据
创建用于保存历史交易数据的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);
调用tushare接口获取全量股票数据
注册tushare并获取TOKEN
写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) + "分钟")
查看获取效果:
股票日数据保存到数据库
筛选底部股票数据
创建一个用于保存筛选数据的MYSQL数据库表
create table pick
(
link varchar(128) null comment "链接"
)
comment "选股表" charset = utf8mb4;
查询近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) + "分钟")
执行效果如下:
执行记录
存入pick表的数据如下
存入pick表的数据
打开每一行的链接直接链接到雪球网。
注:例子里的股票代码只供数据筛选学习使用,不构成任何投资建议!
完结!
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点