量化交易 【交易量】VOL-MA OBV

【只能预测下个交易日】【不能盘中使用】

VOL-MA(也常写作 VMA),全称 Volume Moving Average,即成交量均线,是金融交易中最基础、最常用的技术指标之一。

VOL-MA5(5 日成交量均线)

VOL-MA10(10 日成交量均线)

VOL-MA20(20 日成交量均线)。

量价配合:股价上涨时,成交量 > VOL-MA,且VOL-MA5 上穿 VOL-MA10(金叉),通常视为资金进场、趋势强势的信号。

量价背离:股价上涨但成交量 < VOL-MA,或VOL-MA5 下穿 VOL-MA10(死叉),提示上涨动能不足,需警惕回调。

缩量确认:股价回调时,成交量萎缩至 VOL-MA 下方,抛压减轻,可能是阶段性底部信号。

import akshare as ak
import pandas as pd

# 日
# df = ak.stock_zh_a_hist(symbol="000021", period="daily", start_date="20250101", end_date="20260313", adjust="qfq")
# 周
# df = ak.stock_zh_a_hist(symbol="000021", period="weekly", start_date="20250101", end_date="20260313", adjust="qfq")



# df.to_csv("000021z.csv", index=False)
# print("数据已保存,共", len(df), "行")

df=pd.read_csv("000021z.csv")
# print(df.head())

# df["日期"] = pd.to_datetime(df["日期"])  # 转为时间格式
# df.sort_values("日期", inplace=True)    # 按日期正序排列


df['vol_ma5']=df["成交量"].rolling(window=5).mean()
df['vol_ma10']=df["成交量"].rolling(window=10).mean()
df['vol_ma20']=df["成交量"].rolling(window=20).mean()
df['vol_ma60']=df["成交量"].rolling(window=60).mean()

VOL-MA自己定义

OBV(能量潮)

OBV 是将成交量与股价涨跌结合的累计指标

  • OBV 与股价同步上涨:量价配合,上涨趋势健康;
  • OBV 上涨但股价横盘:资金悄悄进场,可能即将突破;
  • OBV 下跌但股价上涨:量价背离,上涨动能不足,警惕回调。

OBV 初始值设为 0(无前日数据,无法判断涨跌)

OBV=OBV昨日+(涨成交量/负成交量/0)

发表在 None | 留下评论

量化交易 KDJ BOLL

KDJ算法:【9日为计算周期 933】

先算RSV:RSV = (C – L9) / (H9 – L9) * 100

  • C:第9日的收盘价
  • L9:第1天到第9天这9天内的最低价
  • H9:第1天到第9天这9天内的最高价

计算K值:(快线)

当日K值 = 2/3 × 前一日K值 + 1/3 × 当日RSV

初始化 第一个K值为50

计算D值:(慢线)

当日D值 = 2/3 × 前一日D值 + 1/3 × 当日K值

初始化 第一个D值为50

计算J值:(用于放大信号)

J值 = 3 × 当日K值 – 2 × 当日D值

策略:

  1. 判断超买与超卖
    • 当K值和D值都高于80时,市场进入超买区,意味着价格上涨可能过度,存在回调风险。 K>80 D>80
    • 当K值和D值都低于20时,市场进入超卖区,意味着价格下跌可能过度,存在反弹机会。 K<20 D<20
    • J值的反应更激进,当J值大于100时,表明市场极度超买;当J值小于0时,表明市场极度超卖。 J>100 超买 J<0 超卖
  2. 发出金叉与死叉信号
    • 金叉:当K线从下方向上穿过D线时,形成买入信号,尤其在超卖区形成的金叉可靠性更高。K>D
    • 死叉:当K线从上方向下穿过D线时,形成卖出信号,尤其在超买区形成的死叉意义更强。 K<D
  3. 识别顶底背离
    • 顶背离:当股价创新高,但KDJ指标的高点却逐步降低,暗示上涨动能衰竭,是潜在的顶部反转信号。
    • 底背离:当股价创新低,但KDJ指标的低点却逐步抬高,暗示下跌动能减弱,是潜在的底部反转信号

BOLL算法 :衡量市场的波动率【震荡判断】

衡量波动率,震荡行情中,BOLL可以帮你识别相对的高点和低点.不要机械地认为“碰到上轨就卖,碰到下轨就买”。这种策略只在横盘震荡的行情中有效。如果在单边上涨的牛市中,价格会持续在布林带上轨附近运行,如果一碰到上轨就卖出,就会错失主升浪。因此,使用BOLL时,首先要判断市场是处于“趋势”还是“震荡”状态。

