Py学习  »  Python

通达信指标解析与Python重构:构建情绪反转因子公式学习

量化对冲套利 • 4 天前 • 50 次点击  

今天随手写一个副图指标,这个通达信Python多因子量化分析,市场情绪反转指标公式是融合了动态市场情绪与数十种指标因子结合体目的是多元化的展现市场极端情绪的位置,帮助我们更理性的对待市场波动。

Python源代码完整分享
import pandas as pd
import numpy as np

def calculate_technical_indicators(df):
    """
    计算通达信指标解析与Python重构:构建情绪反转因子公式学习
    """

    # 参数设置
    短期周期 = 6
    中期周期 = 12
    CCI周期 = 14
    随机周期 = 9
    RSI平滑周期1 = 3
    RSI平滑周期2 = 3
    BIAS周期 = 6
    
    # 复制数据框以避免修改原始数据
    data = df.copy()
    
    # 计算MACD指标
    data['EMA12'] = data['close'].ewm(span=12).mean()
    data['EMA26'] = data['close'].ewm(span=26).mean()
    data['离差值'] = data['EMA12'] - data['EMA26']
    data['讯号线'] = data['离差值'].ewm(span=9).mean()
    data['MACD柱状线'] = (data['离差值'] - data['讯号线']) * 2
    
    # 计算随机KD指标
    data['最低最低价'] = data['low'].rolling(window=随机周期).min()
    data['最高最高价'] = data['high'].rolling(window=随机周期).max()
    data['随机原始值'] = (data['close'] - data['最低最低价']) / (data['最高最高价'] - data['最低最低价']) * 100
    data['随机K值'] = data['随机原始值'].rolling(window=RSI平滑周期1).mean()
    data['随机D值'] = data['随机K值'].rolling(window=RSI平滑周期2).mean()
    data[ '随机J值'] = 3 * data['随机K值'] - 2 * data['随机D值']
    
    # 计算CCI指标
    data['典型价'] = (data['high'] + data['low'] + data['close']) / 3
    data['典型价MA'] = data['典型价'].rolling(window=CCI周期).mean()
    data['平均绝对偏差'] = data['典型价'].rolling(window=CCI周期).apply(lambda x: np.mean(np.abs(x - np.mean(x))))
    data['CCI指标'] = (data['典型价'] - data['典型价MA']) / (0.015 * data['平均绝对偏差'])
    
    # 计算RSI指标
    data['昨收价'] = data['close'].shift(1)
    data['价格变动'] = data['close'] - data['昨收价']
    data['上涨幅度'] = np.where(data['价格变动'] > 0, data['价格变动'], 0)
    data['下跌幅度'] = np.where(data['价格变动'] 0, np.abs(data['价格变动']), 0)
    
    data['RSI短期_上涨'] = data['上涨幅度'].rolling(window=短期周期).mean()
    data['RSI短期_下跌'] = data['下跌幅度'].rolling(window=短期周期).mean()
    data['RSI短期'] = data['RSI短期_上涨'] / data['RSI短期_下跌'] * 100
    
    data['RSI中期_上涨'] = data['上涨幅度'].rolling(window=中期周期).mean()
    data['RSI中期_下跌'] = data['下跌幅度'].rolling(window=中期周期).mean()
    data['RSI中期'] = data['RSI中期_上涨'] / data['RSI中期_下跌'] * 100
    
    # 计算威廉指标
    data['10日最高价'] = data['high'].rolling(window=10).max()
    data['10日最低价'] = data['low'].rolling(window=10).min()
    data['威廉指标'] = 100 * (data['10日最高价'] - data['close']) / (data['10日最高价'] - data['10日最低价'])
    
    # 计算乖离率
    data['MA_BIAS'] = data['close'].rolling(window=BIAS周期).mean()
    data['乖离率'] = (data['close'] - data['MA_BIAS']) / data['MA_BIAS'] * 100
    
     # 计算ADX指标
    data['TR'] = np.maximum(
        data['high'] - data['low'],
        np.maximum(
            np.abs(data['high'] - data['close'].shift(1)),
            np.abs(data['low'] - data['close'].shift(1))
        )
    )
    data['真实波幅'] = data['TR'].rolling(window=CCI周期).sum()
    
    data['最高差'] = data['high'] - data['high'].shift(1)
    data['最低差'] = data['low'].shift(1) - data['low']
    
    data['上升方向量'] = np.where(
        (data['最高差'] > 0) & (data['最高差'] > data['最低差']),
        data['最高差'],
        0
    )
    data['上升方向量'] = data['上升方向量'].rolling(window=CCI周期).sum()
    
    data['下降方向量'] = np.where(
        (data['最低差'] > 0) & (data['最低差'] > data['最高差']),
        data['最低差'],
        0
    )
    data['下降方向量'] = data['下降方向量'].rolling(window=CCI周期).sum()
    
    data['上升方向线'] = data['上升方向量'] * 100 / data['真实波幅']
    data['下降方向线'] = data['下降方向量'] * 100 / data['真实波幅']
    
    data['DX'] = np.abs(data['下降方向线'] - data['上升方向线']) / (data['下降方向线'] + data['上升方向线']) * 100
    data['平均趋向指数'] = data['DX'].rolling(window=CCI周期).mean()
    data['趋向指数均值'] = (data['平均趋向指数'] + data['平均趋向指数'].shift(CCI周期)) / 2
    
    # 计算资金流量指标
    data['资金流典型价'] = (data['high'] + data['low'] + data['close']) / 3
    data['资金流额'] = data['资金流典型价'] * data['volume']
    
    data['资金流正'] = np.where(
        data['资金流典型价'] > data['资金流典型价'].shift(1),
        data['资金流额'],
        0
    )
    data['资金流正和'] = data['资金流正'].rolling(window=CCI周期).sum()
    
    data['资金流负'] = np.where(
        data['资金流典型价'] < data['资金流典型价'].shift(1),
        data['资金流额'],
        0
    )
    data['资金流负和'] = data['资金流负'].rolling(window=CCI周期).sum()
    
    data['资金流量比'] = data['资金流正和'] / data['资金流负和']
    data['资金流量指标'] = 100 - (100 / (1 + data['资金流量比']))
    
    # 计算动态买卖气指标
    data['动态买方'] = np.where(
        data['open'] <= data['open'].shift(1),
        0,
        np.maximum(data['high'] - data['open'], data['open'] - data['open'].shift(1))
    )
    data['动态卖方'] = np.where(
        data['open'] >= data['open'].shift(1),
        0,
        np.maximum(data['open'] - data['low'], data['open'].shift(1) - data['open'])
    )
    
    data['动态买方和'] = data['动态买方'].rolling(window=23).sum()
    data['动态卖方和'] = data['动态卖方'].rolling(window=23).sum()
    
    data['动态买卖气'] = np.where(
        data['动态买方和'] > data['动态卖方和'],
        (data['动态买方和'] - data['动态卖方和']) / data['动态买方和'],
        np.where(
            data['动态买方和'] == data['动态卖方和'],
            0,
            (data['动态买方和'] - data['动态卖方和']) / data['动态卖方和']
        )
    )
    
    # 计算动量指标
    data['动量线'] = data['close'] - data['close'].shift(20)
    data['动量均线'] = data['动量线'].rolling(window=60).mean()
    
    # 计算震荡量指标
    data['MA20'] = data['close' ].rolling(window=20).mean()
    data['震荡量'] = 100 * (data['close'] - data['MA20'])
    data['震荡均线'] = data['震荡量'].ewm(span=6).mean()
    
    # 计算多空线指标
    data['多空价'] = (3 * data['close'] + data['low'] + data['open'] + data['high']) / 6
    
    # 计算加权多空线
    weights = np.array([2019181716151413121110987654321])
    for i in range(len(data)):
        if i >= 20:
            window = data['多空价'].iloc[i-20:i]
            data.loc[data.index[i], '多空线'] = np.sum(weights * window.values) / 210
        else:
            data.loc[data.index[i], '多空线'] = np.nan
    
    data['多空均线'] = data['多空线'].rolling(window=20).mean()
    
    # 计算通达信指标解析与Python重构:构建情绪反转因子公式学习所有条件
    data['条件1'] = (data['离差值'] > data['讯号线']) & (data['离差值'].shift(1) <= data['讯号线'].shift(1))
    data['条件2'] = (data['随机K值'] > data['随机D值']) & (data['随机K值'].shift(1) <= data['随机D值'].shift(1)) & (data['随机K值'] -20)
    data['条件3'] = (data['CCI指标'] -90) & (data['CCI指标'] > -100)
    data['条件4'] = (data['RSI短期'] > data['RSI中期']) & (data['RSI短期'].shift(1) <= data['RSI中期'].shift(1)) & (data['RSI短期'] 50)
    data['条件5'] = (data['威廉指标'].shift(1) > 90) & (data['威廉指标'] 70)
    data['条件6'] = (data['乖离率'] > -5) & (data['乖离率'].shift(1) <= -5)
    
    data['条件7'] = (
        (data['上升方向线'].shift(1) < data['下降方向线'].shift(1)) &
        (data['上升方向线'].shift(1) < data['平均趋向指数'].shift(1)) &
        (data['上升方向线'].shift(1) < data['趋向指数均值'].shift(1)) &
        (data['上升方向线'] > data['下降方向线']) &
        (data['上升方向线'] > data['平均趋向指数']) &
        (data['上升方向线'] > data['趋向指数均值'])
    )
    
    data['条件8'] = (data['资金流量指标'] > 20) & (data['资金流量指标'].shift(1) <= 20)
    data['条件9'] = (data['动量线'] > data['动量均线']) & (data['动量线'].shift(1) <= data['动量均线'].shift(1))
    data['条件10'] = data['动态买卖气'] -0.8
    
    # 计算所有W组合条件
    conditions = [
        '条件1''条件2''条件3''条件4''条件5'
        '条件6''条件7''条件8''条件9''条件10'
    ]
    
    # 生成所有可能的3条件组合
    from itertools import combinations
    w_conditions = []
    for i, combo in enumerate(combinations(conditions, 3), 1):
        w_name = f'W{i}'
        data[w_name] = data[combo[0]] & data[combo[1]] & data[combo[2]]
        w_conditions.append(w_name)
    
    # 计算信号条件
    data['信号条件'] = False
    for w in w_conditions:
        data[ '信号条件'] = data['信号条件'] | data[w]
    
    # 生成信号值
    data['信号值'] = np.where(data['信号条件'], 10)
    
    # 计算趋势指标
    data['HHV55'] = data['high'].rolling(window=55).max()
    data['LLV55'] = data['low'].rolling(window=55).min()
    data['RSV'] = (data['close'] - data['LLV55']) / (data['HHV55'] - data['LLV55']) * 100
    data['SMA1'] = data['RSV'].rolling(window=5).mean()
    data['SMA2'] = data['SMA1'].rolling(window=3).mean()
    data['趋势赋值'] = 3 * data['SMA1'] - 2 * data['SMA2']
    data['趋势线'] = data['趋势赋值'].ewm(span=3).mean() - 10
    
    # 计算火焰山指标
    data['近期最低'] = data['low'].rolling(window=30).min()
    data['波动幅度'] = np.abs(data['low'] - data['low'].shift(1)).rolling(window=3).mean() / \
                    np.maximum(data['low'] - data['low'].shift(1), 0).rolling(window=3).mean() * 20
    data['波动极值'] = data['波动幅度'].rolling(window=30).max() * 20
    
    data['火焰山'] = np.where(
        (data['low'] <= data['近期最低']) & (data['趋势线'] 40),
        (data['波动幅度'] + data['波动极值']),
        0
    )
    data['火焰山'] = data['火焰山'].ewm(span=3).mean() / 618
    
    return data

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


