Py学习  »  Python

Python编程通达信:二板爆量涨停指标公式学习

量化对冲套利 • 9 月前 • 497 次点击  

今天随手写一个指标,我写的这个Python编程通达信:二板爆量涨停指标公式学习,本质上是在尝试捕捉市场中的多空能量转换.你看那些红红绿绿的K线和标记,背后其实是一套试图理解价格行为的逻辑.不是说它能预测未来,而是通过一系列算法把市场当下的状态给你可视化出来.

一、指标解析

比如开头那个其实就是MACD里的快慢线差值.但我没直接用MACD,而是把它拆开作为基础元件.为什么?因为后续很多判断需要更底层的价格信息.这就像做菜不只买成品酱料,而是自己调香料,控制精度更高.

其中的加权平均算法挺有意思.它不是简单的移动平均,而是给近期价格更高的权重,越往历史追溯权重越低.这种算法对近期价格变动更敏感,相当于给最近20天的价格做了个带记忆衰减的平滑处理.我见过很多人用EMA,但这种递减权重的设计其实更符合市场参与者对信息的记忆规律——越近的事记得越清楚嘛.

判断趋势的部分其实用了多重确认机制.比如那一长串条件,是在识别连续上涨中的各种小回调形态.别看条件多,本质上是在捕捉“上涨途中该弱不弱”的状态.就像看一个人是不是真强壮,不是看他某天表现,而是连续观察他生病时的恢复速度.

二、指标核心

最核心的是那个价格动量判断.交叉,其实是短期动量和长期动量的比较.但有意思的是,我把斜率直接加权到价格里去了——这不是简单的均线交叉,而是把趋势加速度也考虑进去了.好比不仅看车速,还看油门踩的深度.

波动率自适应那块可能最值得细说.其实是根据市场波动程度动态调整均线参数.市场震荡大的时候,均线会变得更平滑;趋势明显时,均线会紧跟价格.这种自适应机制比固定参数更符合实际交易环境.就像开车时根据路况自动调整悬挂软硬,不是永远一个模式.

那些“启爆”“超牛”的标记点,其实是多重条件共振的结果.比如需要同时突破动量线和成交量异常放大,不是简单看价格创新高.我刻意设了比较严格的阈值,避免信号太过频繁.好的指标应该像经验丰富的老猎人,大部分时间安静观察,只在真正机会出现时才提醒.

其实最费心思的是视觉呈现.为什么有些线用红色有些用黄色?为什么有些信号用图标有些用文字?这是根据信号的重要性层级设计的.核心趋势用粗线,过滤信号用点线,异常波动用特殊标记——整个版面信息量很大,但遵循视觉优先级的原则.

我觉得写指标就像作曲.每个算法模块是不同的乐器,单独听可能平平无奇,但组合起来就能呈现市场的多声部交响.重要的是保持各部分的和谐,而不是追求某个指标的极致表现.

三、指标特色

这个指标最大的特点可能是它试图同时捕捉趋势和转折.大部分指标要么擅长跟踪趋势,要么擅长发现反转,但这个体系试图兼顾两者.通过不同时间维度的算法组合,既看大方向又抓小波动.就像既用望远镜观察远山,又用显微镜分析路面.

实际使用中会发现,它在趋势明朗时表现最好,震荡市难免会有假信号.这也是所有趋势跟踪类指标的共性局限.所以我加入了那么多过滤条件,不是要消除假信号,而是让信号质量更高些.


Python源码


import pandas as pd
import numpy as np

def calculate_ai_indicators(df):
    df = df.copy()
    df['AI1'] = df['close'].ewm(span=12).mean() - df['close'].ewm(span=26).mean()  # MACD类似物
    df['AI2'] = df['close'].rolling(window=3).mean()  # 3日移动平均
    # 加权价格
    df['AI3'] = (3 * df['close'] + df['low'] + df['open'] + df['high']) / 6
    
    # 20日加权移动平均
    weights = list(range(200-1))
    total_weight = sum(weights)
    
    ai4_values = []
    for i in range(len(df)):
        if i 20:
            ai4_values.append(np.nan)
        else:
            weighted_sum = 0
            for j in range(20):
                weighted_sum += weights[j] * df['AI3'].iloc[i - j]
            ai4_values.append(weighted_sum / total_weight)
    
    df['AI4'] = ai4_values
    
    # 5日移动平均
    df['AI5'] = df['AI4'].rolling(window=5).mean()
    
    # 条件指标
    df['AI6'] = np.where(df['AI2'] <= df['AI4'], df['AI5'], np.nan)
    
    # 短期和长期EMA
    df['AI33'] = df['close'].ewm(span=2).mean()  # 短期EMA
    
    # 计算斜率指标
    def calculate_slope(series, window):
        slopes = [np.nan] * (window - 1)
        for i in range(window - 1, len(series)):
            y = series[i - window +  1:i + 1]
            x = np.arange(window)
            slope = np.polyfit(x, y, 1)[0]
            slopes.append(slope)
        return slopes
    
    slopes = calculate_slope(df['close'].values, 21)
    
    return df