BOLL指标由上、中、下三条轨道线组成:

中轨 MB= MA20 

上轨 UP =中轨 + K 倍的过去 N 日收盘价的标准差

下轨 DN=中轨 – K 倍的过去 N 日收盘价的标准差

标准差 (σ) = 过去20日收盘价的标准差


  • 触及上轨:股票价格运行到上轨附近,通常意味着处于相对高位,可能面临回调压力。【仅在震荡行情中有效】
  • 触及下轨:股票价格运行到下轨附近,通常意味着处于相对低位,可能获得支撑反弹。【仅在震荡行情中有效】

带宽扩张(开口变大)标准差变大=》上小轨道间变大=》行情正在加速

带宽收缩(开口变小/收口)当价格长时间在一个狭小范围内波动,标准差变小,上下轨会收得很窄。这被称为“布林带挤压”,通常预示着市场正在积蓄力量,即将发生方向不明的重大突破

当价格经过长时间的窄幅震荡(带宽收缩)后,突然放量突破上轨或下轨,这通常是新一轮趋势启动的信号。

  • 向上突破:价格带量突破上轨,可能是买入信号。
  • 向下突破:价格跌破下轨,可能是卖出或止损信号。
  • 注意:需要结合成交量来确认突破的有效性,无量的突破很可能是假突破19。

标准差:
先平均值ma20

方差:((每个股价-ma20)平方 相加)/20

标准差:再方差开根号

发表在 None | 留下评论

量化交易 RSI

多空双方力量的对比(它不光看价格涨了多少,而是看上涨的力度下跌的力度谁更强。)

[0,100]

  • 50:多空分界线。高于 50 代表多方强势,低于 50 代表空方强势
  • RSI > 70 时,说明市场短期内上涨过快、买盘过热,就像弹簧被压到了极限,此时价格容易回调或下跌
  •  RSI < 30 时,说明市场短期内下跌过猛、卖盘过急,此时价格容易反弹或上涨

算法

设基准价:
a = 100

后面 14 天的涨跌数(我随便编一组,方便你看 当天与前一日的涨跌数据 ):
开始 100 | 102 | 101 | 104 | 102 | 103……
2, -1, 3, -2, 1, 0, 4, -1, 2, -3, 1, -2, 3, -1

  • 所有上涨(Gain):2,3,1,4,2,1,3
    总和 = 16
  • 所有下跌(Loss):1,2,1,3,2,1
    总和 = 10

计算:
AvgGain = 16 / 14 ≈ 1.14
AvgLoss = 10 / 14 ≈ 0.71

RS = 1.14 / 0.71 ≈ 1.61

RSI = 100 – 100/(1+1.61)
= 100 – 100/2.61
≈ 61.7

import pandas as pd
df=pd.read_csv("000021.csv")

df['delta']=df['收盘'].diff()
df['gain']=df['delta'].where(df['delta']>0,0)
df['loss']=-df['delta'].where(df['delta']<0,0)
df['avg_gain']=df['gain'].rolling(14).mean()
df['avg_loss']=df['loss'].rolling(14).mean()


df['avg_loss'] = df['avg_loss'].replace(0, 1e-6)

df['rs']=df['avg_gain']/df['avg_loss']
df['rsi']=100-(100/(1+df['rs']))


print(df.head(30))
发表在 None | 留下评论

量化交易 MACD

MACD 指数平滑异同移动平均线 【均线的另一类】

  • DIF(快线/蓝色线) :短期均线与长期均线的差值,反应灵敏,代表短期趋势的动量。
  • DEA (慢线/信号线/红色线): DIF 线的移动平均线(相当于对 DIF 再做一次平滑),反应较慢,用于确认 DIF 的趋势
  • MACD 柱状图(Histogram/红绿柱):它是 DIF 线与 DEA 线之间的差值(通常放大 2 倍显示):直观显示多空力量的强弱。柱子变长代表动能增强,变短代表动能减弱

第一步 计算各天的EMA

计算基于指数移动平均线(EMA)为 12, 26, 9

  • EMA(12):12 日指数移动平均线(快速线)
  • EMA(26):26 日指数移动平均线(慢速线)

当日EMA计算:

