QMT Python API

代码示例

常见过滤场景

排除 ST / 退市股票

提示

通过 get_instrument_detail 返回的 InstrumentName 字段判断股票名称是否包含 ST、*ST 或退字样。

qmt://docs/python
Python
1name = detail.get('InstrumentName', '')
2if 'ST' in name or '*ST' in name or '退' in name:
3 continue

排除上市不足 120 日的股票

提示

通过 get_instrument_detail 返回的 OpenDate 字段获取 IPO 日期,结合交易日历判断上市天数是否 >= 120。

qmt://docs/python
Python
1open_date = str(detail.get('OpenDate', ''))
2# 结合交易日历判断上市天数是否 >= 120

流通市值 / 总市值过滤

提示

通过 get_instrument_detail 返回的 FloatVolume(流通股本,单位:股)和 TotalVolume(总股本,单位:股),乘以 get_full_tick 返回的 lastPrice 计算市值。

qmt://docs/python
Python
1float_volume = detail.get('FloatVolume', 0) # 流通股本(股)
2total_volume = detail.get('TotalVolume', 0) # 总股本(股)
3 
4# 流通市值 = 流通股本 × lastPrice
5# 总市值 = 总股本 × lastPrice

涨跌停价格判断(盘中不买不卖)

提示

通过 get_instrument_detail 返回的 UpStopPrice(涨停价)和 DownStopPrice(跌停价),与 get_full_tick 返回的 lastPrice 比较判断。

qmt://docs/python
Python
1up_price = detail.get('UpStopPrice', 0)
2dwn_price = detail.get('DownStopPrice', 0)
3 
4if lastPrice == up_price: # 涨停 → 不买
5 return
6if lastPrice == dwn_price: # 跌停 → 不卖
7 return

停牌检测 / 复牌标记

提示

通过 get_instrument_detail 返回的 InstrumentStatus(停牌天数,第1天=0,第2天=1…正常交易也为0)和 IsTrading(合约是否可交易)判断停牌状态。

qmt://docs/python
Python
1status = detail.get('InstrumentStatus', 0)
2is_trading = detail.get('IsTrading', True)
3if not is_trading:
4 loger.info(f'{s} 当前不可交易(停牌中)')
5elif status > 0 and is_trading:
6 loger.info(f'{s} 今日复牌! 停牌天数={status}')

批量获取涨跌停价模板

批量获取沪深A股涨跌停价 - get_today_up_down

原型

qmt://docs/python
Python
1up_to_down_dict = {} # {股票代码: [涨停价, 跌停价]}
2stock_name_dict = {} # {股票代码: 股票名称}
3 
4def get_today_up_down(C):
5 up_to_down_dict.clear()
6 for s in C.get_stock_list_in_sector('沪深A股'):
7 info = C.get_instrument_detail(s)
8 if not info:
9 continue
10 up_price = info.get('UpStopPrice')
11 down_price = info.get('DownStopPrice')
12 if not up_price or not down_price:
13 continue
14 up_to_down_dict[s] = [round(up_price, 2), round(down_price, 2)]
15 stock_name_dict[s] = info.get('InstrumentName', '')
16 loger.info(f'涨跌停价初始化完成, 共{len(up_to_down_dict)}只')

释义

遍历沪深A股全部股票,通过 get_instrument_detail 获取每只股票的涨停价和跌停价,存入全局字典供盘中查询。

参数

字段名数据类型解释
Cobject策略上下文对象

返回值

无返回值,结果存入全局变量 up_to_down_dict({股票代码: [涨停价, 跌停价]})和 stock_name_dict({股票代码: 股票名称})。

示例

qmt://docs/python
Python
1def init(C):
2 get_today_up_down(C)
3 # 查询某只股票的涨跌停价
4 if '600000.SH' in up_to_down_dict:
5 up, down = up_to_down_dict['600000.SH']
6 loger.info(f'600000.SH 涨停价:{up} 跌停价:{down}')