if __name__ == "__main__":
    dates = pd.date_range('2023-01-01', periods=100)
    np.random.seed(42)
    data = {
        'open': np.random.rand(100) * 100 + 100,
        'high': np.random.rand(100) * 10 + 110,
        'low': np.random.rand(100) * 10 + 90,
        'close': np.random.rand(100) * 10 + 100,
        'volume': np.random.randint(100010000100)
    }
    
    df = pd.DataFrame(data, index=dates)
    
    # 计算AI指标
    result_df = calculate_ai_indicators(df)
    
    # 打印结果
    print("AI量化指标计算结果:")
    print(result_df.tail())
    import matplotlib.pyplot as plt

    plt.figure(figsize=(128))
    plt.subplot(211)
    plt.plot(result_df.index, result_df['close'], label='Close Price')
    plt.plot(result_df.index, result_df['AI4'], label='AI4 (Weighted MA)')
    plt.plot(result_df.index, result_df['AI5'], label='AI5 (MA of AI4)')
    plt.title('Price and AI Indicators')
    plt.legend()

四、指标总结

最后要说的是,任何指标都是对市场的算法建模.这个模型包含了我对市场的理解:价格运动不是随机的,而是存在某种程度的记忆性和惯性;不同时间周期的能量会相互影响;市场情绪的转换需要过程而非瞬间完成.这些理解都体现在算法设计里.

指标就像是一套专业的渔具,能不能钓到鱼还得看水域情况和钓鱼技术.但好的渔具确实能提高成功概率,至少不会让你错过明明已经上钩的鱼.

风险提示:本指标 仅供技术研究与学习交流使用。市场具有高度不确定性,任何基于本指标的决策都需要自行承担风险,不构成任何投资建议。


指标源码


