You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于MACD-DEMA的周/月交易信号延迟问题排查求助

基于MACD-DEMA的周/月交易信号延迟问题排查求助

大家好,我现在被一个交易信号触发延迟的问题难住了——试过GPT、找过Python开发者,都没找到问题根源,想请各位帮忙分析分析。

我的需求

  • 周度信号:希望在每周周五收盘后立即生成买卖信号,这样我能第一时间跟进操作,不能有延迟
  • 月度信号:同样,要在每月最后一个交易日收盘后立刻触发买卖信号,确保信号基于最新的收盘价数据

遇到的问题

目前代码运行后,信号触发总是有延迟,没法在周/月收盘后及时生成,我实在搞不清哪里出了问题。明明逻辑上是想紧跟最新数据的,但实际效果差很多,我怀疑问题出在主逻辑的日期判断部分,但自己查不出来。

主逻辑代码(周/月信号处理)

for stock in t2_list:

        # Download stock data for both intervals
        stock_data_weekly = download_weekly_data(stock, start_date, end_date)
        stock_data_weekly['Open'] = stock_data_weekly['Open'].round(2)
        stock_data_weekly['Close'] = stock_data_weekly['Close'].round(2)
        stock_data_weekly['High'] = stock_data_weekly['High'].round(2)
        stock_data_weekly['Low'] = stock_data_weekly['Low'].round(2)

        stock_data_monthly = download_monthly_data(stock, start_date, end_date)
        stock_data_monthly['Open'] = stock_data_monthly['Open'].round(2)
        stock_data_monthly['Close'] = stock_data_monthly['Close'].round(2)
        stock_data_monthly['High'] = stock_data_monthly['High'].round(2)
        stock_data_monthly['Low'] = stock_data_monthly['Low'].round(2)
        print(stock, len(stock_data_weekly), len(stock_data_monthly))
        sleep(2)
        if len(stock_data_weekly) >= 71:

            #stock_data_weekly = calculate_macd(stock_data_weekly)
            stock_data_weekly = calculate_macd_dema(stock_data_weekly)
            #print(stock_data_weekly.iloc[:, -8:])
            stock_data_weekly = check_crossovers(stock_data_weekly)

            # tradingview_data_weekly = format_tradingview_output(stock_data_weekly)

            for i, r in stock_data_weekly.iterrows():
                sent_date = i + timedelta(days = 6)
                date_str = sent_date.strftime('%Y-%m-%d')  # Adjust format as needed
                previous_friday = datetime.now() - timedelta(days = dates_diff[datetime.now().weekday()] + 1 )
                pre_previous_friday =previous_friday - timedelta(days = 7 )
                if r['Crossover'] != 'Neutral' and i>pre_previous_friday and i<previous_friday:
                    #pass
                    print('weekly', date_str, stock, r['Crossover'])
                    webhook_discord(webhook_url_weekly, date_str, r['Crossover'], stock, r['Crosspoint'])
                    sleep(5)

        if len(stock_data_monthly) >= 71:

            stock_data_monthly = calculate_macd_dema(stock_data_monthly)
            stock_data_monthly = check_crossovers(stock_data_monthly)

            for i , r in stock_data_monthly.iterrows():
                stock_month = i.month
                curr_month = datetime.now().month
                if curr_month == 1:
                    acc_month = 12
                else:
                    acc_month = curr_month-1
                sent_date = i + timedelta(days = 33)
                date_str = sent_date.strftime('%Y-%m')  # Adjust format as needed
                if r['Crossover'] != 'Neutral' and stock_month==acc_month:
                    print('monthly', date_str, stock, r['Crossover'])
                    webhook_discord(webhook_url_monthly, date_str, r['Crossover'], stock, r['Crosspoint'])
                    #pass
                    sleep(5)

if __name__ == "__main__":
    main()

MACD-DEMA计算及交叉判断代码

def calculate_macd_dema(df, short_window=12, long_window=26, signal_window=9):
    # Calculate Short-term DEMA
    def ema(series, span):
        ta_ema = ta.ema(series, span)
        return ta_ema

    def dema(series, span):
        ema1 = ema(series, span)
        ema2 = ema(ema1, span)
        return 2 * ema1 - ema2

    # Parameters
    sma = 12
    lma = 26
    tsp = 9

    # Calculate DEMAs
    df['DEMAfast'] = dema(df['Close'], sma)
    df['DEMAslow'] = dema(df['Close'], lma)


    # Calculate MACD Line and Signal Line

    df['MACD_DEMA'] = df['DEMAfast'] - df['DEMAslow']
    #print(df['MACD_DEMA'])
    df['Signal_Line'] = dema(df['MACD_DEMA'], tsp)

    df['MACDZeroLag'] = df['MACD_DEMA'] - df['Signal_Line']
    return df

# Check for MACD and Signal Line crossovers
def check_crossovers(df):
    # crossovers = []
    # for i in range(1, len(df)):

    #     if df['MACD_DEMA'].iloc[i] > df['Signal_Line'].iloc[i] and df['MACD_DEMA'].iloc[i - 1] <= df['Signal_Line'].iloc[i - 1]:
    #         crosspoint = df['Close'].iloc[i]
    #         crossovers.append((df.index[i], "Buy", crosspoint))

    #     elif df['MACD_DEMA'].iloc[i] < df['Signal_Line'].iloc[i] and df['MACD_DEMA'].iloc[i - 1] >= df['Signal_Line'].iloc[i - 1]:
    #         crosspoint = df['Close'].iloc[i]
    #         crossovers.append((df.index[i], "Sell", crosspoint))
    #     else:
    #         crossovers.append((df.index[i], "Neutral", None))  # None when there's no crosspoint
    df_macd_dema_1 = df['MACD_DEMA']
    df_macd_dema_2 = df['MACD_DEMA'].shift(1)

    df_signal_1 = df['Signal_Line']
    df_signal_2 = df['Signal_Line'].shift(1)

    df['Crossover'] = np.where((df_macd_dema_1 > df_signal_1) & (df_macd_dema_2 <= df_signal_2), 'Buy',
                           np.where((df_macd_dema_1 < df_signal_1) & (df_macd_dema_2 >= df_signal_2), 'Sell', 'Neutral'))

    df['Crosspoint'] = np.where( (df['Crossover']=='Buy') | (df['Crossover']=='Sell'), df['Close'], None)


    return df

我感觉核心问题应该出在主逻辑里的日期判断部分,但反复检查都没发现问题,希望各位能帮我找出信号延迟的原因,谢谢大家!

备注:内容来源于stack exchange,提问作者Muhammed ALTIN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:10:29