历史 K 线计算场景

提示

以下场景基于 get_market_data_ex 返回的历史 DataFrame 实现。所有场景依赖以下公共代码获取日 K 线数据:

qmt://docs/python
Python
1stock = '600000.SH'
2daily_data = C.get_market_data_ex(
3 fields=['open', 'high', 'low', 'close', 'volume'],
4 stock_code=[stock], period='1d',
5 start_time='', end_time='', count=11,
6 dividend_type='none', fill_data=False
7)
8df = daily_data[stock]
9detail = C.get_instrument_detail(stock)

换手率计算(昨日 / 历史序列)

提示

volume 单位是FloatVolume 单位是,计算时需 ×100 换算。

qmt://docs/python
Python
1stock = '600000.SH'
2daily_data = C.get_market_data_ex(
3 fields=['open', 'high', 'low', 'close', 'volume'],
4 stock_code=[stock], period='1d',
5 start_time='', end_time='', count=11,
6 dividend_type='none', fill_data=False
7)
8 
9df = daily_data[stock]
10float_volume = detail.get('FloatVolume', 0) # 流通股本(股)
11 
12# 昨日换手率
13yesterday_volume = df['volume'].iloc[-2] # 昨日成交量(手)
14yesterday_turnover = (yesterday_volume * 100) / float_volume * 100
15 
16# 最近10日换手率序列
17turnover_series = (df['volume'] * 100) / float_volume * 100
18avg_turnover_10 = round(turnover_series[-10:].mean(), 2) # 10日平均换手率

昨天市值 / 昨天流通市值

提示

用昨日收盘价 × 股本,计算昨天的总市值和流通市值。

qmt://docs/python
Python
1df = daily_data[stock]
2yesterday_close = df['close'].iloc[-2] # 昨日收盘价
3 
4float_vol = detail.get('FloatVolume', 0) # 流通股本(股)
5total_vol = detail.get('TotalVolume', 0) # 总股本(股)
6 
7# 昨日流通市值(亿)
8yesterday_float_cap = yesterday_close * float_vol / 1e8
9# 昨日总市值(亿)
10yesterday_total_cap = yesterday_close * total_vol / 1e8
11 
12# 历史某日市值(如 5 天前)
13hist_close = df['close'].iloc[-5]
14hist_float_cap = hist_close * float_vol / 1e8

最近 N 天涨幅

提示

计算最近 3 日、5 日、10 日、30 日涨幅,用于动量排序和筛选。

qmt://docs/python
Python
1df = daily_data[stock]
2closes = df['close']
3 
4# 最近 N 日涨幅 = (今日收盘 / N日前收盘 - 1) × 100
5gain_3 = round((closes.iloc[-1] / closes.iloc[-4] - 1) * 100, 2) # 3日涨幅
6gain_5 = round((closes.iloc[-1] / closes.iloc[-6] - 1) * 100, 2) # 5日涨幅
7gain_10 = round((closes.iloc[-1] / closes.iloc[-11] - 1) * 100, 2) # 10日涨幅
8gain_30 = round((closes.iloc[-1] / closes.iloc[-31] - 1) * 100, 2) # 30日涨幅
9 
10# N 日内最大涨幅(峰值)
11max_gain_10 = round((closes.iloc[-10:].max() / closes.iloc[-11] - 1) * 100, 2)
12# N 日内最大回撤(谷值)
13max_dd_10 = round((closes.iloc[-10:].min() / closes.iloc[-11] - 1) * 100, 2)

均线计算(MA / EMA / MACD)

提示

基于 K 线收盘价计算移动平均线和指数均线,用于趋势判断。

