Python实现ADTM工具判断信号:股票技术分析的工具系列(6)

Python实现ADTM工具判断信号:股票技术分析的工具系列(6)


介绍

ADTM(动态买卖气指标)是一种用于衡量市场买卖力量对比的指标。它通过计算动态买盘指标(DTM)和动态卖盘指标(DBM)之间的差值来反映买卖双方的力量对比情况。

简单点说,就是看买家和卖家谁更强的一个东西。就是算一算买盘(DTM)和卖盘(DBM)的活跃程度谁大,谁小。如果ADTM是正的,那就意味着买家比较牛,行情可能朝上走;反之,如果ADTM是负的,那就表示卖家势头强,股市可能往下走。所以,瞅瞅ADTM的数字,投资者就能稍微明白点市场的味道,更容易决定接下来是涨是跌。当然,有些人还会把ADTM搞个移动平均(MAADTM),就是为了数据更平滑些,看长期的买卖势头走向。

本篇文章将分享如何写一个ADTM工具,希望对大家有帮助。

先看看官方介绍:

ADTM(动态买卖气指标)
用法
1.该指标在+1到-1之间波动;
2.低于-0.5时为很好的买入点,高于+0.5时需注意风险。

算法解释

DTM:=IF(OPEN<=REF(OPEN,1),0,MAX((HIGH-OPEN),(OPEN-REF(OPEN,1))));
DBM:=IF(OPEN>=REF(OPEN,1),0,MAX((OPEN-LOW),(OPEN-REF(OPEN,1))));
STM:=SUM(DTM,N);
SBM:=SUM(DBM,N);
ADTM:IF(STM>SBM,(STM-SBM)/STM,IF(STM=SBM,0,(STM-SBM)/SBM));
MAADTM:MA(ADTM,M);

优势:

优势描述
简单易懂ADTM指标在+1到-1之间波动,其数值的变化直观易懂,使得投资者可以快速理解市场的买卖气势。
清晰的买卖信号当ADTM指标低于-0.5时,表示市场处于较好的买入点,有利于投资者抓住低点进场;而当ADTM指标高于+0.5时,表示市场风险增加,投资者需要注意可能的调整或风险。

劣势:

劣势描述
单一性ADTM指标只是从买卖气势的角度进行分析,缺乏对其他市场因素的考虑,可能无法全面反映市场的复杂情况。
缺乏进一步的分析ADTM指标提供了买卖气势的信号,但缺乏对市场趋势、交易量等因素的深入分析,投资者可能需要结合其他指标和分析方法进行综合判断。
市场风险虽然ADTM指标提供了关于市场风险的提示,但并不意味着买入或卖出的时机是绝对准确的,投资者仍需谨慎考虑其他因素,并注意市场风险的变化。

代码

rolling函数介绍

rolling 函数通常与其他函数(如 meansumstd 等)一起使用,以计算滚动统计量,例如滚动均值、滚动总和等。

以下是 rolling 函数的基本语法:

DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
  • window: 用于计算统计量的窗口大小。
  • min_periods: 每个窗口最少需要的非空观测值数量。
  • center: 确定窗口是否居中,默认为 False
  • win_type: 窗口类型,例如 Noneboxcartriang 等,默认为 None
  • on: 在数据帧中执行滚动操作的列,默认为 None,表示对整个数据帧执行操作。
  • axis: 执行滚动操作的轴,默认为 0,表示按列执行操作。
  • closed: 确定窗口的哪一端是闭合的,默认为 None

完整代码

data代码

这里完整代码中的data部分,阔以通过下面资源文件下载,或者留下邮箱等发送。:

https://download.csdn.net/download/qq_36051316/88896567
ADTM.py


import pandas as pd
import numpy as np
import stock_data

data = {
    'DATE': stock_data.DATE,
    'CLOSE': stock_data.CLOSE,
    'HIGH': stock_data.HIGH,
    'LOW': stock_data.LOW,
    'OPEN': stock_data.OPEN,
    'CHANGE': stock_data.CHANGE,
    'VOL': stock_data.VOL,
    'CAPITAL': stock_data.CAPITAL
}

df = pd.DataFrame(data)

N = 23
M = 8


def calculate_ADTM(v_df, N, M):
    """
    计算ADTM指标

    参数:
    v_df: pandas.DataFrame,包含股票数据的DataFrame
    N: int,DTM和DBM的窗口大小
    M: int,MAADTM的窗口大小

    返回:
    无,结果直接存储在输入的DataFrame中
    """
    DTM = np.where(v_df['OPEN'] <= v_df['OPEN'].shift(1), 0,
                   np.maximum(v_df['HIGH'] - v_df['OPEN'], v_df['OPEN'] - v_df['OPEN'].shift(1)))
    DBM = np.where(v_df['OPEN'] >= v_df['OPEN'].shift(1), 0,
                   np.maximum(v_df['OPEN'] - v_df['LOW'], v_df['OPEN'] - v_df['OPEN'].shift(1)))
    STM = pd.Series(DTM).rolling(window=N, min_periods=1).sum()
    SBM = pd.Series(DBM).rolling(window=N, min_periods=1).sum()
    ADTM = np.where(STM > SBM, (STM - SBM) / STM, np.where(STM == SBM, 0, (STM - SBM) / SBM))
    MAADTM = pd.Series(ADTM).rolling(window=M, min_periods=1).mean()
    v_df['ADTM'] = ADTM
    v_df['MAADTM'] = MAADTM


def generate_signals(v_df, day_index=-1):
    """
    生成ADTM信号

    参数:
    v_df: pandas.DataFrame,包含ADTM指标的DataFrame
    day_index: int,要检查的日期索引,默认为最后一天

    返回:
    str,表示信号的字符串,可能为"买入信号"、"注意风险"或"无信号"
    """
    row = v_df.iloc[day_index]
    if row['ADTM'] < -0.5:
        return '买入信号'
    elif row['ADTM'] > 0.5:
        return '注意风险'
    else:
        return '无信号'


calculate_ADTM(df, N, M)
result = generate_signals(df)
print(result)


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盗理者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值