QMT 回测避坑:退市股、ST 股过滤代码直接复制
发布时间:9小时前阅读:58
在使用 QMT 进行量化策略回测时,若不排除退市股与 ST 股,回测结果可能与实际交易偏差较大。因为退市股和 ST 股风险较高,股价波动特征与正常股票不同,纳入它们会使回测结果过于乐观,导致实盘交易效果不佳。以下提供过滤退市股与 ST 股的代码,帮助你优化回测。
过滤 ST 股代码
python
运行
import pandas as pd
from qmt.api import *
def is_st_stock(stock_code, data):
try:
# 获取股票名称
stock_name = data[stock_code].name
# 判断股票名称中是否包含'ST'或'*ST'
if 'ST' in stock_name or '*ST' in stock_name:
return True
return False
except KeyError:
return False
def filter_st_stocks(context, data):
all_stocks = context.universe
filtered_stocks = []
for stock in all_stocks:
if not is_st_stock(stock, data):
filtered_stocks.append(stock)
context.universe = filtered_stocks
return filtered_stocks
代码说明
- is_st_stock 函数:该函数接收股票代码
stock_code与数据data作为参数。通过data[stock_code].name获取股票名称,判断名称中是否包含'ST'或'*ST',以此确定该股票是否为 ST 股。若包含则返回True,否则返回False。若获取股票名称时发生KeyError,也返回False,防止因数据缺失导致程序中断。 - filter_st_stocks 函数:此函数用于过滤 ST 股。它获取当前策略中的所有股票
context.universe,遍历每只股票,使用is_st_stock函数判断是否为 ST 股,若不是则添加到filtered_stocks列表中。最后更新context.universe为过滤后的股票列表,并返回该列表。
过滤退市股代码
python
运行
def is_delisted_stock(stock_code, data):
try:
# 尝试获取股票行情数据
_ = data[stock_code].close
return False
except KeyError:
return True
def filter_delisted_stocks(context, data):
all_stocks = context.universe
filtered_stocks = []
for stock in all_stocks:
if not is_delisted_stock(stock, data):
filtered_stocks.append(stock)
context.universe = filtered_stocks
return filtered_stocks
代码说明
- is_delisted_stock 函数:该函数接收股票代码
stock_code与数据data。尝试通过data[stock_code].close获取股票收盘价数据,如果能获取到,说明股票未退市,返回False;若发生KeyError,则表示股票已退市,返回True。 - filter_delisted_stocks 函数:此函数负责过滤退市股。它获取所有股票
context.universe,遍历每只股票,利用is_delisted_stock函数判断是否为退市股,若不是则添加到filtered_stocks列表。最后更新context.universe为过滤后的股票列表并返回。
整合使用
python
运行
def initialize(context):
# 设置初始股票池等其他初始化操作
context.universe = get_fundamentals(query(
fundamentals.eod_derivative_indicator.market_cap
).filter(
fundamentals.eod_derivative_indicator.market_cap > 0
).order_by(
fundamentals.eod_derivative_indicator.market_cap.desc()
).limit(100))
def handle_data(context, data):
filtered_stocks = filter_st_stocks(context, data)
filtered_stocks = filter_delisted_stocks(context, data)
# 基于过滤后的股票池进行后续策略操作,如选股、交易等
for stock in filtered_stocks:
# 这里可以编写具体的交易逻辑,例如获取数据、判断买卖条件等
pass
代码说明
在initialize函数中设置初始股票池。在handle_data函数里,先调用filter_st_stocks函数过滤 ST 股,再调用filter_delisted_stocks函数过滤退市股。经过双重过滤后,基于最终的filtered_stocks列表进行后续的策略操作,如选股、交易逻辑编写等。这样能有效避免退市股与 ST 股对回测结果的干扰,使回测更贴近实际交易情况。
股票/量化开户找我!股票佣金万0.854(满足条件)!无门槛国债逆回购一折 (百万分之一)!ETF佣金万0.5!优惠多多!免费量化使用量化软件QMT+miniQMT+ptrade!

温馨提示:投资有风险,选择需谨慎。


问一问

+微信
分享该文章
