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

SKILL入门

SKILL 让大模型按照说明书去自动化的做事情

第一 执行的步骤你需要自己清楚

第二 你可以将步骤转化为流程图,最好是代码

第三 你用skill说明: 做什么what 怎么做how 何时做when

SKILL 必须有名字和描述,且调用代码是CLI模式,在 scripts目录下的代码不是使用import,是直接执行调用

发表在 None | 留下评论