2024年注定是一个要给我们留下深刻印象、值得永久回忆的一年。ST的股票特别多,很多股友都生活在退市的恐惧、忧愁和焦虑之中,选股,也变得更加小心翼翼起来。
今天我们要说的是,在学习QMT股票量化系统中,选股时如何用python代码来剔除掉ST类股票,然后再练习一个选出上升趋势股票的实例。
学习是循序渐进的,我们今天还会用到上周所学的一些知识,我们先来复习一下:

一、复习巩固
在这篇文章中,我们先是获取了深沪股市中所有的股票代码,然后根据代码去获取它的财务数据。还记得获取股票代码的方法吗?
stock_list = C.get_stock_list_in_sector(C.stock_sector)
对了,我们是用get_stock_list_in_sector()函数来获取股票代码的,今天我们还会用到它。
当我们获取到股票代码后,就可以根据代码获取它的股票名称,再看看股票名称里有没有“ST”这两个字符,这样可以找出或是排除ST类股票了。根据代码来获取股票名称,我们也在上周学过了:
stock_info_dic = C.get_instrumentdetail(stock)
stock_info = stock_info_dic['InstrumentName']
二、选出所有的ST股票
对,我们先把所有的ST股票选出来,这样我们才知道我们的方法用对了吗。
#encoding:gbk
'''
选出所有的ST股票
'''
import pandas as pd
import numpy as np
def init(C):
C.stock_sector = '沪深A股'
def handlebar(C):
if not C.is_last_bar():
return
df = pd.DataFrame(columns = ['股票代码','股票名称'])
stock_list = C.get_stock_list_in_sector(C.stock_sector) # 获取股票代码
for stock in stock_list: # 获取股票名称
stock_info_dic = C.get_instrumentdetail(stock)
stock_info = stock_info_dic['InstrumentName']
if 'ST' in stock_info: # 判断是否为ST
df.loc[len(df)]=[stock,stock_info]
print(df)
其实很简单,就是看看“ST”是否在股票名字里面,程序运行结果如图:


如果我们要避开ST类股票,只需要将if ‘ST’ in stock_info 更改为 if ‘ST’ not in stock_info 即可,就是加了个not。
三、实例练习:挑选出上升趋势的非ST股票
做股票就要做上升趋势的股票,上升趋势的股票一般收盘价会高于5日均线,5日均线排在10均线的上方,10日均线排在30日均线的上方。至于均线的算法,我们在《学习QMT股票量化系统,再谈单均线策略》、《学习QMT股票量化系统,入门级双均线策略》等文章中学过了,我们又一次要应用这些方法了。
#encoding:gbk
'''
排除ST股票,并筛选出上升趋势的股票
'''
import pandas as pd
import numpy as np
def init(C):
C.stock_sector = '沪深A股'
def handlebar(C):
bar_date = timetag_to_datetime(C.get_bar_timetag(C.barpos), '%Y%m%d%H%M%S')
if not C.is_last_bar():
return
# 创建一个空的DataFrame来存储股票代码和名称
df = pd.DataFrame(columns=['股票代码', '股票名称','收盘价', '5日均线', '10日均线', '30日均线'])
# 获取股票列表
stock_list = C.get_stock_list_in_sector(C.stock_sector)
# 遍历股票列表
for stock in stock_list:
# 获取股票的详细信息和5日、10日、30日均线数据
stock_data = C.get_instrumentdetail(stock)
stock_info = stock_data['InstrumentName']
stock_code = stock
if 'ST' not in stock_info: #如果不是ST的股票就去获取它的收盘价
price_data = C.get_market_data_ex(
['close'],
[stock],
end_time=bar_date,
period=C.period,
dividend_type='none',
subscribe = True
)
if len(price_data[stock]['close']) < 30: # 剔除行情数据小于30天的股票
print(stock,stock_info,"行情不足,跳过。")
continue # 跳过当前股票,继续循环
stock_close = round(price_data[stock]['close'][-1],2)
ma5 = round(price_data[stock]['close'].rolling(window=5).mean(),2)
ma10 = round(price_data[stock]['close'].rolling(window=10).mean(),2)
ma30 = round(price_data[stock]['close'].rolling(window=30).mean(),2)
# 上升趋势的定义是收盘价高于5日、10日、30日均线,且均线依次上升
if stock_close > ma5[-1] and ma5[-1]>ma10[-1] and ma10[-1]>ma30[-1]:
df.loc[len(df)] = [stock, stock_info, stock_close,ma5[-1],ma10[-1],ma30[-1]]
print("找到股票了!")
print(stock, stock_info, stock_close,ma5[-1],ma10[-1],ma30[-1])
# 打印符合条件的股票
print("上升趋势且非ST的股票列表:")
print(df)
运行程序,结果如下:



四、总结
要排除ST类股票,我们先获取股票代码,再根据代码获取股票名称,再判断名称里是否有”ST”字符。排除ST股票后,我们再加上自己需要的其他条件来选择股票。

五、巩固练习
现在股票面值低于1元也会退市,为了安全考虑,我们选股时还得避开1元左右的低价股啊。根据今天的上升趋势实例,我们再加一个条件:选出股价大于5元,走势是上升趋势的非ST股票。
动手敲敲键盘吧。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/73457
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!