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

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


介绍

先看看官方介绍:

DMI (趋向指标)

用法

1.PDI线从下向上突破MDI线,显示有新多头进场,为买进信号;

2.PDI线从上向下跌破MDI线,显示有新空头进场,为卖出信号;

3.ADX值持续高于前一日时,市场行情将维持原趋势;

4.ADX值递减,降到20以下,且横向行进时,市场气氛为盘整;

5.ADX值从上升倾向转为下降时,表明行情即将反转。

算法解释

bash 复制代码
MTR:= SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),N);
HD := HIGH-REF(HIGH,1);
LD := REF(LOW,1)-LOW;
DMP:= SUM(IF(HD>0 AND HD>LD,HD,0),N);
DMM:= SUM(IF(LD>0 AND LD>HD,LD,0),N);
PDI: DMP*100/MTR;
MDI: DMM*100/MTR;
ADX: MA(ABS(MDI-PDI)/(MDI+PDI)*100,M);
ADXR:(ADX+REF(ADX,M))/2;

优势:

优势 描述
清晰的买卖信号 当PDI线从下向上突破MDI线时,显示有新多头进场,为买进信号;而当PDI线从上向下跌破MDI线时,显示有新空头进场,为卖出信号,提供了明确的交易信号。
确定趋势强度 ADX值持续高于前一日时,表明市场行情将维持原趋势,有助于投资者确认趋势的持续性,为持仓决策提供参考。
识别盘整行情 当ADX值递减并降到20以下,并且横向行进时,表明市场处于盘整状态,这对于那些偏好在趋势不明朗时选择观望或进行波段交易的投资者是有帮助的。

劣势:

劣势 描述
滞后性 DMI指标可能会出现滞后现象,尤其是在市场行情急剧变化时,指标可能无法及时反应新的市场趋势,导致错过买卖时机。
假信号 尽管DMI指标提供了明确的买卖信号,但在市场波动较大或盘整时,可能会出现假信号,导致交易损失。
需要结合其他指标 DMI指标虽然提供了趋势方向和趋势强度的信息,但并不能覆盖市场的所有方面,因此投资者在使用时需要结合其他指标和分析方法进行综合判断。

代码

rolling函数介绍

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

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

python 复制代码
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

完整代码

python 复制代码
import pandas as pd
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)


def check_signal(v_df, day_index=-1):
    """
    检查信号

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

    返回:
    str,表示信号的字符串,可能为"买入信号"、"卖出信号"或"无信号"
    """
    # 生成信号
    signal = "无信号"
    latest_data_PDI = v_df['PDI'].iloc[day_index]
    latest_data_PDI2 = v_df['PDI'].iloc[-1 + day_index]
    latest_data_MDI = v_df['MDI'].iloc[day_index]
    latest_data_MDI2 = v_df['MDI'].iloc[-1 + day_index]
    if latest_data_PDI > latest_data_MDI and latest_data_PDI2 <= latest_data_MDI2:
        signal = "买入信号"
    elif latest_data_PDI < latest_data_MDI and latest_data_PDI2 >= latest_data_MDI2:
        signal = "卖出信号"
    return signal


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

    参数:
    v_df: pandas.DataFrame,包含股票数据的DataFrame
    N: int,计算MTR和移动平均的窗口大小
    M: int,计算ADX的平滑窗口大小

    返回:
    无,结果直接存储在输入的DataFrame中
    """
    # 计算 MTR
    v_df['HL'] = v_df['HIGH'] - v_df['LOW']
    v_df['HC'] = abs(v_df['HIGH'] - v_df['CLOSE'].shift(1))
    v_df['LC'] = abs(v_df['LOW'] - v_df['CLOSE'].shift(1))
    v_df['MAX1'] = v_df[['HL', 'HC']].max(axis=1)
    v_df['MAX2'] = v_df[['MAX1', 'LC']].max(axis=1)
    v_df['MTR'] = v_df['MAX2'].rolling(window=N).sum()
    # 计算 HD
    v_df['HD'] = v_df['HIGH'] - v_df['HIGH'].shift(1)
    # 计算 LD
    v_df['LD'] = v_df['LOW'].shift(1) - v_df['LOW']
    # 计算 DMP
    v_df['DMP'] = df.apply(lambda x: x['HD'] if (x['HD'] > 0 and x['HD'] > x['LD']) else 0, axis=1).rolling(
        window=N).sum()
    # 计算 DMM
    v_df['DMM'] = df.apply(lambda x: x['LD'] if (x['LD'] > 0 and x['LD'] > x['HD']) else 0, axis=1).rolling(
        window=N).sum()
    # 计算 PDI、MDI 和 ADX
    v_df['PDI'] = v_df['DMP'] * 100 / v_df['MTR']
    v_df['MDI'] = v_df['DMM'] * 100 / v_df['MTR']
    v_df['DX'] = (v_df['PDI'] - v_df['MDI']).abs() / (v_df['PDI'] + v_df['MDI']) * 100
    v_df['ADX'] = v_df['DX'].rolling(window=M).mean()
    # 计算 ADXR
    v_df['ADXR'] = (v_df['ADX'] + v_df['ADX'].shift(M)) / 2
    # 删除中间计算用的列
    df.drop(['LOW', 'HL', 'HC', 'LC', 'MAX1', 'MAX2', 'HD', 'LD', 'DX'], axis=1, inplace=True)


DMI(df, 14, 6)
print(check_signal(df, day_index=-1))
相关推荐
DisonTangor2 分钟前
Windows 11将新增基于AI的搜索、生成式填充和其它AI功能
人工智能
soso19683 分钟前
【AI自然语言处理应用】通过API调用通义晓蜜CCAI-对话分析AIO应用
人工智能·自然语言·ccai
网安-搬运工6 分钟前
RAG再总结之如何使大模型更好使用外部数据:四个不同层级及查询-文档对齐策略
人工智能·自然语言处理·大模型·llm·大语言模型·ai大模型·rag
大模型八哥7 分钟前
大模型扫盲系列——大模型实用技术介绍(上)
人工智能·程序人生·ai·大模型·llm·llama·ai大模型
阿华的代码王国11 分钟前
【JavaEE】——文件IO的应用
开发语言·python
被制作时长两年半的个人练习生22 分钟前
【pytorch】权重为0的情况
人工智能·pytorch·深度学习
Elastic 中国社区官方博客37 分钟前
使用 Vertex AI Gemini 模型和 Elasticsearch Playground 快速创建 RAG 应用程序
大数据·人工智能·elasticsearch·搜索引擎·全文检索
电饭叔1 小时前
《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学
开发语言·python
说私域1 小时前
地理定位营销与开源AI智能名片O2O商城小程序的融合与发展
人工智能·小程序
Q_w77421 小时前
计算机视觉小目标检测模型
人工智能·目标检测·计算机视觉