Py学习  »  Python

Python资金流指标:基于【通达信】KDJ增强的量化指标源码学习

量化对冲套利 • 7 月前 • 199 次点击  

免费分享指标 不迷信指标 但为我所用

通达信指标安装技巧:

1、电脑端 打开通达信软件;点击“功能”-“公式系统”-“公式管理器”;选择“技术指标公式”-“新建”;填写名称并复制粘贴公式,填写必需的参数(如有);

2、点击右上角的”测试公式“对你的新增指标进行测试,测试结果会在最下方显示。测试通过的话,一定要记得去点击右上角的”确定“按钮,这样你的新增指标就完成了。


友情提示(指标只是辅助,不作建议) 

这个Python资金流指标:基于【通达信】KDJ增强的量化指标源码学习多个方面的Idea,给我们判断提供重要的方便

图一:指标全局分析图

一、指标核心用法

风险提示:本指标仅供技术研究与学习交流使用。市场具有高度不确定性,任何基于本指标的决策都需要自行承担风险,不构成任何投资建议。注意:本指标源码用于通达信,友情提示:代码较多。本号不推荐股票、不承诺收益、不接商务合作、不与任何机构或个人存在利益分成的原则,纯粹分享投资理念、市场分析和知识,所有内容仅供参考。本文所述模型算法仅限学术探讨,指标公式作为知识免费分享,"基于开源数据集的理论推演",仅用于学习交流。学术交流:我们专注于市场的学术交流与研究包括自用指标零滞后均线最速曲线,以及自动化程序量化学习。分享知识:感恩三田都元帅,心中有三田,生活一定甜,敬神常在,爱人如己,我为人人,与人为善,分享快乐!

二、指标图谱展示

图二:指标单品种示意图
图三:指标指数示范图

三、指标Python代码

安装依赖 pip install pandas numpy matplotlib
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import warnings
warnings.filterwarnings('ignore')

