量化交易 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 | 留下评论

量化交易 均线

MA5 短 MA10 MA20 月度 MA60 趋势

金叉 MA5>MA10

死叉 MA5<MA10

上涨时候 均线是支撑跌倒均线 会反弹

下跌时候 均线是压力 涨到均线 会回落

股价在均线上 强势

股价在均线下 弱势

与当前股价比较

均线 60 长期

均线 20 短期 小于20 谨慎 大于20 可以考虑

越小越短

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['ma5']=df["收盘"].rolling(window=5).mean()
df['ma10']=df["收盘"].rolling(window=10).mean()
df['ma20']=df["收盘"].rolling(window=20).mean()
df['ma60']=df["收盘"].rolling(window=60).mean()

df_valid = df.dropna(subset=["ma5", "ma10"]).copy()

# 后期使用df_valid去实现数据

df.iloc[-1]['ma5']
df.iloc[-1]['ma10']

df.iloc[-2]['ma5']
df.iloc[-2]['ma10']

Jin = False
Si = False
Duo = False
Kong = False

#金
Jin=(df.iloc[-1]['ma5']>df.iloc[-1]['ma10'])&(df.iloc[-2]['ma5']<df.iloc[-2]['ma10'])
#死
Si=(df.iloc[-1]['ma5']<df.iloc[-1]['ma10'])&(df.iloc[-2]['ma5']>df.iloc[-2]['ma10'])
#2日多
Duo=(df.iloc[-1]['ma5']>df.iloc[-1]['ma10'])&(df.iloc[-2]['ma5']>df.iloc[-2]['ma10'])
#2日空
Kong=(df.iloc[-1]['ma5']<df.iloc[-1]['ma10'])&(df.iloc[-2]['ma5']<df.iloc[-2]['ma10'])

print(df.iloc[-1]['日期'])
print(Jin,Si,Duo,Kong)

# 需要加入周线【周线 加 日线】

#当时股价与均线比较即可 df.iloc[-1]['ma60']
发表在 None | 留下评论