qmt://docs/python
Python
1df = daily_data[stock]
2closes = df['close']
3 
4# 简单移动平均
5ma5 = round(closes.iloc[-5:].mean(), 2) # 5日均线
6ma10 = round(closes.iloc[-10:].mean(), 2) # 10日均线
7ma20 = round(closes.iloc[-20:].mean(), 2) # 20日均线
8ma60 = round(closes.iloc[-60:].mean(), 2) # 60日均线
9 
10# 指数移动平均(EMA)
11ema12 = round(closes.ewm(span=12, adjust=False).mean().iloc[-1], 2)
12ema26 = round(closes.ewm(span=26, adjust=False).mean().iloc[-1], 2)
13 
14# MACD
15dif = round(ema12 - ema26, 4)
16dea = round(closes.ewm(span=9, adjust=False).mean().iloc[-1], 4)
17macd = round(2 * (dif - dea), 4)
18 
19# 金叉/死叉
20if ma5 > ma10 and closes.iloc[-2] < closes.ewm(span=10, adjust=False).mean().iloc[-2]:
21 loger.info(f'{stock} MA5上穿MA10 金叉')

成交量分析(放量 / 缩量)

提示

对比今日与近期平均成交量,判断放缩量。

qmt://docs/python
Python
1df = daily_data[stock]
2volumes = df['volume']
3 
4today_vol = volumes.iloc[-1] # 今日成交量(手)
5avg_vol_5 = volumes.iloc[-6:-1].mean() # 最近5日平均量(不含今日)
6avg_vol_10 = volumes.iloc[-11:-1].mean() # 最近10日平均量
7 
8# 量比
9vol_ratio = round(today_vol / avg_vol_5, 2) if avg_vol_5 > 0 else 0
10 
11if vol_ratio > 2:
12 loger.info(f'{stock} 放量 量比:{vol_ratio}')
13elif vol_ratio < 0.5:
14 loger.info(f'{stock} 缩量 量比:{vol_ratio}')

历史停牌检测

提示

利用 suspendFlag 字段检测历史停牌日,避免计算时引入噪声。

qmt://docs/python
Python
1df = daily_data[stock]
2 
3# 历史停牌天数
4suspend_days = (df['suspendFlag'] == 1).sum()
5 
6# 最近 10 日是否有停牌
7recent_suspend = (df['suspendFlag'].iloc[-10:] == 1).any()
8 
9# 过滤停牌日后的有效交易日序列
10valid_df = df[df['suspendFlag'] == 0]
11valid_closes = valid_df['close']

振幅 / 波动率计算

提示

计算日内振幅和 N 日年化波动率,用于风险评估和仓位调整。

qmt://docs/python
Python
1df = daily_data[stock]
2 
3# 日内振幅 = (最高 - 最低) / 前收盘 × 100
4daily_amplitude = ((df['high'] - df['low']) / df['preClose'] * 100).round(2)
5 
6# 最近 20 日年化波动率
7daily_returns = df['close'].pct_change().iloc[-20:]
8annualized_vol = round(daily_returns.std() * (252 ** 0.5) * 100, 2)

分钟级盘中数据获取

提示

获取当日分钟 K 线,用于盘中策略。

qmt://docs/python
Python
1min_data = C.get_market_data_ex(
2 fields=['open', 'high', 'low', 'close', 'volume'],
3 stock_code=[stock],
4 period='1m',
5 start_time=time.strftime('%Y%m%d') + '093000',
6 end_time='',
7 count=-1,
8 dividend_type='none',
9 fill_data=False,
10 subscribe=True
11)
12min_df = min_data[stock]
13# 第一根分钟K线(9:31)
14first_min = min_df.iloc[0]
15# 当前分钟收盘价
16cur_min_close = min_df['close'].iloc[-1]

字段功能速查表

get_full_tick 字段能做什么

字段能做的事
lastPrice当日涨幅、涨停封板强度、市值计算、保证金计算(贯穿全文)
lastClose前收盘参考、涨跌幅计算(与 PreClose 互补)
volume换手率计算、成交量分析(单位:手)
amount成交额过滤、活跃度排序
askPrice / bidPrice盘口分析、委买卖压
askVol / bidVol委买卖量、买卖力道对比
stockStatus实时证券状态判断

