股票学习-量柱和k线-第二天

量柱战法精解
本文深入解析股市量柱的六种类型及其背后的市场含义,包括倍量柱、平量柱、高量柱、低量柱、缩量柱和梯量柱。探讨不同量柱组合如何指示市场趋势变化,揭示黄金柱的形成条件,帮助投资者把握买卖时机。

三不定律

股数不变:一家公司上市发行的股票是一定的,比方说发行了一亿股,40%是原始股,60%是流通股,那这6000万股被认购完就没有了,别人不卖你就买不到,
操作不错:当你按下买入或卖出的那一步操作是没有错的,基于你对后市看涨或看跌,如果卖完涨了,或者买完跌了,错的是你是前一步,对个股的分析和研判,
盈亏不等:赚钱和亏钱

量柱的本质

第一是真实。有成交才有记录,没有成交就不会记录,不会因为有人在K线或均线上做假而改变其形态。

第二是有效。光有买没有买或者光有卖没有买,没有成交量,也没有量柱,有人买有人卖撮合成交了才会有成交量,所以它有效,
  
第三是平衡。在哪个价位区间,成交了多少量,在这个区间内买卖平衡
  
第四是暂时。时间段,量柱就是某个时间段,某个价位的暂时的平衡

量柱是有形的实体,高低红绿就是量形的外在表现形式
量柱有其量性,主要体现在阴阳,真假,盈亏六个方面

第一,阴阳。所有的量形都具有阴阳的属性,阴表示下跌,阳表示上涨,阴胜则阳亏,阳胜则阴亏,阴盛则阳生,阳盛则阴生。
在这里插入图片描述
在这里插入图片描述

第二,真假。外形低开高走的"假红",用量学的眼光看就是假阳真阴,假阴真阳 是涨 假阳真阴 是跌
在这里插入图片描述

阳胜进 阴胜出 小倍阳,大胆入

量性分析的基本原则是:必须根据 量柱的位置量柱的对比 来判断 量柱的性质 ,必须从众多的量柱中,抓住最重要的某一根或某几根量柱来进行分析,分析出了量性,才能看懂股市的发展方向

量柱是 有级 的实体,所谓的量级就是量柱的级别

任何量柱的形成绝对不是孤立的,它一定是此量柱与彼量柱相互作用的结果,甚至是这一群量柱与另一群量柱相互作用的结果,所以量柱的结构往往决定了它的级别,这就是量级的分析
第一,从量形上看,量柱形态多种多样,我们要从中筛选出六种最容易识别的,一眼就能看出的量形

就是高量柱,低量柱,平量柱,倍量柱,梯量柱,缩量柱

在这里插入图片描述

倍量柱:就是比昨日量柱高出一倍以上的量柱。它甚至可以高出几倍以上,但是最低要高出90%(见图左侧箭头所指处)。

平量柱:就是与昨日量柱持平或基本持平的量柱。它必须是两根以上的持平,有时高达8根持平,上下浮动差距不应超过5%(如图F柱和次日柱)。

高量柱:就是某一阶段的最高量柱。可能是天量柱,也可能不是天量柱,只要比前后的量柱明显高出即可(见图中右侧箭头所指)。

低量柱:就是某一阶段的最低量柱。可能是地量柱,也可能不是地量柱,只要是某一阶段的明显最低的即是(见图中A柱左侧的两根量柱)。

缩量柱:就是比昨日量柱逐步缩小的量柱。它应该一天比一天低,降低的幅度可大可小,只要是逐步走低的就是(见图中D柱右侧的4根量柱)。

梯量柱:就是比昨日量柱逐步走高的量柱。它应该一天比一天高,升高的幅度可大可小,只要是逐步走高的就是(见图中C柱前后的3根量柱)。

从图中的标示可知:“高量柱”是最明显的,但可能不是最重要的;“倍量柱”是最重要的,但不是最明显的;任何量柱只有在与别的量柱的搭配过程中,才能显示出其重要性。

“量柱”的品质

没有比较就没有鉴别,没有鉴别就没有优劣。判断某根量柱的品质,绝不能只看它的大小,而应该从相邻量柱的“力量”对比中去判断其“力道”倾向。 “力量”是研判买卖双方的力度,“力道”是研判多空双方的走向。

