公司网站制作平台,网址提交收录,农药放行单在哪个网站做,seo建设网站Python实现DMI工具判断信号#xff1a;股票技术分析的工具系列#xff08;3#xff09; 介绍算法解释 代码rolling函数介绍完整代码 介绍
先看看官方介绍#xff1a; DMI (趋向指标#xff09; 用法 1.PDI线从下向上突破MDI线#xff0c;显示有新多头进场#xff0c;为… Python实现DMI工具判断信号股票技术分析的工具系列3 介绍算法解释 代码rolling函数介绍完整代码 介绍
先看看官方介绍 DMI (趋向指标 用法 1.PDI线从下向上突破MDI线显示有新多头进场为买进信号 2.PDI线从上向下跌破MDI线显示有新空头进场为卖出信号 3.ADX值持续高于前一日时市场行情将维持原趋势 4.ADX值递减降到20以下且横向行进时市场气氛为盘整 5.ADX值从上升倾向转为下降时表明行情即将反转。 算法解释
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(HD0 AND HDLD,HD,0),N);
DMM: SUM(IF(LD0 AND LDHD,LD,0),N);
PDI: DMP*100/MTR;
MDI: DMM*100/MTR;
ADX: MA(ABS(MDI-PDI)/(MDIPDI)*100,M);
ADXR:(ADXREF(ADX,M))/2;优势
优势描述清晰的买卖信号当PDI线从下向上突破MDI线时显示有新多头进场为买进信号而当PDI线从上向下跌破MDI线时显示有新空头进场为卖出信号提供了明确的交易信号。确定趋势强度ADX值持续高于前一日时表明市场行情将维持原趋势有助于投资者确认趋势的持续性为持仓决策提供参考。识别盘整行情当ADX值递减并降到20以下并且横向行进时表明市场处于盘整状态这对于那些偏好在趋势不明朗时选择观望或进行波段交易的投资者是有帮助的。
劣势
劣势描述滞后性DMI指标可能会出现滞后现象尤其是在市场行情急剧变化时指标可能无法及时反应新的市场趋势导致错过买卖时机。假信号尽管DMI指标提供了明确的买卖信号但在市场波动较大或盘整时可能会出现假信号导致交易损失。需要结合其他指标DMI指标虽然提供了趋势方向和趋势强度的信息但并不能覆盖市场的所有方面因此投资者在使用时需要结合其他指标和分析方法进行综合判断。
代码
rolling函数介绍
rolling 函数通常与其他函数如 mean、sum、std 等一起使用以计算滚动统计量例如滚动均值、滚动总和等。
以下是 rolling 函数的基本语法
DataFrame.rolling(window, min_periodsNone, centerFalse, win_typeNone, onNone, axis0, closedNone)window: 用于计算统计量的窗口大小。min_periods: 每个窗口最少需要的非空观测值数量。center: 确定窗口是否居中默认为 False。win_type: 窗口类型例如 None、boxcar、triang 等默认为 None。on: 在数据帧中执行滚动操作的列默认为 None表示对整个数据帧执行操作。axis: 执行滚动操作的轴默认为 0表示按列执行操作。closed: 确定窗口的哪一端是闭合的默认为 None。
完整代码
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指标的DataFrameday_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 signaldef DMI(v_df, N, M):计算DMI指标参数v_df: pandas.DataFrame包含股票数据的DataFrameN: int计算MTR和移动平均的窗口大小M: int计算ADX的平滑窗口大小返回无结果直接存储在输入的DataFrame中# 计算 MTRv_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(axis1)v_df[MAX2] v_df[[MAX1, LC]].max(axis1)v_df[MTR] v_df[MAX2].rolling(windowN).sum()# 计算 HDv_df[HD] v_df[HIGH] - v_df[HIGH].shift(1)# 计算 LDv_df[LD] v_df[LOW].shift(1) - v_df[LOW]# 计算 DMPv_df[DMP] df.apply(lambda x: x[HD] if (x[HD] 0 and x[HD] x[LD]) else 0, axis1).rolling(windowN).sum()# 计算 DMMv_df[DMM] df.apply(lambda x: x[LD] if (x[LD] 0 and x[LD] x[HD]) else 0, axis1).rolling(windowN).sum()# 计算 PDI、MDI 和 ADXv_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]) * 100v_df[ADX] v_df[DX].rolling(windowM).mean()# 计算 ADXRv_df[ADXR] (v_df[ADX] v_df[ADX].shift(M)) / 2# 删除中间计算用的列df.drop([LOW, HL, HC, LC, MAX1, MAX2, HD, LD, DX], axis1, inplaceTrue)DMI(df, 14, 6)
print(check_signal(df, day_index-1))