指标源码


短期周期:=6;中期周期:=12;CCI周期:=14;随机周期:=9;RSI平滑周期1:=3;RSI平滑周期2:=3;BIAS周期:=6;离差值:=EMA(CLOSE,12)-EMA(CLOSE,26);讯号线:=EMA(离差值,9);MACD柱状线:=(离差值-讯号线)*2,COLORSTICK;随机原始值:=(CLOSE-LLV(LOW,随机周期))/(HHV(HIGH,随机周期)-LLV(LOW,随机周期))*100;随机K值:=SMA(随机原始值,RSI平滑周期1,1);随机D值:=SMA(随机K值,RSI平滑周期2,1);随机J值:=3*随机K值-2*随机D值;典型价:=(HIGH+LOW+CLOSE)/3;CCI指标:=(典型价-MA(典型价,CCI周期))/(0.015*AVEDEV(典型价,CCI周期));昨收价:=REF(CLOSE,1);RSI短期:=SMA(MAX(CLOSE-昨收价,0),短期周期,1)/SMA(ABS(CLOSE-昨收价),短期周期,1)*100;RSI中期:=SMA(MAX(CLOSE-昨收价,0),中期周期,1)/SMA(ABS(CLOSE-昨收价),中期周期,1)*100;威廉指标:=100*(HHV(HIGH,10)-CLOSE)/(HHV(HIGH,10)-LLV(LOW,10));乖离率:=(CLOSE-MA(CLOSE,BIAS周期))/MA(CLOSE,BIAS周期)*100;真实波幅:=SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),CCI周期);最高差:=HIGH-REF(HIGH,1);最低差:=REF(LOW,1)-LOW;上升方向量:=SUM(IF(最高差>0&&最高差>最低差,最高差,0),CCI周期);下降方向量:=SUM(IF(最低差>0&&最低差>最高差,最低差,0),CCI周期);上升方向线:=上升方向量*100/真实波幅;下降方向线:=下降方向量*100/真实波幅;平均趋向指数:=MA(ABS(下降方向线-上升方向线)/(下降方向线+上升方向线)*100,CCI周期);趋向指数均值:=(平均趋向指数+REF(平均趋向指数,CCI周期))/2;资金流典型价:=(HIGH+LOW+CLOSE)/3;资金流额:=资金流典型价*VOL;资金流量比:=SUM(IF(资金流典型价>REF(资金流典型价,1),资金流额,0),CCI周期)/SUM(IF(资金流典型价1),资金流额,0),CCI周期);资金流量指标:=100-(100/(1+资金流量比));动态买方:=IF(OPEN<=REF(OPEN,1),0,MAX((HIGH-OPEN),(OPEN-REF(OPEN,1))));动态卖方:=IF(OPEN>=REF(OPEN,1),0,MAX((OPEN-LOW),(REF(OPEN,1)-OPEN)));动态买方和:=SUM(动态买方,23);动态卖方和:=SUM(动态卖方,23);动态买卖气:=IF(动态买方和>动态卖方和,(动态买方和-动态卖方和)/动态买方和,IF(动态买方和=动态卖方和,0,(动态买方和-动态卖方和)/动态卖方和));条件1:=CROSS(离差值,讯号线);条件2:=CROSS(随机K值,随机D值)&&随机K值<-20;条件3:=CCI指标<-90&&CCI指标>-100;条件4:=CROSS(RSI短期,RSI中期)&&RSI短期<50;条件5:=REF(威廉指标,1)>90&&威廉指标<70;条件6:=CROSS(乖离率,-5);条件7:=REF(上升方向线,1)1)&&REF(上升方向线,1)


    
1)&&REF(上升方向线,1)1)&&上升方向线>下降方向线&&上升方向线>平均趋向指数&&上升方向线>趋向指数均值;条件8:=CROSS(资金流量指标,20)&&REF(资金流量指标,1)<20;动量线:=CLOSE-REF(CLOSE,20);动量均线:=MA(动量线,60);条件9:=CROSS(动量线,动量均线);震荡量:=100*(CLOSE-MA(CLOSE,20));震荡均线:=EXPMEMA(震荡量,6);多空价:=(3*CLOSE+LOW+OPEN+HIGH)/6;多空线:=(20*多空价+19*REF(多空价,1)+18*REF(多空价,2)+17*REF(多空价,3)+16*REF(多空价,4)+15*REF(多空价,5)+14*REF(多空价,6)+13*REF(多空价,7)+12*REF(多空价,8)+11*REF(多空价,9)+10*REF(多空价,10)+9*REF(多空价,11)+8*REF(多空价,12)+7*REF(多空价,13)+6*REF(多空价,14)+5*REF(多空价,15)+4*REF(多空价,16)+3*REF(多空价,17)+2*REF(多空价,18)+REF(多空价,20))/210;多空均线:=MA(多空线,20);条件10:=动态买卖气<-0.8;W1:=条件1&&条件2&&条件3;W2:=条件1&&条件2&&条件4;W3:=条件1&&条件2&&条件5;W4:=条件1&&条件2&&条件6;W5:=条件1&&条件2&&条件7;W6:=条件1&&条件2&&条件8;W7:=条件1&&条件2&&条件9;W8:=条件1&&条件2&&条件10;W9:=条件1&&条件3&&条件4;W10:=条件1&&条件3&&条件5;W11:=条件1&&条件3&&条件6;W12:=条件1&&条件3&&条件7;W13:=条件1&&条件3&&条件8;W14:=条件1&&条件3&&条件9;W15:=条件1&&条件3&&条件10;W16:=条件1&&条件4&&条件5;W17:=条件1&&条件4&&条件6;W18:=条件1&&条件4&&条件7;W19:=条件1&&条件4&&条件8;W20:=条件1&&条件4&&条件9;W21:=条件1&&条件4&&条件10;W22:=条件1&&条件5&&条件6;W23:=条件1&&条件5&&条件7;W24:=条件1&&条件5&&条件8;W25:=条件1&&条件5&&条件9;W26:=条件1&&条件5&&条件10;W27:=条件1&&条件6&&条件7;W28:=条件1&&条件6&&条件8;W29:=条件1&&条件6&&条件9;W30:=条件1&&条件6&&条件10;W31:=条件1&&条件7&&条件8;W32:=条件1&&条件7&&条件9;W33:=条件1&&条件7&&条件10;W34:=条件1&&条件8&&条件9;W35:=条件1


    
&&条件8&&条件10;W36:=条件1&&条件9&&条件10;W37:=条件2&&条件3&&条件4;W38:=条件2&&条件3&&条件5;W39:=条件2&&条件3&&条件6;W40:=条件2&&条件3&&条件7;W41:=条件2&&条件3&&条件8;W42:=条件2&&条件3&&条件9;W43:=条件2&&条件3&&条件10;W44:=条件2&&条件4&&条件5;W45:=条件2&&条件4&&条件6;W46:=条件2&&条件4&&条件7;W47:=条件2&&条件4&&条件8;W48:=条件2&&条件4&&条件9;W49:=条件2&&条件4&&条件10;W50:=条件2&&条件5&&条件6;W51:=条件2&&条件5&&条件7;W52:=条件2&&条件5&&条件8;W53:=条件2&&条件5&&条件9;W54:=条件2&&条件5&&条件10;W55:=条件2&&条件6&&条件7;W56:=条件2&&条件6&&条件8;W57:=条件2&&条件6&&条件9;W58:=条件2&&条件6&&条件10;W59:=条件2&&条件7&&条件8;W60:=条件2&&条件7&&条件9;W61:=条件2&&条件7&&条件10;W62:=条件2&&条件8&&条件9;W63:=条件2&&条件8&&条件10;W64:=条件2&&条件9&&条件10;W65:=条件3&&条件4&&条件5;W66:=条件3&&条件4&&条件6;W67:=条件3&&条件4&&条件7;W68:=条件3&&条件4&&条件8;W69:=条件3&&条件4&&条件9;W70:=条件3&&条件4&&条件10;W71:=条件3&&条件5&&条件6;W72:=条件3&&条件5&&条件7;W73:=条件3&&条件5&&条件8;W74:=条件3&&条件5&&条件9;W75:=条件3&&条件5&&条件10;W76:=条件3&&条件6&&条件7;W77:=条件3&&条件6&&条件8;W78:=条件3&&条件6&&条件9;W79:=条件3&&条件6&&条件10;W80:=条件3&&条件7&&条件8;W81:=条件3&&条件7&&条件9;W82:=条件3&&条件7&&条件10;W83:=条件3&&条件8&&条件9;W84:=条件3&&条件8&&条件10;W85:=条件3&&条件9&&条件10;W86:=条件4&&条件5


    
&&条件6;W87:=条件4&&条件5&&条件7;W88:=条件4&&条件5&&条件8;W89:=条件4&&条件5&&条件9;W90:=条件4&&条件5&&条件10;W91:=条件4&&条件6&&条件7;W92:=条件4&&条件6&&条件8;W93:=条件4&&条件6&&条件9;W94:=条件4&&条件6&&条件10;W95:=条件4&&条件7&&条件8;W96:=条件4&&条件7&&条件9;W97:=条件4&&条件7&&条件10;W98:=条件4&&条件8&&条件9;W99:=条件4&&条件8&&条件10;W100:=条件4&&条件9&&条件10;W101:=条件5&&条件6&&条件7;W102:=条件5&&条件6&&条件8;W103:=条件5&&条件6&&条件9;W104:=条件5&&条件6&&条件10;W105:=条件5&&条件7&&条件8;W106:=条件5&&条件7&&条件9;W107:=条件5&&条件7&&条件10;W108:=条件5&&条件8&&条件9;W109:=条件5&&条件8&&条件10;W110:=条件5&&条件9&&条件10;W111:=条件6&&条件7&&条件8;W112:=条件6&&条件7&&条件9;W113:=条件6&&条件7&&条件10;W114:=条件6&&条件8&&条件9;W115:=条件6&&条件8&&条件10;W116:=条件6&&条件9&&条件10;W117:=条件7&&条件8&&条件9;W118:=条件7&&条件8&&条件10;W119:=条件7&&条件9&&条件10;W120:=条件8&&条件9&&条件10;信号条件:=W1||W2||W3||W4||W5||W6||W7||W8||W9||W10||W11||W12||W13||W14||W15||W16||W17||W18||W19||W20||W21||W22||W23||W24||W25||W26||W27||W28||W29||W30||W31||W32||W33||W34||W35||W36||W37||W38||W39||W40||W41||W42||W43||W44||W45||W46||W47||W48||W49||W50||W51||W52||W53||W54||W55||W56||W57||W58||W59||W60||W61||W62||W63||W64||W65||W66||W67||W68||W69||W70||W71||W72||W73||W74||W75||W76||W77||W78||W79||W80||W81||W82||W83||W84||W85||W86||W87||W88||W89||W90||W91||W92||W93||W94||W95||W96||W97||W98||W99||W100||W102||W103||W104||W105||W106||W107||W108||W109||W110||W112||W113||W114||W115||W116||W117||W118||W119||W120;信号值:=IF(信号条件,1,0),COLORRED;STICKLINE(FILTER(信号值>=1,5),60,0,3,0),COLORRED;趋势赋值:=3*SMA((C-LLV(L,55))/(HHV(H,55)-LLV(L,55))*100,5,1)-2*SMA(SMA((C-LLV(L,55))/(HHV(H,55)-LLV(L,55))*100,5,1),3,1);趋势线:=EMA(趋势赋值,3)-10;近期最低:=LLV(LOW,30);波动幅度:=SMA(ABS(L-REF(L,1)),3,1)/SMA(MAX(L-REF(L,1),0),3,1)*20;波动极值:=HHV(波动幅度,30)*20;火焰山:=EMA(IF(LOW<=近期最低&&趋势线<40,(波动幅度+波动极值),0),3)/618,COLORRED,LINETHICK2;STICKLINE(火焰山>0&&火焰山1),0,火焰山*1.2


    
,2,0),COLORRED;STICKLINE(火焰山>0&&火焰山>REF(火焰山,1),0,火焰山*1.2,2,0),COLORBLUE;DRAWTEXT(信号值,35,'抄'),COLORYELLOW;

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



学习分享



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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/186323
 
50 次点击