高量柱和低量柱

“高量柱”和“低量柱”是某一阶段的对比。只要是某一阶段的最高量柱,就是“高量柱”;只要是某一阶段的最低量柱,就是“低量柱”。请看下图:
在这里插入图片描述

很明显,图中左边箭头所指是低量柱,右边是高量柱,二者有如下三个“对立”的品质:

① 高量柱是在某一价位成交火热的标志;而低量柱则是在某一价位成交清淡的标志。

② 高量柱是在某一价位双方认同的标志;而低量柱则是在某一价位双方分歧的标志。

③ 高量柱后的走势多数向下,少数向上;而低量柱后的走势多数向上,少数向下。

这三个品质中,前两个特点一般人都能看到或猜到,第③个品质往往被人忽视,而这个被人忽视的“少数”特点,却蕴藏着极大的机会,请看上图的H柱之后,股价6天之内暴涨40%,那么,与H柱近似的L柱之后是不是也能暴涨40%呢?我看它应该还有不错的涨幅

思考:同样是“高量柱”,为什么只有H柱之后能够大涨,其它5个高量柱之后却反而大跌呢?看来“高量柱”并非全是有价值的。

提示:高量柱+缩量柱=黄金柱,这样的高量柱才是有价值的。

倍量柱和平量柱

“倍量柱”和“平量柱”是与昨天量柱的对比。只要相对昨日量柱增量一倍或一倍以上,就是“倍量柱”;只要相对昨日量柱持平或基本持平,就是“平量柱”。当然,其增量或持平的误差不宜超过10%。

请看下图:

在这里插入图片描述
见上图:左侧箭头指的是“倍量柱”,右侧是“平量柱”。用字母标注的ABCDEG都是倍量柱,CDFH都是平量柱。这两种柱形都是“与昨日量柱”相比而确立的。值得注意的是D柱,它既是“倍量柱”又是“平量柱”,一柱“身兼两职”,在今后的分析中,您将会发现“身兼数职”的量柱。

“倍量柱”和“平量柱”的品质:

① 倍量柱比它昨日的量柱增量一倍或一倍以上,明显是昨日量柱对应的价位满足不了一方胃口,一方要大量吃进,预示着股价看涨;平量柱与它昨日的量柱基本持平,说明昨日量柱对应的价位基本合乎双方胃口,暗示双方正在你争我夺,争夺的结果要在次日分晓。

② 倍量柱体现了主导方的主动行为,毫不犹豫,力拨万钧,意犹未尽;平量柱却显得双方有些被动,讨价还价,犹豫不决,原势趋缓,行将衰竭。

③ 倍量柱体现了有预谋有计划的行动,攻击性多于试探性;平量柱则体现了试一试看一看的味道,观望性多于徘徊性。

这三个品质中,前两个品质一般人都能看到或悟到,第③个品质一般人很难想明白,而这第③个品质中蕴藏的能量往往能爆发出一轮意想不到的行情。

思考:请看上图的G点倍量柱之后,为什么行情急骤飚升,而其它几个倍量柱后面的行情却不如G点呢?

提示:倍量柱+梯量柱=黄金柱,低量柱+梯量柱=黄金柱。

“缩量柱”和“梯量柱”

“缩量柱”和“梯量柱”对连续三天量柱的对比。只要连续三天缩量,就是“缩量柱”;只要连续三天增量成“阶梯状”,就是“梯量柱”。请看下图:
在这里插入图片描述
见上图:箭头所指步步高的为“梯量柱”,右侧步步低的为“缩量柱”。观察上面这些量柱对应的价位变化,才能看懂其品质。

“缩量柱”和“梯量柱”的品质:

① “缩量柱”的形态明显逐步走低;“梯量柱”的形态明显逐步走高。

② “缩量柱”的成交量是逐步缩小;“梯量柱”的成交量是逐步放大。

③ “缩量柱”和“梯量柱”都有“量价同步”和“量价背离”两种状况。

“缩量柱”的量价同步(上图A柱D柱):说明供求双方信心不足,每况愈下,体现了“价跌量缩” 的市况,但是,下到极点必然向上。

