之前一段时间玩短线竞价模式, 最近想了下,竞价太具有概率性, 还是要配合盘中分时靠谱。 后续可能不这样玩了,最近对于技术没啥思路,分享一段代码, 看看是否对大家 有所帮助。一个股票是否能够涨停, 是不是要看个股的股性怎么样。 股性每个人的理解不一样。 我简单写下自己对个股的理解。 比如一年涨停次数次数多少、首板涨停溢价率(比如说首板涨停第二天没溢价的个股就列入黑名单) 、竞价高开低走次数多的也不靠谱。 使用AkShare获取个股历史行情数据,需包含开盘价、收盘价、涨跌幅等关键字段:
import akshare as akimport pandas as pd
df = ak.stock_zh_a_hist(symbol="300750", period="daily", start_date="20240701", end_date="20250701")df = df[["日期", "开盘", "收盘", "涨跌幅"]]df["日期"] = pd.to_datetime(df["日期"])df.set_index("日期", inplace=True)
逻辑:涨停定义
df["is_limit_up"] = df["涨跌幅"] >= 9.9 limit_up_count = df["is_limit_up"].sum()print(f"近1年涨停次数:{limit_up_count}")
定义:
df["prev_close"] = df["收盘"].shift(1)df["is_high_open"] = df["开盘"] > df["prev_close"] * 1.01df["is_low_close"] = df["收盘"] df["开盘"]df["high_open_low_close"] =
df["is_high_open"] & df["is_low_close"]high_open_low_close_count = df["high_open_low_close"].sum()print(f"高开低走次数:{high_open_low_close_count}")
最后附上完整代码,需要的自取。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题import akshare as akimport pandas as pdimport numpy as npfrom datetime import datetime, timedeltadef calculate_limit_price(row, stock_code): """ 计算涨停价(考虑不同板块的涨跌幅限制) 参数: row : DataFrame行 stock_code : 股票代码 返回: float : 涨停价 """ if str(stock_code).startswith(('68', '30')): limit_rate = 0.20 elif str(stock_code).startswith(('8')): limit_rate = 0.30 elif 'ST' in row.get('name', '') or '*ST' in row.get('name', ''): limit_rate = 0.05 else: limit_rate = 0.10 limit_price = round(row['prev_close'] * (1 + limit_rate), 2) return limit_pricedef analyze_stock_behavior(symbol, start_date, end_date): """ 分析股票行为:涨停次数、高开低走次数、首板次日未突破情况 参数: symbol : 股票代码 start_date : 开始日期 (YYYYMMDD) end_date : 结束日期 (YYYYMMDD) 返回: tuple : (涨停次数, 高开低走次数, 首板次日未突破次数, 包含分析结果的DataFrame) """ df = ak.stock_zh_a_hist(symbol=symbol, period="daily", start_date=start_date, end_date=end_date, adjust="qfq") df = df[["日期", "开盘", "最高", "最低", "收盘", "涨跌幅"]] df["日期"] = pd.to_datetime(df["日期"]) df = df.sort_values("日期").reset_index(drop=True) df["prev_close"] = df["收盘"].shift(1) df["涨停价"] = df.apply(lambda row: calculate_limit_price( {'prev_close': row['prev_close']}, symbol), axis=1) df["is_limit_up"] = (df["最高"] >= df["涨停价"] - 0.01) | (df["涨跌幅"] >= 9.5) df["is_high_open"] = df["开盘"] > df["prev_close"] * 1.03 df["is_low_close"] = df["收盘"] < df["开盘"] * 0.97
df["high_open_low_close"] = df["is_high_open"] & df["is_low_close"] df["is_first_limit"] = False df["next_day_not_break"] = False for i in range(1, len(df) - 1): if df.loc[i, "is_limit_up"] and not df.loc[i - 1, "is_limit_up"]: df.loc[i, "is_first_limit"] = True if df.loc[i + 1, "最高"] < df.loc[i, "涨停价"]: df.loc[i + 1, "next_day_not_break"] = True limit_up_count = df["is_limit_up"].sum() high_open_low_close_count = df["high_open_low_close"].sum() next_day_not_break_count = df["next_day_not_break"].sum() return limit_up_count, high_open_low_close_count, next_day_not_break_count, dfif __name__ == "__main__": symbol = "002549" end_date = datetime.now().strftime("%Y%m%d") start_date = (datetime.now() - timedelta(days=365)).strftime("%Y%m%d") limit_up, high_open_low, next_day_not_break, result_df = analyze_stock_behavior( symbol, start_date, end_date ) print(f"分析时段: {start_date} 至 {end_date}") print(f"涨停次数: {limit_up}") print(f"高开低走次数: {high_open_low}") print(f"首板涨停次日未突破次数: {next_day_not_break}") if next_day_not_break > 0: print("\n首板涨停次日未突破案例:") cases = result_df[result_df["next_day_not_break"]] print(cases[["日期", "开盘", "最高", "最低", "收盘", "涨停价"]])
如果我的分享对你投资有所帮助,不吝啬给个点赞关注呗。如果对每日复盘感兴趣,欢迎关注我另外一个号。重在市场理解(大盘情绪、 热门概念板块、 热门个股), 技术只是辅助。