量化数据分析

利用分钟数据构建股票每日”冲高回落“的标识

由hxgre创建,最终由hxgre 被浏览 12 用户

一、“冲高回落”的定义

在股票领域中,大家经常会听到一个词,叫做“冲高回落”。冲高回落是指当日股票当日急速无量上涨,然后带量下跌。分时图走势为先扬后抑,一般为早盘拉高,然后慢慢下滑,收盘拉出一根上影线。

下图展示了 000599.SZ 在 2024-09-18 这一天的分时走势,其走势非常符合”冲高回落“的定义:

  • 冲高区域:该票当日早盘迅速下探当日低点3.52元后,有迅速地拔高趋向,在09:33-09:45短短12分钟内,从水下-4.61%涨至水上6.78%,振幅高达11.39%。这是典型的早盘冲高迹象。
  • 回落区域:接着该票在09:45达到当日最高价后,开启了一个漫长的下跌过程,虽然区间略有反弹,但最终在13:34探底冲高后的最低价3.61元,自最高点下跌

二、数据源介绍

平台提供了股票的分钟数据,链接如下:https://bigquant.com/data/datasources/cn_stock_bar1m,后续我们以该数据为源,介绍如何构建“冲高回落”指标。

三、指标构建详解

我们复现 000599.SZ 在 2024-09-18 这一天如何构建“冲高回落”指标:

  1. 从 cn_stock_bar1m 数据源中读取数据如下:
import dai
import numpy as np
import pandas as pd

date = "2024-09-18"
instrument = "000599.SZ"

df = dai.query(f"SELECT date, instrument, close, open FROM cn_stock_bar1m WHERE instrument='{instrument}'",
filters={"date": [f"{date} 08:00:00", f"{date} 16:00:00"]}).df()

示例数据如下:

  1. 计算“滚动最高价”和“当日最高价”,并通过这个两个指标标识当日达到最高价后的分钟:
# 滚动最高价
df["roll_high"] = df["close"].expanding().max()
# 当日最高价
df["high"] = max(df["close"])

# 股价达到最高点的标识
df["reach_peak"] = 0
df.loc[df["roll_high"]==df["high"], "reach_peak"] = 1

比如通过上述代码得到dataframe如下,可以看到,在 09:45:00后,reach_peak 标识由0变为1。

  1. 找到达到最高价之前的最低价,然后计算”冲高“的涨幅(max_increase):
# 达到最高点前的最低价
df["low_before_peak"] = df.loc[df["reach_peak"]==0, "close"].min()
# 当前最高涨幅
df["max_increase"] = df["roll_high"] - df["low_before_peak"]

通过上述代码得到 dataframe 后,可以看到在 09:45:00 达到最高价时,之前的最低价为3.52元,则计算得到“冲高”涨幅为0.42。

  1. 找到达到最高价之后的最低价,然后计算“回落”的跌幅(drop_after_peak):
# 自最高价后的滚动最低价
df["roll_low_after_peak"] = np.nan
df.loc[df["reach_peak"]==1, "roll_low_after_peak"] = df.loc[df["reach_peak"]==1, "close"].expanding().min()
# 当前股价在达到最高价后的最大跌幅
df["drop_after_peak"] = df["roll_low_after_peak"] - df["roll_high"]

通过上述代码得到 dataframe 后,可以看到在 13:34:00 达到最低价为3.61元(注意,这是达到最高价后的最低价,不是当日最低价),则计算得到“回落”跌幅为0.33 :

  1. 最后,我们比较“冲高”涨幅和“回落”跌幅,如果跌幅比例超过50%的话,我们认为满足“冲高回落“的性质:
# 冲高的涨幅
increase = df["max_increase"].values[-1]
# 回落的跌幅
decrease = df["drop_after_peak"].values[-1]

# 当回落跌幅有冲高涨幅的一半时,我们认为满足冲高回落的标识
if abs(decrease / increase) > 0.5:
    rally_retrace = True
else:
    rally_retrace = False
print(f"{instrument} 在 {date} 这一天满足冲高回落的条件吗:{'满足' if rally_retrace is True else '不满足'}")

四、后续优化

本文只是用一只股票一天的分钟数据说明如何构建“冲高回落“的标识,但本文还没有考虑成交量的影响。

如果各位投资者对相关因子有较强的兴趣,可以联系小Q,提供具体的数据需求,平台尽量为大家构建感兴趣的数据。

附录 代码

https://bigquant.com/codesharev3/32e6c496-9224-4e2c-af07-a926a579dbbc

\

{link}