“梯量柱”的量价同步(上图B柱C柱):说明供求双方期望升值,每况愈上,体现了“价涨量增的市况”,但是,上到极点必然向下。

“缩量柱”若量价背离(见图中红箭头):其“量缩价涨”的态势,说明供不应求,有售必买,其庄家必然胸有成竹,志在必得,大有“力拨山兮气盖世”的得意;

“梯量柱”若量价背离(上图没有实例):其“量涨价跌”的态势,说明抛售踊跃,杀价而沽,其庄家必然力不从心,捉襟见肘,大有“心有余而力不足”的尴尬。

思考:“缩量柱”出现“量缩价涨”说明什么问题呢?它对我们的实际操作有什么预示吗?

提示:“量缩价涨”的“缩量柱”,体现了供不应求的局面,主力有“主动买入”的倾向。而“量涨价涨”的“梯量柱”体现了努力上攻的态势,主力有“被动买入”的倾向。

“量柱”的演变

从上面的图示可以看到,量柱的品质不是由高矮和红绿决定的,而是由买卖双方的力量对比和力道变化决定的。它们各自承担着“试探、建仓、增仓、补仓、震仓、启动、拉升”的职责,在不同的阶段,演绎着不同的角色,共同演绎着波澜壮阔的股市,创造着色彩斑烂的梦想。

从品质上看,自身最有价值的是“倍量柱”和“缩量柱”。

“倍量柱”可以分别承担“试探柱、建仓柱、增仓柱、补仓柱、震仓柱、启动柱、拉升柱、黄金柱”的角色。

“缩量柱”的“价涨量缩”特质,可以组合出最有价值的“黄金柱”。请看:

“倍量柱”+“缩量柱”可以是“黄金柱”;

“高量柱”+“缩量柱”可以是“黄金柱”;

“梯量柱”+“缩量柱”可以是“黄金柱”;

“平量柱”+“缩量柱”可以是“黄金柱”。

细心的朋友可能已经发现,量价背离的“缩量柱”,是培育“黄金柱”的酵母,有了它,我们就能在最不显眼的量柱上发现金子。许多庄家就是用这些最不显眼的量柱来迷惑散户,达到他们的目的。

由于量柱的组合与演变是一个斗智斗勇斗钱斗势的过程,所以在走势上将会形成一群又一群风采各异的“量柱群”,其力道的发展变化层出不穷。这就是我们下面将要讲到的“量柱群”,简称“量群”。

