
尾盘选股公式的核心逻辑
尾盘选股公式基于尾盘时间段(通常为14:30至15:00)的量价特征,捕捉主力资金动向。量价关系体现为成交量放大与价格同步拉升,时间效应则利用收盘前的市场情绪稳定性。公式构建需覆盖数据清洗、信号计算与筛选条件,最终输出候选股票列表。
数据准备与预处理
量化选股的第一步是获取高质量的历史行情数据。使用Python的pandas库处理日线数据,需包含开盘价、收盘价、最高价、最低价、成交量等字段。针对尾盘时段,若需分钟级数据,可调用tushare或akshare接口,或从本地CSV读取。数据清洗需剔除停牌、涨跌停(ST股除外)及成交量异常为0的记录。以10分钟粒度构建尾盘数据,例如14:40、14:50、15:00三个时间点的快照,用于计算量价指标。

以下代码演示数据加载与基础清洗:
import pandas as pd
import numpy as np
def load_data(file_path):
df = pd.read_csv(file_path, parse_dates=['datetime'])
df = df[df['datetime'].dt.time >= pd.to_datetime('14:30').time()]
df = df[df['volume'] > 0] # 剔除无成交
return df
核心指标计算
量比
量比衡量当前成交量与过去5日同时段平均成交量的比值。尾盘量比大于2通常表示资金异动。计算公式为:
量比 = 当日尾盘累计成交量 / 过去5日尾盘平均成交量
价格变化率
价格变化率反映尾盘涨幅偏离程度。选取尾盘最后30分钟价格变动幅度,例如从14:30到15:00的涨跌幅。
资金流向
资金流向需结合大单主动买入额,但使用近似指标如收盘价位置(收盘价在当日最高价与最低价之间的比例),即收盘位置系数。公式为:
收盘位置系数 = (收盘价 - 最低价) / (最高价 - 最低价)
数值大于0.8时显示强势收盘。
以下函数计算这些指标:
def calculate_metrics(df):
# 假设df包含datetime, close, high, low, volume
df['date'] = df['datetime'].dt.date
# 计算尾盘成交量(14:30-15:00)
tail_vol = df.set_index('datetime')['volume'].between_time('14:30', '15:00').groupby(df['date']).sum()
# 计算过去5日平均成交量(按日)
avg_vol_5 = tail_vol.rolling(5).mean().shift(1)
df['volume_ratio'] = df['date'].map(tail_vol) / df['date'].map(avg_vol_5)
# 价格变化率(使用14:30和15:00的价格)
price_1430 = df.set_index('datetime')['close'].between_time('14:30', '14:30').groupby(df['date']).first()
price_1500 = df.set_index('datetime')['close'].between_time('15:00', '15:00').groupby(df['date']).last()
df['price_change'] = (price_1500 - price_1430) / price_1430
# 收盘位置
df['close_position'] = (df['close'] - df['low']) / (df['high'] - df['low'])
return df
选股条件设定
尾盘选股公式通常结合多个条件:
量比大于1.5
价格变化率大于2%
收盘位置系数大于0.7
剔除ST股与当日涨停股(避免无法买入)
条件可根据市场环境调整。例如牛市中放宽量比阈值,熊市中收紧。实现多条件筛选的逻辑如下:
def select_stocks(df, min_volume_ratio=1.5, min_price_change=0.02, min_close_pos=0.7):
# 假设df已经带有这些指标的列
condition = (
(df['volume_ratio'] > min_volume_ratio) &
(df['price_change'] > min_price_change) &
(df['close_position'] > min_close_pos) &
(df['is_st'] == False) &
(df['is_limit_up'] == False)
)
return df[condition]
公式实现与回测框架
尾盘选股公式的验证需通过回测。回测框架将每日选出的股票按次日开盘买入,持有至收盘或隔日。收益统计需考虑交易成本(佣金、滑点)。一个简单的回测流程如下:
获取每日选股结果。
计算次日开盘买入价和卖出价。
汇总每日收益,计算累计收益、夏普比率等。
以下为回测脚本骨架:
def backtest(selection_df, price_df):
# 假设selection_df包含日期和股票代码,price_df包含开盘、收盘价
# 返回每日策略收益
daily_returns = []
for date, stocks in selection_df.groupby('date'):
next_day = date + pd.Timedelta(days=1)
if next_day not in price_df.index:
continue
buy_prices = []
sell_prices = []
for stock in stocks['code']:
buy = price_df.loc[(next_day, stock), 'open']
sell = price_df.loc[(next_day, stock), 'close']
buy_prices.append(buy)
sell_prices.append(sell)
daily_ret = (np.mean(sell_prices) - np.mean(buy_prices)) / np.mean(buy_prices)
daily_returns.append(daily_ret)
return pd.Series(daily_returns).cumprod()
参数优化与稳健性检验
参数选择影响选股效果。通过网格搜索优化量比阈值、价格变化率等参数,以最大化夏普比率或降低最大回撤。检验超参数在历史数据上的敏感性,避免过拟合。可采用滚动时间窗口交叉验证。
param_grid = {'volume_ratio': [1.2, 1.5, 2.0], 'price_change': [0.01, 0.02, 0.03]}
best_params = None
best_sharpe = -999
for vr in param_grid['volume_ratio']:
for pc in param_grid['price_change']:
# 运行回测,计算夏普
sharpe = -1 # 占位
if sharpe > best_sharpe:
best_sharpe = sharpe
best_params = (vr, pc)
实际应用中的注意事项
实盘中需考虑流动性风险,尾盘选出的股票可能成交量低。应设置最小成交额过滤,例如总成交额大于5000万。法规限制T+0交易,次日的止盈止损策略需预先设定。系统需在收盘前几分钟输出候选池,时间延迟影响成交价。
公式有效性需持续跟踪,市场风格变化会导致因子失效。定期重估指标权重,引入机器学习模型(如随机森林)替代固定阈值,可提升适应性。
# 示例:使用随机森林进行打分排序
from sklearn.ensemble import RandomForestClassifier
# 特征包括量比、价格变化率、收盘位置等,标签为次日收益为正否
尾盘选股公式是量化策略中的一个细分切入点。基于Python实现的公式易于扩展和调试,回测框架的建立完善了策略研发闭环。从单纯依赖直觉到数据驱动,尾盘选股公式的量化落地为投资者提供了可验证的决策工具。