如何用Python编写量化尾盘选股公式

企业微信

尾盘选股公式的核心逻辑

尾盘选股公式基于尾盘时间段(通常为14:30至15:00)的量价特征,捕捉主力资金动向。量价关系体现为成交量放大与价格同步拉升,时间效应则利用收盘前的市场情绪稳定性。公式构建需覆盖数据清洗、信号计算与筛选条件,最终输出候选股票列表。

数据准备与预处理

量化选股的第一步是获取高质量的历史行情数据。使用Python的pandas库处理日线数据,需包含开盘价、收盘价、最高价、最低价、成交量等字段。针对尾盘时段,若需分钟级数据,可调用tushare或akshare接口,或从本地CSV读取。数据清洗需剔除停牌、涨跌停(ST股除外)及成交量异常为0的记录。以10分钟粒度构建尾盘数据,例如14:40、14:50、15:00三个时间点的快照,用于计算量价指标。

如何用Python编写量化尾盘选股公式

以下代码演示数据加载与基础清洗:


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]

公式实现与回测框架

尾盘选股公式的验证需通过回测。回测框架将每日选出的股票按次日开盘买入,持有至收盘或隔日。收益统计需考虑交易成本(佣金、滑点)。一个简单的回测流程如下:

  1. 获取每日选股结果。

  2. 计算次日开盘买入价和卖出价。

  3. 汇总每日收益,计算累计收益、夏普比率等。

以下为回测脚本骨架:


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实现的公式易于扩展和调试,回测框架的建立完善了策略研发闭环。从单纯依赖直觉到数据驱动,尾盘选股公式的量化落地为投资者提供了可验证的决策工具。

转载请注明出处:https://www.lianghuajiaoyi.top/wenzhang/weipan-xuangu-gongshi-lianghua-jiaoyi-374.html