get_market_data_ex 字段能做什么

字段能做的事
close昨天市值、N日涨幅、均线、波动率、动量排序
open / high / low振幅计算、K线形态识别
volume换手率序列、放缩量判断、量比计算
amount成交额过滤、活跃度排序
preClose日内振幅计算、涨跌幅基准
suspendFlag历史停牌检测、有效交易日过滤
settelementPrice期货结算价参考
openInterest期货持仓量变化分析

get_instrument_detail 字段能做什么

字段能做的事
UpStopPrice涨停封板强度、一字板检测、涨停不撤单、距涨停幅度
DownStopPrice跌停不撤单、跌停封死检测
PreClose当日涨幅计算、跳空缺口检测、涨跌幅排序
FloatVolume换手率计算、流通市值过滤、自由流通市值分级
TotalVolume总市值过滤、大中小盘分级
OpenDate次新股筛选、上市天数过滤、IPO 日期标记
InstrumentNameST/退市过滤、关键词筛选
InstrumentStatus停牌检测、复牌首日标记
PriceTick下单价格精度对齐、废单防范
VolumeMultiple期货保证金计算、每手价值
LongMarginRatio期货保证金、杠杆倍数
MainContract主力合约切换检测、移仓换月
SettlementPrice期货结算价参考
ExpireDate退市/到期日过滤

一键初始化全市场基础信息

盘前初始化全市场基础信息 - init_market_info

提示

将以上功能整合,盘前一次性构建全市场基础信息字典 + 实时 Tick 缓存。全局缓存变量包括:stock_info_dict({股票代码: detail字典})、up_to_down_dict({股票代码: [涨停价, 跌停价]})、float_vol_dict({股票代码: 流通股本})、tick_dict({股票代码: get_full_tick返回的实时数据})。

原型

qmt://docs/python
Python
1# 全局缓存
2stock_info_dict = {} # {股票代码: detail字典}
3up_to_down_dict = {} # {股票代码: [涨停价, 跌停价]}
4float_vol_dict = {} # {股票代码: 流通股本}
5tick_dict = {} # {股票代码: get_full_tick返回的实时数据}
6 
7def init_market_info(C):
8 """盘前初始化: 获取沪深A股全部基础信息"""
9 all_stocks = C.get_stock_list_in_sector('沪深A股')
10 for s in all_stocks:
11 info = C.get_instrument_detail(s)
12 if not info:
13 continue
14 name = info.get('InstrumentName', '')
15 if 'ST' in name or '*ST' in name or '退' in name:
16 continue
17 up = info.get('UpStopPrice')
18 dwn = info.get('DownStopPrice')
19 if up and dwn:
20 up_to_down_dict[s] = [round(up, 2), round(dwn, 2)]
21 stock_info_dict[s] = info
22 float_vol_dict[s] = info.get('FloatVolume', 0)
23 loger.info(f'全市场基础信息初始化完成: 有效股票{len(stock_info_dict)}只')

释义

盘前初始化,获取沪深A股全部基础信息,排除 ST/退市股票,将涨跌停价、合约详情、流通股本缓存到全局字典。

参数

字段名数据类型解释
Cobject策略上下文对象

返回值

无返回值,结果存入全局变量 stock_info_dictup_to_down_dictfloat_vol_dict

盘中刷新实时 Tick - refresh_tick

原型

qmt://docs/python
Python
1def refresh_tick(C):
2 """盘中定时刷新实时Tick数据"""
3 valid_stocks = list(stock_info_dict.keys())
4 tick_dict = C.get_full_tick(valid_stocks)
5 loger.info(f'实时Tick刷新完成: {len(tick_dict)}只')

释义

盘中定时调用,刷新 stock_info_dict 中所有有效股票的实时 Tick 数据。

