当前位置:首页>python>图形选股之python实现

图形选股之python实现

  • 2026-10-30 15:09:27
图形选股之python实现

 下面是经典的32种股票走势形态:

一、规律整理

1. 强势封板形态(做多信号)

· 高开封板(高开2%或5%以上)
· 两波封板
· 阶梯式封板
· 稳步攀升封板
· 直线拉升封板
· 股价线突破均价线
· 突破横盘
· 急跌拐头低吸
· 强势一致性(试盘、控盘、高开蓄势)
· 弱势转强势(低开高走、高开高走)

2. 弱势或卖出信号

· 股价线跌破均价线
· 反弹不破均价线
· 跌破前低
· 大幅拉升拐头卖出
· 主力诱多(无量回封、无量拉升、反抽无力)
· 一致转分歧(二次烂板、尾盘放量)
· 做多动能衰竭(冲板无力、量价背离)

3. 分歧转一致(潜在转强信号)

· 炸板后回封
· 震荡分歧后走高
· 高开分歧后企稳

 二、选股逻辑框架

我们将从以下几个方面构建选股逻辑:

1. 开盘强度:高开幅度
2. 盘中走势:是否突破均价线、是否封板
3. 量价关系:成交量是否配合
4. 形态识别:是否出现阶梯式、直线拉升等形态
5. 分歧转一致:炸板后是否回封、震荡后是否走强

三、Python 选股代码框架

以下是一个基于 pandas 和 numpy 的选股框架,假设你已经获取了股票的日线或分钟级数据:

 import pandas as pd

import numpy as np

from datetime import datetime

class StockSelector:

    def __init__(self, df):

        """

        df 需包含以下列:

        - open, high, low, close, volume

        - 可选:avg_price(均价线)

        - 可选:涨停价 upper_limit

        """

        self.df = df.copy()

    def is_high_open(self, threshold=0.02):

        """高开判断"""

        self.df['high_open'] = (self.df['open'] / self.df['close'].shift(1) - 1) >= threshold

        return self.df

    def is_break_avg_line(self):

        """突破均价线"""

        if 'avg_price' not in self.df.columns:

            # 若无均价线,可用移动平均线替代

            self.df['avg_price'] = self.df['close'].rolling(5).mean()

        self.df['break_avg_up'] = self.df['close'] > self.df['avg_price']

        self.df['break_avg_down'] = self.df['close'] < self.df['avg_price']

        return self.df

    def is_limit_up(self, threshold=0.099):

        """是否涨停"""

        self.df['limit_up'] = (self.df['close'] / self.df['close'].shift(1) - 1) >= threshold

        return self.df

    def is_ladder_up(self, window=5):

        """阶梯式上涨"""

        self.df['ladder_up'] = self.df['close'].rolling(window).apply(

            lambda x: (x.diff() > 0).all() and (x.max() - x.min()) / x.min() > 0.03

        )

        return self.df

    def is_straight_up(self, window=3):

        """直线拉升"""

        self.df['straight_up'] = self.df['close'].rolling(window).apply(

            lambda x: (x.iloc[-1] - x.iloc[0]) / x.iloc[0] > 0.05

        )

        return self.df

    def is_weak_to_strong(self):

        """弱势转强势:低开高走"""

        self.df['open_low'] = self.df['open'] < self.df['close'].shift(1)

        self.df['close_high'] = self.df['close'] > self.df['open']

        self.df['weak_to_strong'] = self.df['open_low'] & self.df['close_high']

        return self.df

    def is_divergence_to_consistency(self):

        """分歧转一致:炸板回封"""

        if 'upper_limit' not in self.df.columns:

            self.df['upper_limit'] = self.df['close'].shift(1) * 1.1  # 假设涨停为10%

        self.df['hit_limit'] = self.df['high'] >= self.df['upper_limit']

        self.df['close_limit'] = self.df['close'] >= self.df['upper_limit']

        self.df['div_to_con'] = self.df['hit_limit'] & self.df['close_limit']

        return self.df

    def is_selling_signal(self):

        """卖出信号:跌破均价线、前低等"""

        self.df['break_avg_sell'] = self.df['close'] < self.df['avg_price']

        self.df['break_low_sell'] = self.df['close'] < self.df['low'].rolling(5).min().shift(1)

        return self.df

    def select_stocks(self):

        """综合选股"""

        self.is_high_open(0.02)

        self.is_break_avg_line()

        self.is_limit_up()

        self.is_ladder_up()

        self.is_straight_up()

        self.is_weak_to_strong()

        self.is_divergence_to_consistency()

        self.is_selling_signal()

        # 选股条件(可调整)

        buy_condition = (

            self.df['high_open'] |

            self.df['break_avg_up'] |

            self.df['limit_up'] |

            self.df['ladder_up'] |

            self.df['straight_up'] |

            self.df['weak_to_strong'] |

            self.df['div_to_con']

        )

        sell_condition = (

            self.df['break_avg_sell'] |

            self.df['break_low_sell']

        )

        self.df['buy_signal'] = buy_condition

        self.df['sell_signal'] = sell_condition

        return self.df[self.df['buy_signal']]

# 使用示例

if __name__ == "__main__":

    # 假设 df 是你的股票数据

    df = pd.read_csv('stock_data.csv', parse_dates=['date'])

    selector = StockSelector(df)

    selected = selector.select_stocks()

    print(selected[['date', 'close', 'buy_signal']].tail(20))

四、简要说明

1. 数据要求:代码假设你已经有了股票的日线或分钟线数据,包含开盘、最高、最低、收盘、成交量等。

2. 可扩展性:你可以根据图片中的更多形态(如“无量回封诱多”、“反抽无力”等)继续添加判断函数。

3. 参数可调:阈值(如高开幅度、拉升幅度)可根据实际情况调整。

4. 实战建议:建议在实盘前进行回测,并配合其他指标(如成交量、市场情绪)综合判断。

如果你有真实数据需要测试,我可以帮你进一步完善和调整代码。是否需要我为你添加更多具体的形态识别逻辑?欢迎私信互相交流学习!

股市有风险,投资需谨慎!

最新文章

随机文章