下面是经典的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. 实战建议:建议在实盘前进行回测,并配合其他指标(如成交量、市场情绪)综合判断。
如果你有真实数据需要测试,我可以帮你进一步完善和调整代码。是否需要我为你添加更多具体的形态识别逻辑?欢迎私信互相交流学习!
股市有风险,投资需谨慎!