其中第一天EMA 是你选这系数的 收盘价的算术平均值(如果是EMA(12)的话就是12天的算术平均值)

第二步 当日的DIF(差离值)(快线-慢线)

DIF=EMA(12)-EMA(26)

  • 当 DIF 是正数(距离为正):说明短期成本高于长期成本,大家都愿意出高价买,是买入信号
  • 当 DIF 是负数(距离为负):说明短期成本低于长期成本,大家都在恐慌抛售,是卖出信号
  • 当 DIF 是 0(距离为0):说明快慢线重合,市场处于平衡点。

第三步 计算 DEA(信号线)

DEA 是 DIF 的 9 日指数移动平均线(EMA)

平滑系数 (α)
这里的周期 NN 取值为 9,所以平滑系数 α=2/(9+1)=0.2α=2/(9+1)=0.2

具体来说,DEA的作用主要体现在以下几个方面:
🧭 1. 生成买卖信号(金叉与死叉)
DEA作为DIF的“基准线”或“触发线”,两者之间的交叉是MACD最核心的交易信号12。
金叉(买入信号)当DIF线从下方向上穿越DEA线时,形成“黄金交叉”。这通常意味着短期上涨动能已经强于长期平均动能,是看涨信号12 。
死叉(卖出信号)当DIF线从上方向下穿越DEA线时,形成“死亡交叉”。这通常意味着短期下跌动能开始占据优势,是看跌信号12 。


📉 2. 判断趋势强弱(零轴位置)
DEA线相对于零轴的位置,可以帮助投资者快速判断市场的整体多空氛围57。
零轴上方:当DEA线运行在零轴上方时,通常表示市场处于多头趋势(上涨趋势)中。此时即使出现回调,只要不跌破零轴,上升趋势尚未改变57。
零轴下方:当DEA线运行在零轴下方时,通常表示市场处于空头趋势(下跌趋势)中。此时的反弹若未能推动DEA上穿零轴,则下跌趋势依然主导57。


📊 3. 辅助判断动能衰减(斜率变化)
除了位置和交叉,DEA线的斜率变化也具有重要的先行指示意义57。
斜率趋缓:当DEA线在上升过程中,其上升角度(斜率)开始逐渐变小、走平,这可能预示着上涨动能正在减弱,趋势可能即将反转或进入盘整57。
斜率增大:当DEA线的上升或下降角度变得越来越陡峭,说明当前趋势(无论是上涨还是下跌)正在加速,动能正在增强58。


🔄 4. 识别潜在反转(背离)
DEA线常被用来与股价走势进行对比,以识别“背离”现象。背离是潜在的趋势反转预警信号24。
顶背离:当股价创出新高,但DEA线未能同步创出新高(甚至出现更低的高点),这表明上涨动力不足,可能即将见顶回落24。
底背离:当股价创出新低,但DEA线未能同步创出新低(甚至出现更高的低点),这表明下跌动力正在衰竭,可能即将触底反弹

第四步:生成最终形态(MACD 柱状图)

算出 DEA 后,我们已经有了两条线(DIF 和 DEA),但为了更直观地观察它们之间的关系,通常会画出第三部分——MACD 柱状图

发表在 None | 留下评论

量化交易 ATR

平均真实波动

ATR大 市场剧烈 涨跌大

ATR小 市场平淡 震荡

上涨+ATR变大=上涨有力量

下跌+ATR变大=下跌很凶

策略

ATR大 波动大 少买

ATR小 波动小 可以多买(量化)

算法:

TR 三个选一个

当日最高-当日最低

当日最高-昨日收盘

在当日最低-昨日收盘

取绝地值 然后从其中选取最大的值 就是TR


ATR 14交易日为一个周期,第一个ATR需要再向前推14个交易的平均TR

之后递归执行(执行14次计算)

import pandas as pd
df=pd.read_csv("000021.csv")
# 当日最高-当日最低

# 当日最高-昨日收盘

# 在当日最低-昨日收盘
df['高低']=df['最高']-df['最低']
df['高收']=abs(df['最高']-df['收盘'].shift(1))
df['低收']=abs(df['最低']-df['收盘'].shift(1))
df['TR']=df[['高低','高收','低收']].abs().max(axis=1) #axis=1行计算

df['ATR'] = df['TR'].ewm(span=14, adjust=False).mean()

print(df.head(30))

# ATR/股价 才是振幅
发表在 None | 留下评论