参数

字段名数据类型解释
Cobject策略上下文对象

返回值

无返回值,结果存入全局变量 tick_dict

获取历史 K 线(按需) - get_hist_data

原型

qmt://docs/python
Python
1def get_hist_data(C, stock, count=30):
2 """获取最近N日日K线"""
3 data = C.get_market_data_ex(
4 fields=['open', 'high', 'low', 'close', 'volume', 'preClose', 'suspendFlag'],
5 stock_code=[stock], period='1d',
6 start_time='', end_time='', count=count,
7 dividend_type='none', fill_data=False
8 )
9 return data.get(stock)

释义

按需获取单只股票最近 N 日日 K 线数据,包含 preClosesuspendFlag 字段。

参数

字段名数据类型解释
Cobject策略上下文对象
stockstr股票代码,如 '600000.SH'
countint获取的 K 线条数,默认 30

返回值

DataFrame — 指定股票的历史日 K 线数据。

盘中调用示例

qmt://docs/python
Python
1# 查涨停价
2up_price = up_to_down_dict.get(s, [0, 0])[0]
3 
4# 查流通股本
5float_vol = float_vol_dict.get(s, 0)
6 
7# 查前收盘
8pre_close = stock_info_dict.get(s, {}).get('PreClose', 0)
9 
10# 查实时最新价(来自 get_full_tick)
11lastPrice = tick_dict.get(s, {}).get('lastPrice', 0)
12 
13# 当日涨幅
14if pre_close > 0 and lastPrice:
15 pct = round((lastPrice - pre_close) / pre_close * 100, 2)
16 
17# 最近5日涨幅(来自 get_market_data_ex)
18df = get_hist_data(C, s, count=6)
19if df is not None and len(df) >= 6:
20 gain_5 = round((df['close'].iloc[-1] / df['close'].iloc[-6] - 1) * 100, 2)

盘中实时量比计算

提示

量比 = 当日累计成交量 / 已过分钟数 / 历史5日每分钟平均成交量

同时用到 get_full_tick(实时 volume + time)和 get_market_data_ex(历史5日 volume),是跨接口组合的典型场景。

第一步:盘前预计算历史5日每分钟平均量

原型

qmt://docs/python
Python
1import time
2from datetime import datetime
3 
4his_dict = {} # {股票代码: 历史5日每分钟平均成交量}
5 
6def his_lb_func(C, all_stock_list):
7 """盘前调用: 批量预计算所有股票历史5日每分钟平均量
8 
9 Args:
10 C: 策略上下文
11 all_stock_list: 成分股列表,如 C.get_stock_list_in_sector('沪深A股')
12 """
13 # 获取最近10个交易日(取倒数第2个=昨天,排除今天)
14 trading_dates = C.get_trading_dates('000001.SH', '', '', 10, '1d')
15 end_tm = trading_dates[-1]
16 if time.strftime('%Y%m%d') == trading_dates[-1]:
17 end_tm = trading_dates[-2] # 排除今天,只要历史5日
18 
19 # 批量获取所有股票历史5日日成交量
20 price = C.get_market_data_ex(
21 ['volume'],
22 all_stock_list,
23 period='1d',
24 start_time='',
25 end_time=end_tm,
26 count=5,
27 dividend_type='front',
28 fill_data=False
29 )
30 
31 for s in price:
32 his_dict[s] = price[s]['volume'].sum() / (240 * 5) # 5日总量 / (240分钟×5天)
33 loger.info(f'{s} 历史5日每分钟均量: {his_dict[s]}')

释义

盘前批量预计算所有股票的历史5日每分钟平均成交量,公式为:5日总量 / (240分钟 × 5天)。

参数

字段名数据类型解释
Cobject策略上下文对象
all_stock_listlist[str]成分股列表,如 C.get_stock_list_in_sector('沪深A股')

返回值

无返回值,结果存入全局变量 his_dict({股票代码: 历史5日每分钟平均成交量})。