<think>我们首先需要明确MACD顶背离底背离的定义:-顶背离:股价创新高,但MACD指标的高点却比前一次高点低。-底背离:股价创新低,但MACD指标的低点却比前一次低点高。实现步骤:1.计算MACD指标(包括DIF、DEAMACD)。2.寻找股价的峰值(顶背离时)谷值(底背离时),以及对应的MACD值。3.比较相邻的两个股价峰值(或谷值)对应的MACD值,判断是否符合背离条件。注意:-背离通常需要连续的两个高点(顶背离)或两个低点(底背离)来比较。-由于股价MACD的波动,我们需要在一定的窗口内寻找最近的高点或低点。我们将按照以下步骤实现:1.计算MACD指标:我们可以使用`talib`库,或者自己编写计算函数。考虑到talib可能安装不便,这里我们使用自己编写的函数(或使用pandas的ewm计算)。2.寻找股价的局部高点局部低点:可以使用滚动窗口寻找极值点(例如,比较某点比前后若干点都高/低)。3.匹配股价高点MACD的对应高点,然后比较相邻两个高点(或低点)的股价MACD值的变化方向。具体实现:步骤1:计算MACD我们使用标准方法:快速EMA(一般12日),慢速EMA(一般26日),DIF=快速EMA-慢速EMA,DEA为DIF的9日EMA(也称MACD信号线),MACD=(DIF-DEA)*2。步骤2:寻找股价的峰谷顶背离:寻找股价的局部高点,要求该高点比前后N根K线的高点都高(N可调,比如5)。底背离:寻找股价的局部低点,要求该低点比前后N根K线的低点都低。步骤3:比较相邻的两个峰(或谷)对应的股价MACD值(通常用DIF值)顶背离:当前股价高点高于前一个股价高点,但当前DIF值低于前一个高点的DIF值。底背离:当前股价低点低于前一个股价低点,但当前DIF值高于前一个低点的DIF值。注意:在实际操作中,我们可能还需要考虑时间上的连续性,即两个相邻的峰(谷)之间不能间隔太远(比如不超过60根K线)。代码结构:1.计算MACD(包括DIF,DEA,MACD)。2.标记股价的局部高点局部低点。3.提取局部高点序列局部低点序列。4.遍历局部高点序列,比较相邻两个高点对应的股价DIF值,判断顶背离。5.遍历局部低点序列,比较相邻两个低点对应的股价DIF值,判断底背离。注意:由于背离的判断通常需要最新的K线与之前的比较,因此我们可能只需要最近出现的两个高点(或两个低点)即可。然而,为了在图表上标注多个背离,我们可能需要找出所有满足条件的背离点。这里我们选择最近的两个高点(低点)进行判断,但需要注意的是,可能同时存在多个背离(比如连续多个顶背离),所以我们要在局部高点序列中逐一比较相邻的两个高点(不一定是连续的,但时间顺序是递增的)。由于我们更关注最近发生的背离,所以从最新往前推,找到最近的背离信号。实现方案:我们将编写一个函数,输入为股价(收盘价或最高价,通常用收盘价)对应的时间序列,计算MACD,然后找出背离点。注意:在寻找局部高点时,我们使用一个滚动窗口,比如窗口大小为5(即一个点要同时比左边两个右边两个都高才是局部高点)。同时,为了避免噪音,我们可以要求相邻两个高点之间至少间隔一定的K线(比如5根)。步骤2详细:寻找局部高点/低点局部高点:假设有数组`highs`(这里用最高价或者收盘价?通常顶背离用最高价,底背离用最低价,但有时也用收盘价。这里按需求,一般我们用最高价找顶背离,最低价找底背离)。方法:使用`argrelextrema`函数(scipy.signal中的函数)或者自己通过滚动窗口实现。由于我们可能没有scipy,所以自己实现:局部高点:对每个位置i,检查[i-窗口,i+窗口]内的最大值是否为i位置,如果是,则标记为高点。同样,低点也是检查最小值。但是,这样会找到很多点,我们需要过滤掉中间的小波动,要求两个相邻的高点(低点)之间有一定的距离(时间间隔)。步骤3:背离判断顶背离:从最近的高点开始,比较每个相邻的高点对(按照时间顺序,取连续两个高点)。如果当前高点(较新的)的股价高于前一个高点(较旧的),而当前高点的DIF值却小于前一个高点的DIF值,则标记为顶背离。底背离:从最近的低点开始,比较相邻的低点对。如果当前低点的股价低于前一个低点,而当前低点的DIF值大于前一个低点的DIF值,则标记为底背离。注意:有时候可能有多个连续背离,所以我们遍历所有相邻的低点对(高点对)进行判断。代码示例:我们使用pandas进行数据操作。假设我们有DataFrame数据`df`,包含日期(索引)、最高价(high)、最低价(low)、收盘价(close)。首先,计算MACD:如果没有talib,我们使用pandas的ewm函数计算指数移动平均:步骤1:计算MACD快速EMA(12日):`df['ema12']=df['close'].ewm(span=12,adjust=False).mean()`慢速EMA(26日):`df['ema26']=df['close'].ewm(span=26,adjust=False).mean()`DIF:`df['dif']=df['ema12']-df['ema26']`DEA:`df['dea']=df['dif'].ewm(span=9,adjust=False).mean()`MACD:`df['macd']=(df['dif']-df['dea'])*2`步骤2:寻找局部高点低点定义窗口大小,比如5。注意:避免使用未来信息,所以滚动窗口应该只使用过去当前的数据,但寻找极值点通常需要左右窗口。然而,在实盘中,我们无法使用未来的窗口,所以这里我们只使用左侧窗口(即只比较当前点与之前的点)。但是,这样可能会导致在最新点处标记的高点不够准确(因为它右边没有数据,我们不知道它是否还会被突破)。为了实时性,我们只能使用左侧窗口,即当前点比左边窗口内的点都高,且比当前最新的点都高(直到被突破)。但为了简化,我们采用固定窗口,并假设在计算时我们只对已经走完的K线进行判断(即不判断当前未完成的K线)。我们这里以收盘价最高价为例:顶背离用最高价序列,底背离用最低价序列。我们写一个函数来寻找局部高点低点:由于我们只需要最近发生的背离,所以可以只检查最近一段时间的数据(比如最近300根K线)。寻找局部高点(只考虑已完成的K线,即不包含当前正在形成的K线):我们定义函数`find_peaks``find_valleys`,用滚动窗口的方法(左侧窗口)。但是,为了简单,我们可以用:局部高点:当前最高价大于前N根K线的最高价,同时大于后N根K线的最高价?但我们不能使用未来数据,所以改为:当前最高价大于前N根K线的最高价,并且大于后M根K线(但只能用到当前为止)。如果我们只计算到当前,那么当前K线后面的数据是没有的,所以这里我们只能使用左侧窗口(即从当前开始往前的窗口)。调整:我们可以使用左侧的窗口(包括当前)来定义,即当前高点至少是最近N根K线(包括当前)的最高价,并且当前K线必须是这个窗口的最高价,同时当这个窗口移动时,当前点比下一个窗口的最高价要高(这种方法复杂)。另一种简单方法:当前高点比前1根、前2根、...、前N根的高点都高,那么它是一个局部高点(因为未来数据未知,所以无法确定,但在历史数据中我们可以使用未来数据(因为历史已经固定),但注意在实际交易中我们只能用历史固定数据)。因此,对于历史数据,我们可以使用中心窗口(包括左右),而对于最新数据,我们只能使用左侧窗口。这里我们考虑用历史数据(已固定),所以可以采用中心窗口:局部高点:对于位置i(索引),满足在[i-窗口,i+窗口]内,i处的最高价是最大值。同样,局部低点:i处的最低价是[i-窗口,i+窗口]内的最小值。然后,我们过滤掉相邻过近的高点(比如两个高点之间间隔小于5根K线,保留更高的那个)以避免重复。步骤3:背离检测对于局部高点序列(按时间顺序排列,从早到晚),我们遍历相邻的两个高点:若后一个高点的最高价>前一个高点的最高价,而后一个高点的DIF值<前一个高点的DIF值,则发生顶背离。底背离类似:对于局部低点序列,相邻两个低点,若后一个最低价<前一个最低价,而后一个低点的DIF值>前一个低点的DIF值,则底背离。注意:我们通常只关注最近发生的背离,所以从序列末尾开始找最近的背离。代码步骤:1.计算MACD。2.使用一个窗口大小(例如5)来寻找局部高点索引低点索引。3.提取局部高点:从`high`序列中取出这些点的最高价对应的DIF值;局部低点同理。4.对局部高点点按位置排序(时间顺序),然后从第一个到最后一个遍历,相邻两个点进行背离判断。同样,对低点序列遍历。5.标记出发生顶背离底背离的位置。但是,由于我们可能需要标注在图表上,所以通常只需要最新出现的背离。另一种方法:只取最近的两个高点(低点)进行判断。但这样可能会漏掉之前的背离。因此,我们可以在所有高点序列中遍历相邻的高点对,然后记录下所有符合条件的背离点。这里我们分别找出所有顶背离底背离,然后选取最近发生的。考虑到实际需求,我们可能更希望得到最近的一个背离信号,例如最近有顶背离,则可能是一个卖出信号。因此,我们可以在遍历局部高点序列时,从最新开始(即时间最近的)找连续两个高点进行判断。这里相邻的高点不一定是时间上连续的(因为中间可能有低点),但在局部高点序列中,它们是连续的。具体做法:对于按时间顺序排列的局部高点序列(索引从小到大,时间从早到晚),我们取最后两个高点(也就是最新的两个高点),判断它们是否满足顶背离条件。如果不满足,再考虑倒数第二个倒数第三个,等等。因为我们只需要最近的信号。但要注意,如果最新高点出现后,再出现一个更高的高点,那么这个高点将取代成为新的高点。所以我们只比较最近的两个高点(即序列最后两个)?实际上,我们需要比较的是:最近形成的一个高点与上一个高点(即前一个高点)之间的比较。这两个高点在时间上并不一定相邻(可能有其他小高点),但它们在局部高点序列中是相邻的(因为局部高点序列已经剔除了中间的小高点)。所以,在局部高点序列中,我们取最后两个点(也就是时间上最近的相邻两个高点)进行判断。底背离同理。因此,我们只需要检查局部高点序列中的最后两个点(如果存在两个或以上的话)是否满足顶背离条件。同样,局部低点序列的最后两个点是否满足底背离条件。这样,我们就能得到最近是否发生背离。实现:代码:步骤1:计算MACD步骤2:寻找局部高点低点步骤3:从局部高点序列中取出最后两个点,比较;从局部低点序列中取出最后两个点,比较。注意:我们寻找的局部高点低点都是基于已经结束的K线(即历史数据)。代码中需要注意:我们处理的数据是历史数据,所以可以用整个数据序列。局部高点/低点函数:我们将使用滚动窗口(中心窗口)来寻找局部极值点。可以使用`scipy.signal`中的`argrelextrema`,但为了减少依赖,我们自行实现。自行实现函数:注意:对于数据的开头结尾,窗口可能会超出范围,所以我们需要处理边界。为了方便,我们将只考虑中间部分的数据(即前后有足够多数据的部分)。我们编写一个简单的函数,输入一个序列,窗口大小,返回局部高点(索引数组)局部低点(索引数组)。考虑到时间,我们简化边界处理:只处理从窗口开始到窗口结束的数据。函数`find_local_extrema(series,window=5)`:高点:对每个位置i(从窗口开始到总长度-窗口),如果series[i]等于[i-window:i+window+1]这个窗口中的最大值,并且这个最大值是唯一的(或者我们只要求i处的值就是最大值,不管是否唯一),则标记为高点。低点同理,取最小值。但这样会有重复标记(相邻多个点都是最大值,但其实只算一个高点)。为了减少重复,我们要求局部高点必须严格大于窗口内所有其他值(即等于最大值且唯一)。或者,我们要求该点就是窗口内的最大值,并且该点比左右相邻的值要大?这样更准确。但实际上,我们使用:该点是窗口内的最大值,并且该点的值大于左右相邻的值(这样可以避免在连续平坦的情况下标记多个点)。但为了简单,我们采用:该点是整个窗口的最大值,并且该点不等于左右相邻(即避免连续平台)。但由于窗口内可能有平坦,我们取中间的那个?或者只要满足是最大值就标记,然后通过后续过滤(比如两个高点间隔太近,取最高的那个)。这里我们先采用:整个窗口内最大值的位置,如果有多个连续相同的最大值,只取中间位置?这样实现起来复杂。因此,我们采用一个简单方法:先找到所有满足比左边window大小右边window大小都大的点(即该点比左侧window个数据都大,且比右侧window个数据都大)[^2]。这样,我们就能找到局部高点。但是,这需要用到未来数据(右边的window)。所以对于实时应用,这个方法不可行,但对于历史数据可以。由于我们处理的是历史数据,所以可以使用。步骤:创建两个数组:`peaks=[]``valleys=[]`。循环遍历索引,从窗口开始`window`,到`len(series)-window`(因为需要右边有window个数据):当前索引为i,取窗口[i-window,i+window]内的最大值max_value最小值min_value。如果当前值`series[i]`等于max_value,并且`series[i]`大于`series[i-1]``series[i+1]`(以避免平台),则i是局部高点。同理,如果当前值等于min_value,并且小于左右相邻,则i是局部低点。但是,在窗口内可能有多个相同的高点,我们只取中间的那个?或者实际上,这样的定义会使得在平台处所有点都会被跳过(因为需要大于左右相邻)。所以平台不会被标记。这样,我们就能得到一组局部高点低点。然后,我们再过滤间隔过近的高点:如果两个高点之间间隔小于2*window+1,则保留较高的那个(因为我们的窗口是2*window+1,所以两个高点之间至少应该间隔2*window+1,否则就是同一个高点区域)。但我们不强制要求,因为实际中可能有多个波峰。所以我们只按照步骤3中所述,取最近的两个高点判断即可。然后,我们提取这些高点的位置,按时间顺序排列(因为我们的索引是从0开始递增的,所以位置索引也是时间顺序),然后取最后两个点进行判断。注意:在局部高点序列中,我们取位置索引最大的两个点(即最新的两个)。最后,我们比较:顶背离:设highs_list是局部高点索引列表(按索引从小到大排序),取最后两个点:idx1,idx2(其中idx2是较新的高点,idx1是前一个高点)比较:highs[idx2]>highs[idx1]且difs[idx2]< difs[idx1]底背离:lows_list,取最后两个点:idx1,idx2(idx2是较新的低点)比较:lows[idx2]< lows[idx1]且difs[idx2]>difs[idx1]如果满足条件,则发生了背离。由于我们的数据索引是0,1,...,len-1,最新数据在最后,所以局部高点索引数组最后的值是最大的索引,对应最新的高点。代码实现:假设我们有数据df,列包括'high','low','close',我们计算MACD。然后,寻找高点低点(窗口大小window=5,可调),得到高点的索引低点的索引。然后,按索引排序(本来就是从小到大):高点索引数组:peak_indices低点索引数组:valley_indices然后提取最后两个高点:如果len(peak_indices)>=2:idx1=peak_indices[-2]#前一个高点idx2=peak_indices[-1]#当前高点ifdf['high'][idx2]>df['high'][idx1]anddf['dif'][idx2]< df['dif'][idx1]:#发生顶背离print(f"顶背离发生在{idx1}{idx2}")同样,底背离:如果len(valley_indices)>=2:idx1=valley_indices[-2]#前一个低点idx2=valley_indices[-1]#当前低点ifdf['low'][idx2]< df['low'][idx1]anddf['dif'][idx2]>df['dif'][idx1]:#发生底背离print(f"底背离发生在{idx1}{idx2}")注意:这里我们用收盘价计算MACD的DIF,而高点判断用的是最高价,低点判断用的是最低价。但DIF是用收盘价计算的,所以这里是匹配收盘价对应的DIF最高价/最低价?实际上,我们需要的是:在高点位置,记录该位置的DIF值。由于DIF在一天内是一个值(通常我们用收盘价计算,所以代表当天的DIF值),而高点位置我们用的是当天的最高价(或最低价),所以是可以的(因为每个位置i的DIF值是该收盘价计算得到的,而最高价最低价发生在同一天,DIF只有一个值,所以直接取同一天的DIF值即可)。因此,代码中,每个位置i,我们用当天计算好的DIF值(在i位置)。但是,需要注意的是,MACD计算使用的是收盘价,而背离判断中,股价的高低点通常用最高价最低价。因此,在寻找局部高点时,使用最高价序列,而低点使用最低价序列,但对应的DIF值都是当天的(用收盘价计算的)。这样做是常见的做法,因为虽然当天的最高价最低价可能更极端,但DIF值是以收盘价计算的,所以当天的收盘价不一定是最高的。也就是说,最高价出现的当天,收盘价可能较低,导致DIF值也较低。这正体现了背离:价格有新高,但收盘相对没这么高,导致DIF值下降。因此,实现上是合理的。但是,还有一种做法:用收盘价判断背离(即寻找收盘价的局部高点低点)。这样就MACD计算保持一致。这两种方法都是可行的,实际中两种都有人用。这里我们按照常见的做法:顶背离用最高价序列(因为最高价创了新高),底背离用最低价序列(因为最低价创新低),但对应的是同一天的收盘价计算的DIF值。完整代码框架:1.导入包:pandas2.定义函数:计算MACD3.定义函数:寻找局部高点低点(中心窗口法)4.计算MACD5.寻找局部高点低点6.分别检查顶背离底背离注意:我们只检查最近的两对,因为我们只关心最近的背离信号。代码示例:由于篇幅,我们只写出主要代码,并注释。由于我们可能没有scipy,所以我们自己实现中心窗口的极值点查找。注意:中心窗口查找需要未来数据,所以只适用于历史数据。在实盘中,需要调整(比如只使用左侧数据)[^3],这里我们不考虑实盘,只考虑历史数据回测。现在开始写代码:</think> ### Python实现MACD顶底背离判断 #### 实现思路 MACD的顶背离底背离是重要的技术分析信号: - **顶背离**:股价创新高,但MACD指标未创新高(通常是DIF或MACD状图高点下移) - **底背离**:股价创新低,但MACD指标未创新低(通常是DIF或MACD状图低点上移) #### 实现步骤 ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt def calculate_macd(close, fast=12, slow=26, signal=9): """ 计算MACD指标 返回DataFrame: [dif, dea, macd] """ ema_fast = close.ewm(span=fast, adjust=False).mean() ema_slow = close.ewm(span=slow, adjust=False).mean() dif = ema_fast - ema_slow dea = dif.ewm(span=signal, adjust=False).mean() macd = (dif - dea) * 2 return pd.DataFrame({'DIF': dif, 'DEA': dea, 'MACD': macd}) def find_divergence(high, low, macd_df, window=5, threshold=0.2): """ 识别顶底背离 window: 检测窗口大小 threshold: 幅度阈值(避免微小波动误判) """ dif = macd_df['DIF'] patterns = pd.Series(index=macd_df.index, dtype=str) # 识别顶背离 for i in range(window, len(high)-1): # 找最近两个高点 peak1 = high.iloc[i-window:i].idxmax() peak2 = high.iloc[i-window+1:i+1].idxmax() if (high[peak2] > high[peak1]) and (dif[peak2] + threshold < dif[peak1]): patterns[peak2] = '顶背离' # 识别底背离 for i in range(window, len(low)-1): # 找最近两个低点 trough1 = low.iloc[i-window:i].idxmin() trough2 = low.iloc[i-window+1:i+1].idxmin() if (low[trough2] < low[trough1]) and (dif[trough2] > dif[trough1] + threshold): patterns[trough2] = '底背离' return patterns # 示例使用 if __name__ == "__main__": # 获取股票数据(示例) from pandas_datareader import data as pdr import yfinance as yf yf.pdr_override() # 获取数据 stock_data = pdr.get_data_yahoo('AAPL', start='2020-01-01', end='2023-01-01') # 计算MACD macd_df = calculate_macd(stock_data['Close']) # 识别背离 divergence_signals = find_divergence( high=stock_data['High'], low=stock_data['Low'], macd_df=macd_df, window=20, threshold=0.15 ) # 筛选出背离信号点 top_divergence = divergence_signals[divergence_signals == '顶背离'] bottom_divergence = divergence_signals[divergence_signals == '底背离'] # 可视化 plt.figure(figsize=(14, 10)) ax1 = plt.subplot(2, 1, 1) plt.plot(stock_data['Close'], label='Price') plt.scatter(top_divergence.index, stock_data.loc[top_divergence.index, 'Close'], marker='v', c='red', s=100, label='顶背离') plt.scatter(bottom_divergence.index, stock_data.loc[bottom_divergence.index, 'Close'], marker='^', c='green', s=100, label='底背离') plt.title('股票价格与背离信号') plt.legend() ax2 = plt.subplot(2, 1, 2) plt.plot(macd_df['DIF'], label='DIF') plt.plot(macd_df['DEA'], label='DEA') plt.bar(macd_df.index, macd_df['MACD'], label='MACD', color=np.where(macd_df['MACD']>0, 'r', 'g')) plt.title('MACD指标') plt.legend() plt.show() ``` #### 关键参数说明 1. **MACD计算参数** - `fast=12`:快线周期(默认12日EMA) - `slow=26`:慢线周期(默认26日EMA) - `signal=9`:信号线周期(默认9日EMA) 2. **背离检测参数** - `window=20`:检测窗口(默认20根K线- `threshold=0.2`:差异阈值(过滤微小波动) 3. **改进建议** - 添加成交量验证(背离时成交量应萎缩) - 多时间周期验证(日线/周线背离结合) - 优化拐点检测算法(使用动态阈值) #### 注意事项 1. MACD背离是滞后指标,建议结合其他技术指标验证 2. 收盘价计算可能在实盘中有轻微偏差 3. 不同品种(股票/期货)需要调整参数 4. 大周期(周线/月线)背离信号更可靠 > 系统可针对不同品种自动优化参数配置,并对识别结果进行统计分析验证有效性[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值