class LIJIN_Indicator:
    def __init__(self, data):
        """        
        Parameters:
        data: DataFrame, 包含OHLCV数据,列名需要为['open', 'high', 'low', 'close', 'volume']
        """

        self.data = data.copy()
        self.calculate_indicators()
    
    def calculate_kdj(self, n=9, m=3, t=3):
        """计算KDJ指标"""
        df = self.data.copy()
        
        # 计算RSV
        low_list = df['low'].rolling(window=n).min()
        high_list = df['high'].rolling(window=n).max()
        rsv = (df['close'] - low_list) / (high_list - low_list) * 100
        
        # 计算K, D, J
        df['K'] = rsv.ewm(com=m-1).mean()
        df['D'] = df['K'].ewm(com=m-1).mean()
        df['J'] = 3 * df['K'] - 2 * df['D']
        
        return df[ 'K'], df['D'], df['J']
    
    def calculate_indicators(self):
        """计算所有LIJIN指标"""
        df = self.data
        
        # 计算KDJ
        K, D, J = self.calculate_kdj(2733)
        
        # LIJIN_1: 如果KDJ.J < 0则为10,否则为0
        df['LIJIN_1'] = np.where(J 0100)
        
        # LIJIN_2: 9.9上穿LIJIN_1
        df['LIJIN_2'] = (df['LIJIN_1'].shift(1) > 9.9) & (df['LIJIN_1'] <= 9.9)
        
        # LIJIN_3: (2*收盘价+最高价+最低价)/4
        df['LIJIN_3'] = (2 * df['close'] + df['high'] + df['low']) / 4
        
        # LIJIN_4: 5日最低价
        df['LIJIN_4'] = df['low'].rolling(window=5).min()
        
        # LIJIN_5: 5日最高价
        df['LIJIN_5'] = df['high'].rolling(window=5).max()
        
        # LIJIN_6: 标准化后的EMA
        numerator = df['LIJIN_3'] - df['LIJIN_4']
        denominator = df['LIJIN_5'] - df['LIJIN_4']
        # 避免除零
        denominator = np.where(denominator == 01, denominator)
        df['LIJIN_6'] = (numerator / denominator * 100).ewm(span=5).mean()
        
        # LIJIN_7, LIJIN_9: 常数
        df['LIJIN_7'] = 1
        df['LIJIN_9'] = 1
        
        # LIJIN_8: LIJIN_6的2日移动平均
        df['LIJIN_8'] = df['LIJIN_6'].rolling(window=2).mean() * df['LIJIN_7']
        
        # AAA: 如果LIJIN_6 > LIJIN_8则取LIJIN_6,否则取LIJIN_8
        df['AAA'] = np.where(df['LIJIN_6'] > df['LIJIN_8'], df['LIJIN_6'], df['LIJIN_8'])
        
        # LIJIN_10: LIJIN_6 > LIJIN_8且前一日LIJIN_6 < 30
        df['LIJIN_10'] = (df['LIJIN_6'] > df['LIJIN_8']) & (df[ 'LIJIN_6'].shift(1) 30)
        
        # LIJIN_11: 过滤条件
        df['LIJIN_11'] = df['LIJIN_10']
        
        # LIJIN_12: 如果KDJ.J > 100则为90,否则为100
        df['LIJIN_12'] = np.where(J > 10090100)
        
        # LIJIN_13: LIJIN_6 > LIJIN_8且前一日LIJIN_6 > 70
        df['LIJIN_13'] = (df['LIJIN_6'] > df['LIJIN_8']) & (df['LIJIN_6'].shift(1) > 70)
        
        # LIJIN_14: LIJIN_13的条件
        df['LIJIN_14'] = df['LIJIN_13']
        
        self.data = df
    
    def plot_indicator(self, start_date=None, end_date=None, figsize=(1210)):
        """绘制LIJIN指标图"""
        df = self.data.copy()
        
        if start_date and end_date:
            df = df.loc[start_date:end_date]
        
        fig, (ax1, ax2) = plt.subplots(21, figsize=figsize, height_ratios=[21])
        
        # 绘制价格和LIJIN指标
        ax1.plot(df.index, df['LIJIN_6'], label='LIJIN_6', color='blue', linewidth=1.5)
        ax1.plot(df.index, df['LIJIN_8'], label='LIJIN_8', color='orange', linewidth=1.5)
        ax1.plot(df.index, df['AAA'], label='AAA', color='red', linewidth=1)
        
        # 绘制柱状图
        # 红色柱子: LIJIN_6 > LIJIN_8
        red_condition = df['LIJIN_6'] > df['LIJIN_8']
        for i, (idx, row) in enumerate(df.iterrows()):
            if red_condition.loc[idx]:
                ax1.bar(i, row['LIJIN_6'] - row['LIJIN_8'], 
                       bottom=row['LIJIN_8'], color='red', alpha=0.6, width=0.8)
        
        yellow_condition1 = df['LIJIN_2']  # CROSS(9.9, LIJIN_1)
        yellow_condition2 = df['LIJIN_10']  # LIJIN_6 > LIJIN_8且前一日<30
        
        for i, (idx, row) in enumerate(df.iterrows()):
            if  yellow_condition1.loc[idx]:
                ax1.bar(i, 5, bottom=row['LIJIN_6'], color='yellow', alpha=0.8, width=0.8)
            if yellow_condition2.loc[idx]:
                ax1.bar(i, 5, bottom=row['LIJIN_6'], color='yellow', alpha=0.8, width=0.8)
        
        green_condition1 = (df['LIJIN_12'] > 99.9)  # CROSS(LIJIN_12, 99.9)
        green_condition2 = df['LIJIN_13']  # LIJIN_6 > LIJIN_8且前一日>70
        
        for i, (idx, row) in enumerate(df.iterrows()):
            if green_condition1.loc[idx]:
                ax1.bar(i, -5, bottom=row['LIJIN_6'], color='green', alpha=0.8, width=0.8)
            if green_condition2.loc[idx]:
                ax1.bar(i, -5, bottom=row['LIJIN_6'], color='green', alpha=0.8, width=0.8)
        
        # 绘制水平线
        ax1.axhline(y=20, color='green', linestyle='--', alpha=0.7, label='20 Level')
        ax1.axhline(y=50, color='green', linestyle='--', alpha=0.7, label='50 Level')
        ax1.axhline(y=80, color='green', linestyle='--', alpha=0.7, label='80 Level')
        
        ax1.set_title('LIJIN Indicator', fontsize=14, fontweight='bold')
        ax1.set_ylabel('LIJIN Value')
        ax1.legend()
        ax1.grid(True, alpha=0.3)
        
        # 绘制价格图表
        ax2.plot(df.index, df['close'], label='Close Price', color='black', linewidth=1.5)
        
        buy_signals = df[df['buy_signal']]
        sell_signals = df[df['sell_signal']]
        
        ax2.scatter(buy_signals.index, buy_signals['close'], 
                   color='red', marker='^', s=100, label='Buy Signal', zorder=5)
        ax2.scatter(sell_signals.index, sell_signals['close'], 
                   color='green', marker='v', s=100, label='Sell Signal', zorder= 5)
        
        ax2.set_title('Price with Trading Signals', fontsize=14, fontweight='bold')
        ax2.set_ylabel('Price')
        ax2.set_xlabel('Date')
        ax2.legend()
        ax2.grid(True, alpha=0.3)
        
        plt.tight_layout()
        plt.show()
        
        return fig