AI量化1:=EMA(CLOSE,12)-EMA(CLOSE,26);AI量化2:=MA(C,3);AI量化3:=(3*C+L+O+H)/6;AI量化4:(20*AI量化3+19*REF(AI量化3,1)+18*REF(AI量化3,2)+17*REF(AI量化3,3)+16*REF(AI量化3,4)+15*REF(AI量化3,5)+14*REF(AI量化3,6)+13*REF(AI量化3,7)+12*REF(AI量化3,8)+11*REF(AI量化3,9)+10*REF(AI量化3,10)+9*REF(AI量化3,11)+8*REF(AI量化3,12)+7*REF(AI量化3,13)+6*REF(AI量化3,14)+5*REF(AI量化3,15)+4*REF(AI量化3,16)+3*REF(AI量化3,17)+2*REF(AI量化3,18)+REF(AI量化3,20))/210,COLORRED;AI量化5:MA(AI量化4,5),COLORYELLOW,LINETHICK4,POINTDOT;AI量化6:IF(AI量化2<=AI量化4,AI量化5,DRAWNULL),COLORRED,LINETHICK4,POINTDOT;AI量化7:=(C>REF(C,1)&&C>REF(C,2));AI量化8:=(REF(AI量化7,1)&&C<=REF(C,1)&&C>=REF(C,2));AI量化9:=(REF(AI量化8,1)&&C>=REF(C,1)&&C<=REF(C,2));AI量化10:=(REF(AI量化9,1)&&C<=REF(C,1)&&C>=REF(C,2));AI量化11:=(REF(AI量化10,1)&&C>=REF(C,1)&&C<=REF(C,2));AI量化12:=(REF(AI量化11,1)&&C<=REF(C,1)&&C>=REF(C,2));AI量化13:=(REF(AI量化12,1)&&C>=REF(C,1)&&C<=REF(C,2));AI量化14:=(REF(AI量化13


    
,1)&&C<=REF(C,1)&&C>=REF(C,2));AI量化15:=(REF(AI量化14,1)&&C>=REF(C,1)&&C<=REF(C,2));AI量化16:=(REF(AI量化15,1)&&C<=REF(C,1)&&C>=REF(C,2));AI量化17:=(REF(AI量化16,1)&&C>=REF(C,1)&&C<=REF(C,2));AI量化18:=(REF(AI量化17,1)&&C<=REF(C,1)&&C>=REF(C,2));AI量化19:IF(AI量化7||AI量化8||AI量化9||AI量化10||AI量化11||AI量化12||AI量化13||AI量化14||AI量化15||AI量化16||AI量化17||AI量化18,AI量化4,DRAWNULL),COLORRED,LINETHICK1;AI量化20:=(C1)&&C2));AI量化21:=(REF(AI量化20,1)&&C>=REF(C,1)&&C<=REF(C,2));AI量化22:=(REF(AI量化21,1)&&C<=REF(C,1)&&C>=REF(C,2));AI量化23:=(REF(AI量化22,1)&&C>=REF(C,1)&&C<=REF(C,2));AI量化24:=(REF(AI量化23,1)&&C<=REF(C,1)&&C>=REF(C,2));AI量化25:=(REF(AI量化24,1)&&C>=REF(C,1)&&C<=REF(C,2));AI量化26:=(REF(AI量化25,1)&&C<=REF(C,1)&&C>=REF(C,2));AI量化27:=(REF(AI量化26,1)&&C>=REF(C,1)&&C<=REF(C,2));AI量化28:=(REF(AI量化27,1)&&C<=REF(C,1)&&C>=REF(C,2));AI量化29:=(REF(AI量化28,1)&&C>=REF(C,1)&&C<=REF(C,2));AI量化30:=(REF(AI量化29,1)&&C<=REF(C,1)&&C>=REF(C,2));AI量化31:=(REF(AI量化30,1)&&C>=REF(C,1)&&C<=REF(C,2));AI量化32:IF(AI量化20||AI量化21||AI量化22||AI量化23||AI量化24||AI量化25||AI量化26||AI量化27||AI量化28||AI量化29||AI量化30||AI量化31,AI量化4,DRAWNULL),COLORGREEN,LINETHICK1;AI量化33:=EMA(C,2);AI量化34:=EMA(SLOPE(C,21)*20+C,42);AI量化35:=ABS((2*CLOSE+HIGH+LOW)/4-MA(CLOSE,30))/MA(CLOSE,30);AI量化36:=DMA((2*CLOSE+LOW+HIGH)/4,AI量化35),LINETHICK3,COLORRED;AI量化37:=(CLOSE/AI量化36);AI量化38:=MA(AI量化37*(2*CLOSE+HIGH+LOW)/4,3);AI量化39:=((AI量化38-AI量化36)/AI量化36)/3;AI量化40:=AI量化38-AI量化39*AI量化38;AI量化41:=CROSS(AI量化33,AI量化34);AI


    
量化42:=CROSS(AI量化34,AI量化33);STICKLINE(AI量化33>=AI量化34,LOW,HIGH,0.0,1),COLORRED;STICKLINE(AI量化33>=AI量化34,CLOSE,OPEN,3,1),COLORRED;STICKLINE(AI量化3334,LOW,HIGH,0.0,1),COLORGREEN;STICKLINE(AI量化3334,CLOSE,OPEN,3,1),COLORGREEN;STICKLINE(AI量化41,OPEN,CLOSE,2,0),COLORYELLOW;STICKLINE(AI量化42,OPEN,CLOSE,2,0),COLORBLUE;AI量化43:=MA(CLOSE,9),COLORCYAN,LINETHICK1;AI量化44:=MA(CLOSE,18),COLORMAGENTA;AI量化45:=VOL>=REF(V,1)*1.91&&C>REF(C,1)*1.01;AI量化46:=SUMBARS(FILTER(AI量化45,3),1);AI量化47:=EMA(CLOSE,12)-EMA(CLOSE,26);AI量化48:=EMA(AI量化47,9);AI量化49:=(AI量化47-AI量化48)*2;AI量化50:=(AI量化47-AI量化48)*2*60;AI量化51:=CROSS(AI量化50-REF(AI量化50,1),15);STICKLINE(AI量化51,O,C,2.5,0),COLORYELLOW;DRAWTEXT(AI量化51,(O+H)/2,'↖起爆'),COLORCYAN,LINETHICK2;AI量化52:=MA(C,5);AI量化53:=MA(C,10);AI量化54:=MA(C,21);AI量化55:=MA(C,60);AI量化56:=MA((L+H+C)/3,5);AI量化57:=HHV(AI量化56,60);AI量化58:=CLOSE*VOL;AI量化59:=EMA((EMA(AI量化58,3)/EMA(VOL,3)+EMA(AI量化58,6)/EMA(VOL,6)+EMA(AI量化58,12)/EMA(VOL,12)+EMA(AI量化58,24)/EMA(VOL,24))/4,13);AI量化60:=1.06*AI量化59;AI量化61:=1.13*AI量化59;AI量化62:=REF(C,1)*1.1-C<0.01&&H=C;AI量化63:=CROSS(C,AI量化60)&&AI量化62;DRAWTEXT(AI量化63,L*0.85,'启爆'),COLORYELLOW;DRAWICON(AI量化63,L*0.90,24);DRAWICON(AI量化63,L*0.92,25);DRAWICON(AI量化63,L*0.94,26);AI量化64:=CROSS(C,AI量化61)&&AI量化62;DRAWTEXT(AI量化64,L*0.98,'超牛'),COLORRED;STICKLINE(AI量化64,O,C,2.5


    
,0),COLORRED;AI量化65:=MA(C,20);AI量化66:=AI量化65+2*STD(C,20);AI量化67:=AI量化65-2*STD(C,20);AI量化68:=CROSS(C,AI量化66)&&C/REF(C,1)>1.05;DRAWTEXT(AI量化68,L-1.15,'大黑马'),COLORYELLOW;

注意本指标源码用于通达信,友情提示:代码较多。本文所述模型算法仅限学术探讨,指标公式作为知识免费分享,"基于开源数据集的理论推演",仅用于学习交流。



学习分享



学术交流我们专注于市场的学术交流与研究包括自用指标零滞后均线最速曲线,以及自动化程序量化学习。
图片
图片
分享知识:感恩三田都元帅,心中有三田,生活一定甜,敬神常在,爱人如己,我为人人,与人为善,分享快乐!

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