第二步:盘中实时量比

原型

qmt://docs/python
Python
1def calculate_qrr(C, s):
2 """盘中实时计算量比 (全推 get_full_tick 模式)"""
3 full_kline = C.get_full_tick([s])
4 
5 # 当前 tick 时间
6 t0 = datetime.now().replace(hour=9, minute=30, second=0, microsecond=0)
7 t = full_kline[s]['time']
8 tick_time = datetime.fromtimestamp(t / 1000)
9 r = tick_time - t0
10 
11 # 当日已过分钟数(9:30 起算)
12 market_open_knums = int(r.seconds / 60 + 1)
13 if tick_time.hour >= 13: # 午休 90 分钟扣除
14 market_open_knums -= 90
15 market_open_knums = min(market_open_knums + 1, 240) # 上限 240
16 
17 vol = full_kline[s]['volume'] # 当日累计成交量(手)
18 pased_volumes = his_dict.get(s) # 历史5日每分钟平均量
19 
20 if not pased_volumes:
21 return 0
22 return vol / market_open_knums / pased_volumes

释义

盘中实时计算量比,从 get_full_tick 获取当日累计成交量和当前 tick 时间,计算已过分钟数,再除以历史5日每分钟平均量。

参数

字段名数据类型解释
Cobject策略上下文对象
sstr股票代码,如 '600000.SH'

返回值

float — 实时量比值。>1 为放量,<1 为缩量。

第三步:init 串联调用

原型

qmt://docs/python
Python
1def init(C):
2 # 1. 获取成分股
3 all_stock_list = C.get_stock_list_in_sector('沪深A股')
4 # 2. 盘前预计算历史5日每分钟平均量
5 his_lb_func(C, all_stock_list)
6 # 3. 盘中逐只计算实时量比
7 for s in all_stock_list:
8 qrr = calculate_qrr(C, s)
9 loger.info(f'{s} 量比: {qrr:.2f}')

释义

init 中串联调用三步:获取成分股 → 盘前预计算历史均量 → 盘中逐只计算实时量比。

参数

字段名数据类型解释
Cobject策略上下文对象

返回值

无返回值。

量比逻辑说明

参数来源说明
volget_full_tickvolume当日累计成交量(实时,单位:手)
market_open_knumsget_full_ticktime当日已过分钟数(9:30 起算,午休扣 90 分钟,上限 240)
pased_volumesget_market_data_exvolume历史5日每分钟平均成交量 = 5日总量 / (240×5)
trading_datesC.get_trading_dates最近10个交易日时间戳,取倒数第2个排除今天
量比vol / market_open_knums / pased_volumes,>1 放量,<1 缩量

策略选股完整模板

提示

以下是一个完整的 init(C) 选股模板,串联了文档涉及的四个核心接口,实现 8 重过滤,可直接复制使用或按需裁剪。相关接口参考 行情函数

过滤流程一览

步骤过滤条件依赖接口依赖字段
1排除 ST / 退市股票get_instrument_detailInstrumentName
2排除创业板(300 开头)get_stock_list_in_sector代码前缀
3排除科创板(688 开头)get_stock_list_in_sector代码前缀
4排除上市不足 120 日get_instrument_detailOpenDate
5排除股价 < 20 元get_market_data_exclose
6排除流通市值 < 100 亿get_instrument_detail + get_market_data_exFloatVolume + close
7排除昨日换手率 < 0.05%get_market_data_ex + get_instrument_detailvolume + FloatVolume
8排除 10 日涨跌幅 > 10%get_market_data_exclose 序列

提示

换手率公式换手率(%) = 昨日成交量(手) × 100 / 流通股本(股) × 100,其中 ×100 是手→股换算。

完整代码