四、指标公式源代码

LIJIN_1:=IF(KDJ.J(27,3,3)<0,10,0);LIJIN_2:=CROSS(9.9,LIJIN_1);LIJIN_3:=(2*CLOSE+HIGH+LOW)/4;LIJIN_4:=LLV(LOW,5);LIJIN_5:=HHV(HIGH,5);LIJIN_6:=EMA((LIJIN_3-LIJIN_4)/(LIJIN_5-LIJIN_4)*100,5);LIJIN_7:=1;LIJIN_8:=MA(LIJIN_6,2)*LIJIN_7;AA:STICKLINE(LIJIN_6>LIJIN_8,LIJIN_6,LIJIN_8,3,1)*LIJIN_7,COLORRED;LIJIN_9:=1;AAA:IF(LIJIN_6>LIJIN_8,LIJIN_6,LIJIN_8),COLORRED;LIJIN_10:=STICKLINE(LIJIN_6>LIJIN_8&&REF(LIJIN_6,1)<30,LIJIN_6,LIJIN_8,3,1);STICKLINE(LIJIN_6<=LIJIN_8,LIJIN_6,LIJIN_8,3,1)*LIJIN_9,COLORFFCC66;DRAWICON(CROSS(9.9,LIJIN_1),LIJIN_6-12,5)*LIJIN_9;STICKLINE(CROSS(9.9,LIJIN_1),LIJIN_6+5,LIJIN_8-4,3,1)*LIJIN_9,COLORYELLOW;LIJIN_11:=STICKLINE(LIJIN_10,LIJIN_6+5,LIJIN_8-4,3,1)*LIJIN_7;STICKLINE(FILTER(LIJIN_11,5),LIJIN_6+5,LIJIN_8-4,3,1)*LIJIN_9,COLORYELLOW;V20:20,COLORGREEN;V50:50,COLORGREEN;V80:80,COLORGREEN;LIJIN_12:=IF(KDJ.J(27,3,3)>100,90,100);DRAWICON(CROSS(LIJIN_12,99.900002),LIJIN_6+12,6)*LIJIN_7;LIJIN_13:=LIJIN_6>LIJIN_8&&REF(LIJIN_6,1)>70;STICKLINE(CROSS(LIJIN_12,99.900002),LIJIN_6,LIJIN_8-9,3,1)*LIJIN_7,COLORGREEN;LIJIN_14:=STICKLINE(LIJIN_13,LIJIN_6+5,LIJIN_8-4,3,1);STICKLINE(FILTER(LIJIN_14,5),LIJIN_6+5,LIJIN_8-4,3,1),COLORGREEN;DRAWICON(FILTER(LIJIN_10,5),LIJIN_6-8,1);DRAWICON(FILTER(LIJIN_13,5),LIJIN_6+8,2);

风险提示:这个指标仅提供技术研究和学习交流使用。市场有很强的不确定性,基于指标的决策判断都要小心谨慎,且需要自行承担风险,不构成任何投资建议。

打开图片—长按—翻译(中文)

深圳指数日线人工智能/机器学习

上证指数日线人工智能/机器学习

科创板指日线人工智能/机器学习

创业板指日线人工智能/机器学习

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/189710