TEST

import pandas as pd


def z(df):
    high_jugg=(
            df['high']>df['high'].shift(1)&df['high']>df['high'].shift(2)&df['high']>df['high'].shift(3)&df['high']>df['high'].shift(4)&
            df['high']>df['high'].shift(-1)&df['high']>df['high'].shift(-2)&df['high']>df['high'].shift(-3)&df['high']>df['high'].shift(-4)
        )
    low_jugg=(
        df['high']>df['high'].shift(1)&df['high']>df['high'].shift(2)&df['high']>df['high'].shift(3)&df['high']>df['high'].shift(4)&
        df['high']>df['high'].shift(-1)&df['high']>df['high'].shift(-2)&df['high']>df['high'].shift(-3)&df['high']>df['high'].shift(-4)
    )
    hp=df[high_jugg]
    lp=df[low_jugg]
    if len(hp)>=2 and len(hp)>=2:
        if (hp.iloc[0]['high']-lp.iloc[0]['low'])/lp.iloc[0]['low']<=0.15:
            if (hp.iloc[1]['high']-lp.iloc[0]['low'])/lp.iloc[1]['low']<=0.15:
                if hp.iloc[0]['high']<hp.iloc[1]['high'] and hp.iloc[0]['low']<hp.iloc[1]['low']:
                    if (hp.iloc[1]['high']-hp.iloc[0]['high'])/hp.iloc[0]['high']<=0.03 and (hp.iloc[1]['low']-hp.iloc[0]['low'])/hp.iloc[0]['low']<=0.03:
                        for i in hp.index:
                            if not df.loc[i]['volume']>1.8*df.loc[i]['vol_ma20'].shift(1):
                                return False
                        for j in lp.index:
                            if not df.loc[i]['volume']>1.8*df.loc[i]['vol_ma20'].shift(1):
                                return False
                    return hp,lp
            else:
                return False
        else:
            return False
    else:
        return False
    

import pandas as pd
import numpy as np

def z(df):
    """
    识别K线高低点形态 + 量价筛选
    :param df: 包含high, low, volume, vol_ma20的DataFrame
    :return: 满足条件返回(hp, lp),否则返回False
    """
    # 复制数据避免修改原df
    df = df.copy()
    
    # ===================== 1. 修正高低点判断逻辑 =====================
    # 高点 jugg:当前high 大于 前后各4根K线的high(9根K线最高点)
    high_cond = (
        (df['high'] > df['high'].shift(1)) &
        (df['high'] > df['high'].shift(2)) &
        (df['high'] > df['high'].shift(3)) &
        (df['high'] > df['high'].shift(4)) &
        (df['high'] > df['high'].shift(-1)) &
        (df['high'] > df['high'].shift(-2)) &
        (df['high'] > df['high'].shift(-3)) &
        (df['high'] > df['high'].shift(-4))
    )

    # 低点 jugg:当前low 小于 前后各4根K线的low(9根K线最低点)【你原来写成了和高点一样,是严重错误】
    low_cond = (
        (df['low'] < df['low'].shift(1)) &
        (df['low'] < df['low'].shift(2)) &
        (df['low'] < df['low'].shift(3)) &
        (df['low'] < df['low'].shift(4)) &
        (df['low'] < df['low'].shift(-1)) &
        (df['low'] < df['low'].shift(-2)) &
        (df['low'] < df['low'].shift(-3)) &
        (df['low'] < df['low'].shift(-4))
    )

    # 筛选出高低点
    hp = df[high_cond].copy()  # 高点列表
    lp = df[low_cond].copy()  # 低点列表

    # ===================== 2. 基础数量判断 =====================
    if len(hp) < 2 or len(lp) < 1:
        return False

    # 取第一个低点、前两个高点
    hp0 = hp.iloc[0]
    hp1 = hp.iloc[1]
    lp0 = lp.iloc[0]

    # ===================== 3. 价格区间条件 =====================
    # 条件1:第一个高点 相对 第一个低点 涨幅 ≤15%
    cond1 = (hp0['high'] - lp0['low']) / lp0['low'] <= 0.15
    
    # 条件2:第二个高点 相对 第一个低点 涨幅 ≤15%(你原代码分母写错了)
    cond2 = (hp1['high'] - lp0['low']) / lp0['low'] <= 0.15
    
    # 条件3:第二个高点 > 第一个高点,第二个低点 > 第一个低点
    cond3 = (hp1['high'] > hp0['high']) and (hp1['low'] > hp0['low'])
    
    # 条件4:两个高点/低点之间涨幅 ≤3%
    cond4 = (
        (hp1['high'] - hp0['high']) / hp0['high'] <= 0.03 and
        (hp1['low'] - hp0['low']) / hp0['low'] <= 0.03
    )

    if not (cond1 and cond2 and cond3 and cond4):
        return False

    # ===================== 4. 成交量条件(所有高低点都必须放量) =====================
    # 检查所有高点:成交量 > 1.8倍 前一日20日均量
    for idx in hp.index:
        if not (df.loc[idx, 'volume'] > 1.8 * df.loc[idx, 'vol_ma20'].shift(1)):
            return False

    # 检查所有低点:成交量 > 1.8倍 前一日20日均量
    for idx in lp.index:
        if not (df.loc[idx, 'volume'] > 1.8 * df.loc[idx, 'vol_ma20'].shift(1)):
            return False

    # 所有条件满足
    return hp, lp
此条目发表在None分类目录。将固定链接加入收藏夹。

发表回复