qmt://docs/python
Python
1# encoding:gbk
2"""
3策略选股模板:获取成分股(带多重过滤条件)
4过滤条件:
5 1. 排除ST股票和退市股票
6 2. 排除创业板(300开头)
7 3. 排除科创板(688开头)
8 4. 排除上市时间小于120日的股票
9 5. 排除股价<20元的股票
10 6. 排除流通市值<100亿的股票
11 7. 排除昨日换手率<0.05%的股票(换手率 = 成交量×100/流通股本)
12 8. 排除10日涨跌幅>10%的股票
13"""
14import time
15import numpy as np
16 
17# 全局变量:过滤后的成分股列表
18hs300_stocks = []
19# 全局变量:15分钟K线数据
20hs300_data = {}
21 
22 
23def init(C):
24 """策略初始化"""
25 global hs300_stocks, hs300_data
26 
27 # ── 1. 获取成分股列表 ──
28 all_stocks = C.get_stock_list_in_sector('中证500')
29 loger.info(f'【初始】原始成分股数量: {len(all_stocks)}')
30 
31 current_date = time.strftime('%Y%m%d')
32 valid_stocks = []
33 
34 for stock in all_stocks:
35 detail = C.get_instrument_detail(stock)
36 if not detail:
37 continue
38 
39 name = detail.get('InstrumentName', '')
40 
41 # --- 过滤1: 排除ST / 退市 ---
42 if 'ST' in name or '*ST' in name or '退' in name:
43 continue
44 
45 code_raw = stock.split('.')[0]
46 
47 # --- 过滤2: 排除创业板(300开头)---
48 if code_raw.startswith('300'):
49 continue
50 
51 # --- 过滤3: 排除科创板(688开头)---
52 if code_raw.startswith('688'):
53 continue
54 
55 # --- 过滤4: 排除上市不足120日 ---
56 open_date = str(detail.get('OpenDate', ''))
57 if len(open_date) >= 8:
58 days_diff = int(current_date) - int(open_date[:8])
59 if days_diff < 120:
60 continue
61 
62 valid_stocks.append(stock)
63 
64 loger.info(f'【过滤1-4】ST/创业板/科创板/次新股后剩余: {len(valid_stocks)} 只')
65 
66 if not valid_stocks:
67 hs300_stocks = []
68 return
69 
70 # ── 2. 获取日线数据(用于股价、流通市值、换手率、涨跌幅过滤)──
71 daily_data = C.get_market_data_ex(
72 fields=['open', 'high', 'low', 'close', 'volume'],
73 stock_code=valid_stocks,
74 period='1d',
75 start_time='',
76 end_time='',
77 count=11,
78 dividend_type='none',
79 fill_data=False
80 )
81 
82 # ── 3. 过滤5: 股价 < 20元 ──
83 price_filtered = []
84 for stock in valid_stocks:
85 if stock in daily_data and len(daily_data[stock]) >= 1:
86 close_price = daily_data[stock]['close'].iloc[-1]
87 if close_price and close_price >= 20:
88 price_filtered.append(stock)
89 
90 loger.info(f'【过滤5】股价<20元后剩余: {len(price_filtered)} 只')
91 
92 # ── 4. 过滤6: 流通市值 < 100亿 ──
93 mktcap_filtered = []
94 for stock in price_filtered:
95 detail = C.get_instrument_detail(stock)
96 if not detail:
97 continue
98 float_volume = detail.get('FloatVolume', 0)
99 if not float_volume or float_volume <= 0:
100 continue
101 close_price = daily_data[stock]['close'].iloc[-1]
102 circulating_mktcap = (float_volume * close_price) / 1e8 # 亿
103 if circulating_mktcap >= 100:
104 mktcap_filtered.append(stock)
105 
106 loger.info(f'【过滤6】流通市值<100亿后剩余: {len(mktcap_filtered)} 只')
107 
108 # ── 5. 过滤7: 昨日换手率 < 0.05% ──
109 turnover_filtered = []
110 low_turnover_stocks = []
111 for stock in mktcap_filtered:
112 detail = C.get_instrument_detail(stock)
113 if not detail:
114 continue
115 float_volume = detail.get('FloatVolume', 0)
116 if not float_volume or float_volume <= 0:
117 continue
118 if stock in daily_data and len(daily_data[stock]) >= 2:
119 yesterday_volume = daily_data[stock]['volume'].iloc[-2]
120 yesterday_turnover = (yesterday_volume * 100) / float_volume * 100
121 name = detail.get('InstrumentName', stock)
122 if yesterday_turnover < 0.05:
123 low_turnover_stocks.append(stock)
124 continue
125 turnover_filtered.append(stock)
126 
127 loger.info(f'【过滤7】换手率<0.05%后剩余: {len(turnover_filtered)} 只')
128 
129 # ── 6. 过滤8: 10日涨跌幅 > 10% ──
130 final_stocks = []
131 for stock in turnover_filtered:
132 if stock in daily_data and len(daily_data[stock]) >= 11:
133 close_series = daily_data[stock]['close']
134 pct_change = (close_series.iloc[-1] / close_series.iloc[0] - 1) * 100
135 if abs(pct_change) > 10:
136 continue
137 final_stocks.append(stock)
138 
139 loger.info(f'【过滤8】10日涨跌>10%后剩余: {len(final_stocks)} 只')
140 
141 # ── 7. 过滤结果汇总 ──
142 loger.info('========== 过滤结果汇总 ==========')
143 loger.info(f'原始数量: {len(all_stocks)}')
144 loger.info(f'最终数量: {len(final_stocks)}')
145 loger.info(f'因换手率不足被排除: {len(low_turnover_stocks)} 只')
146 if low_turnover_stocks:
147 loger.info('因换手率不足被排除的股票列表:')
148 for stock in low_turnover_stocks[:20]:
149 detail = C.get_instrument_detail(stock)
150 name = detail.get('InstrumentName', '') if detail else ''
151 loger.info(f' - {stock} {name}')
152 if len(low_turnover_stocks) > 20:
153 loger.info(f' ... 还有 {len(low_turnover_stocks) - 20} 只')
154 
155 hs300_stocks = final_stocks
156 
157 # ── 8. 获取15分钟K线数据 ──
158 if hs300_stocks:
159 hs300_data = C.get_market_data_ex(
160 fields=['open', 'high', 'low', 'close', 'volume'],
161 stock_code=hs300_stocks,
162 period='15m',
163 start_time='20250101',
164 end_time='',
165 count=100,
166 dividend_type='none',
167 fill_data=False
168 )
169 loger.info(f'15分钟K线数据获取完成,股票数量: {len(hs300_data)}')
170 else:
171 loger.info('没有符合条件的股票,最终列表为空!')
172 
173 
174def handlebar(C):
175 """每根K线执行"""
176 pass
177 
178 
179def get_hs300_stocks():
180 """获取过滤后的成分股列表"""
181 return hs300_stocks
182 
183 
184def get_hs300_data():
185 """获取成分股15分钟K线数据"""
186 return hs300_data

模板要点说明

要点说明
接口串联get_stock_list_in_sectorget_instrument_detailget_market_data_ex,覆盖文档一/三/四章
分步过滤先用 get_instrument_detail 做静态过滤(ST/创业板/科创板/次新),再用 get_market_data_ex 做动态过滤(股价/市值/换手率/涨跌幅)
换手率公式昨日成交量(手) × 100 / 流通股本(股) × 100,注意 ×100 是手→股换算
count 参数日线 count=11(10日涨跌幅需 11 根),15分钟线 count=100
按需裁剪可注释掉任意过滤步骤,或调整阈值(如股价阈值 20→10,市值阈值 100→50)
日志输出每步过滤后打印剩余数量,便于排查;被排除的换手率不足个股单独列出

智能助手

咨询式 AI · 带入当前文档

智能助手加载中...