基于姚建明,股价潜结构
姚建明的股价潜结构提供了一个框架,用于理解看似混乱的价格运动下的隐藏架构。核心论点是股票价格不是随机运动的——它们受到大资金流动、市场心理和金融市场分形性质的隐藏结构模式所支配。这些结构并不总是在表面可见的,但可以通过结合分形几何、威科夫式供需分析和量价关系理论的严格分析方法进行解码,这些方法被适应到中国A股市场背景。
本框架主要为中国A股市场(上交所/深交所)开发,但结构原理是通用的。姚强调,隐藏结构存在于任何具有足够流动性和参与者多样性的市场中——股票、期货、外汇和指数。
姚基于 Benoit Mandelbrot 的分形市场假设:金融市场在每个尺度上都表现出自相似模式。这不是比喻——这是形成整个分析体系基础的结构现实。
市场背景下分形的定义: 分形是在不同时间框架上表现出自相似性的价格结构。15分钟图上的五浪上涨与月线图上的五浪上涨具有相同的结构DNA。比例、成交量特征和行为动态在结构上是等价的。
实际意义:
姚确定了三个结构分辨率级别:
| 级别 | 时间框架 | 目的 |
|---|---|---|
| 宏观结构 | 月线、周线 | 确定主导结构趋势和主要供需区域 |
| 中观结构 | 日线、60分钟 | 识别中间结构形态和交易机会 |
| 微观结构 | 15分钟、5分钟 | 在更高结构设定的背景下精确定位入场/出场时间 |
嵌套原则: 每个中观结构都是宏观结构的组成部分。每个微观结构都是中观结构的组成部分。有效的交易设置要求微观结构与中观结构一致,理想情况下也与宏观结构一致。
每个价格运动,在每个尺度上,都要经历四个结构阶段:
关键洞察: 阶段之间的转换是最有价值的隐藏结构信号发生的地方。从吸筹到拉升,以及从派发到下跌的转换,是最大结构清晰度和最大利润潜力的时刻。
姚观察到价格结构表现出一种对称性——不是完美的镜像对称,而是比例对称。关键原则:
这些对称关系是指导方针,不是定律。它们提供结构期望,帮助交易者校准目标和时机。
传统支撑/阻力分析在明显的高点和低点画线。姚认为,最强大的供需区域是隐藏的——它们不在明显的价格水平,而是在吸筹和派发阶段内的结构拐点处。
隐性需求区(隐性需求区)的特征:
隐性供给区(隐性供给区)的特征:
第1步:找到整合范围 找到价格在有意义的时间内横向交易的区域(分析时间框架上至少10-15根K线)。这些是隐藏供需区域的滋生地。
第2步:分析范围内成交量分布 使用成交量分布或逐根成交量分析来确定范围内成交量最大的位置。范围内累计成交量最高的价格水平是控制点(POC)——这通常是最强的隐藏区域。
第3步:识别结构测试 寻找价格接近区域边界并在特定成交量形态下反转的实例:
第4步:确认区域有效性 当价格在初始离开后返回区域且区域保持时,隐藏区域被确认。首次返回测试最可靠——随后的测试会削弱区域,因为 resting orders 被吸收。
姚按结构强度对隐藏区域进行排名:
姚将威科夫的吸筹示意图适应并扩展到隐藏结构框架:
阶段A——停止下跌趋势:
阶段B——构建结构:
阶段C——弹簧(弹簧效应):
阶段D——拉升开始:
吸筹的镜像,有其自身隐藏的结构特征:
阶段A——停止上涨趋势:
阶段B——派发结构:
阶段C——上冲(上冲回落):
阶段D——下跌开始:
并非所有结构形态都是反转。姚识别了在趋势中出现的持续结构:
姚将成交量不是作为独立指标,而是作为结构验证器对待。成交量确认或否认从价格形态得出的结构假设。
原则1:成交量先于价格。 结构成交量变化(扩大或收缩)出现在结构价格变化之前。整合范围内的成交量扩大,即使没有价格突破,也预示着结构转换即将发生。
原则2:努力与结果(量价背离)。 成交量(努力)与价格运动(结果)的关系揭示结构健康:
原则3:大事成交量标志着结构极端。 当成交量达到相对 recent history(20天平均的2-3倍)的极端时,它预示着结构阶段即将结束。低位的大事成交量暗示下跌即将结束。高位的大事成交量暗示上涨即将结束。
在弹簧处:
在上冲处:
从吸筹突破时:
从派发跌破时:
姚倡导为整合范围构建成交量分布以定位结构的重心:
传统技术分析在先前的高点和低点画支撑/阻力。姚认为这是肤浅的。结构支撑/阻力来源于通过第3-5节方法识别的隐藏供需区域。
关键区别:
按可靠性排名(最强优先):
按可靠性排名(最强优先):
当多个结构 level 在狭窄的价格 band 内聚集时,它们形成一个结构共振区。这些区域比单独 levels 可靠得多。
当3个或更多因素(例如,新鲜需求区 + POC水平 + 斐波那契回撤都在彼此的2%内)时,代表高概率交易位置。
设置1:弹簧入场(弹簧入场)
设置2:突破入场(突破入场)
设置3:回踩入场(回踩入场)
设置4:上冲做空入场(上冲做空入场)
设置5:结构回踩入场(结构回踩入场)
设置6:结构共振入场(结构共振入场)
在任何入场之前,确认以下内容:
主要目标:
分批出场:
当结构 thesis 被验证失效时立即退出:
姚引入了基于结构对称性的时间出场概念:
姚倡导风险第一的仓位管理模型:
每笔交易最大风险: 总账户权益的1-2%。
仓位规模计算:
仓位规模 = (账户权益 × 风险百分比) / (入场价格 - 止损价格)
结构调整: 当结构设置具有最大共振(3+因素、多时间框架对齐、强成交量确认)时,使用2%风险。对于确认因素较少的次要设置,使用1%风险或更少。
止损必须放置在有结构意义的水平,而非任意百分比:
如果结构正确的止损距离产生的仓位规模太小而不切实际,则该设置不适合账户规模。不要放宽止损以增加仓位规模——这违反了结构风险管理。
当交易朝预期方向移动并通过结构里程碑时:
结构方法要求耐心。吸筹阶段持续数周到数月。弹簧可能不发生。突破可能会延迟。交易者的工作是等待结构完成,而不是在模糊阶段强制入场。 姚引述:"结构未成,不可妄动"(当结构尚未形成时,不要轻率行动)。
并非所有交易都值得同等信念。姚按结构完整性对交易质量进行排名:
| 等级 | 描述 | 信念 | 仓位规模 |
|---|---|---|---|
| A+ | 完整吸筹周期可见,弹簧确认,多时间框架对齐,成交量确认 | 最大 | 2%风险 |
| A | 吸筹可见,突破确认,成交量确认 | 高 | 1.5%风险 |
| B | 存在结构设置但缺少一个确认因素 | 中等 | 1%风险 |
| C | 结构设置模糊,只有一个或两个因素存在 | 低 | 0.5%风险或跳过 |
姚识别了与结构阶段对应的行为陷阱:
股票: 假设在上海证券交易所交易的股票"XYZ"。
第1步:宏观结构评估(周线图)
第2步:中观结构识别(日线图)
第3步:等待弹簧(日线图)
第4步:入场执行
第5步:结构目标
第6步:交易管理
总利润: 18,000 + 38,400 = 56,400元(账户权益的11.3%)。 承担风险: 10,000元(账户权益的2%)。 实现回报/风险: 5.64:1。
类 StructuralPatternDetector:
函数 detect_accumulation(price_data, volume_data, lookback=100):
"""
检测价格/成交量数据中的吸筹结构。
返回具有阶段状态的已识别吸筹区域列表。
"""
# 第1步:找到潜在卖出高潮
selling_climaxes = []
对于 i IN range(lookback, len(price_data)):
如果 (price_data[i].low < min(price_data[i-20:i].lows)
AND volume_data[i] > 3 * average(volume_data[i-20:i])
AND price_data[i].close > price_data[i].open): # 恢复K线
selling_climaxes.append({
index: i,
price: price_data[i].low,
volume: volume_data[i]
})
# 第2步:对于每个SC,寻找随后的AR和范围形成
accumulation_zones = []
对于 sc IN selling_climaxes:
# 找到自动反弹(SC后5-10根K线内的最高点)
ar_window = price_data[sc.index+1 : sc.index+11]
ar_high = max(ar_window.highs)
ar_index = index_of_max(ar_window.highs) + sc.index + 1
# 定义范围边界
range_low = sc.price
range_high = ar_high
range_height = range_high - range_low
# 第3步:确认阶段B(范围内整合)
consolidation_bars = 0
对于 j IN range(ar_index+1, min(ar_index+80, len(price_data))):
如果 price_data[j].low >= range_low * 0.98
AND price_data[j].high <= range_high * 1.02:
consolidation_bars += 1
如果 consolidation_bars < 15:
继续 # 吸筹的整合不够
# 第4步:寻找成交量下降的二次测试
st_count = 0
st_volume_declining = TRUE
对于 j IN range(ar_index+1, ar_index+consolidation_bars):
如果 price_data[j].low <= range_low * 1.02:
st_count += 1
如果 volume_data[j] > sc.volume * 0.7:
st_volume_declining = FALSE
# 第5步:检测弹簧
spring_detected = FALSE
spring_index = -1
spring_price = 0
对于 j IN range(ar_index+15, ar_index+consolidation_bars+10):
如果 (price_data[j].low < range_low
AND price_data[j].close > range_low
AND volume_data[j] < sc.volume * 0.5):
spring_detected = TRUE
spring_index = j
spring_price = price_data[j].low
突破
# 第6步:确定阶段
如果 spring_detected:
phase = "阶段C - 弹簧确认"
否则如果 st_count >= 2 AND st_volume_declining:
phase = "阶段B - 构建中"
否则:
phase = "阶段A - 早期"
accumulation_zones.append({
sc_index: sc.index,
sc_price: sc.price,
ar_high: ar_high,
range_low: range_low,
range_high: range_high,
phase: phase,
spring_detected: spring_detected,
spring_index: spring_index,
spring_price: spring_price,
consolidation_bars: consolidation_bars,
secondary_tests: st_count,
volume_declining: st_volume_declining
})
返回 accumulation_zones
函数 detect_distribution(price_data, volume_data, lookback=100):
"""
检测派发结构。吸筹的镜像逻辑。
"""
# 第1步:找到潜在买入高潮
buying_climaxes = []
对于 i IN range(lookback, len(price_data)):
如果 (price_data[i].high > max(price_data[i-20:i].highs)
AND volume_data[i] > 3 * average(volume_data[i-20:i])
AND price_data[i].close < price_data[i].open): # 反转K线
buying_climaxes.append({
index: i,
price: price_data[i].high,
volume: volume_data[i]
})
# 第2步:对于每个BC,寻找AR和范围
distribution_zones = []
对于 bc IN buying_climaxes:
ar_window = price_data[bc.index+1 : bc.index+11]
ar_low = min(ar_window.lows)
ar_index = index_of_min(ar_window.lows) + bc.index + 1
range_high = bc.price
range_low = ar_low
# 第3步:确认整合
consolidation_bars = 0
对于 j IN range(ar_index+1, min(ar_index+80, len(price_data))):
如果 price_data[j].high <= range_high * 1.02
AND price_data[j].low >= range_low * 0.98:
consolidation_bars += 1
如果 consolidation_bars < 15:
继续
# 第4步:检测上冲
upthrust_detected = FALSE
upthrust_index = -1
对于 j IN range(ar_index+15, ar_index+consolidation_bars+10):
如果 (price_data[j].high > range_high
AND price_data[j].close < range_high
AND volume_data[j] > average(volume_data[j-10:j]) * 1.5):
upthrust_detected = TRUE
upthrust_index = j
突破
如果 upthrust_detected:
phase = "阶段C - 上冲确认"
否则:
phase = "阶段B - 派发中"
distribution_zones.append({
bc_index: bc.index,
bc_price: bc.price,
ar_low: ar_low,
range_high: range_high,
range_low: range_low,
phase: phase,
upthrust_detected: upthrust_detected,
upthrust_index: upthrust_index,
consolidation_bars: consolidation_bars
})
返回 distribution_zones
类 SupplyDemandZoneIdentifier:
函数 identify_zones(price_data, volume_data, timeframe="日线"):
"""
基于成交量集中和结构分析识别隐藏供需区域。
"""
zones = []
# 第1步:找到整合范围
consolidations = find_consolidation_ranges(price_data, min_bars=10)
对于 consol IN consolidations:
range_data = price_data[consol.start : consol.end]
range_volume = volume_data[consol.start : consol.end]
# 第2步:为范围构建成交量分布
price_min = min(range_data.lows)
price_max = max(range_data.highs)
num_bins = 20
bin_size = (price_max - price_min) / num_bins
volume_profile = array(num_bins, 0)
对于 i IN range(len(range_data)):
bar = range_data[i]
vol = range_volume[i]
# 按比例分配成交量到K线范围
low_bin = floor((bar.low - price_min) / bin_size)
high_bin = floor((bar.high - price_min) / bin_size)
如果 high_bin == low_bin:
volume_profile[low_bin] += vol
否则:
vol_per_bin = vol / (high_bin - low_bin + 1)
对于 b IN range(low_bin, high_bin+1):
如果 b < num_bins:
volume_profile[b] += vol_per_bin
# 第3步:找到控制点
poc_bin = argmax(volume_profile)
poc_price = price_min + (poc_bin + 0.5) * bin_size
# 第4步:找到价值区(70%总成交量)
total_vol = sum(volume_profile)
target_vol = total_vol * 0.70
accumulated_vol = volume_profile[poc_bin]
va_low_bin = poc_bin
va_high_bin = poc_bin
当 accumulated_vol < target_vol:
expand_low = volume_profile[va_low_bin-1] 如果 va_low_bin > 0 否则 0
expand_high = volume_profile[va_high_bin+1] 如果 va_high_bin < num_bins-1 否则 0
如果 expand_low >= expand_high AND va_low_bin > 0:
va_low_bin -= 1
accumulated_vol += expand_low
否则如果 va_high_bin < num_bins - 1:
va_high_bin += 1
accumulated_vol += expand_high
否则:
突破
va_low_price = price_min + va_low_bin * bin_size
va_high_price = price_min + (va_high_bin + 1) * bin_size
# 第5步:根据整合后的情况确定区域类型
如果 consol.end < len(price_data) - 5:
post_consol = price_data[consol.end : consol.end+5]
如果 average(post_consol.closes) > consol.range_high:
zone_type = "需求" # 价格上升后——这是吸筹
否则如果 average(post_consol.closes) < consol.range_low:
zone_type = "供给" # 价格下跌后——这是派发
否则:
zone_type = "中性"
否则:
zone_type = "待定" # 整合仍在进行
# 第6步:找到低成交量节点(结构气穴)
avg_bin_vol = total_vol / num_bins
low_vol_nodes = []
对于 b IN range(num_bins):
如果 volume_profile[b] < avg_bin_vol * 0.3:
low_vol_nodes.append({
price: price_min + (b + 0.5) * bin_size,
relative_volume: volume_profile[b] / avg_bin_vol
})
# 第7步:确定区域新鲜度
times_tested = 0
对于 i IN range(consol.end, len(price_data)):
如果 (zone_type == "需求"
AND price_data[i].low <= va_high_price
AND price_data[i].low >= va_low_price):
times_tested += 1
否则如果 (zone_type == "供给"
AND price_data[i].high >= va_low_price
AND price_data[i].high <= va_high_price):
times_tested += 1
如果 times_tested == 0:
freshness = "新鲜"
否则如果 times_tested == 1:
freshness = "单次测试"
否则如果 times_tested <= 3:
freshness = "多次测试"
否则:
freshness = "耗尽"
zones.append({
type: zone_type,
poc_price: poc_price,
va_low: va_low_price,
va_high: va_high_price,
range_low: price_min,
range_high: price_max,
freshness: freshness,
times_tested: times_tested,
low_volume_nodes: low_vol_nodes,
timeframe: timeframe,
start_index: consol.start,
end_index: consol.end,
bar_count: consol.end - consol.start
})
返回 zones
函数 find_consolidation_ranges(price_data, min_bars=10):
"""
识别价格横向交易的时期。
整合定义为在至少 min_bars 期间,范围(高-低)小于
相对于 recent ATR 的阈值的时期。
"""
(文件长度限制——继续从第850行)