之前一段时间玩短线竞价模式, 最近想了下,竞价太具有概率性, 还是要配合盘中分时靠谱。 后续可能不这样玩了,最近对于技术没啥思路,分享一段代码, 看看是否对大家 有所帮助。一个股票是否能够涨停, 是不是要看个股的股性怎么样。 股性每个人的理解不一样。 我简单写下自己对个股的理解。 比如一年涨停次数次数多少、首板涨停溢价率(比如说首板涨停第二天没溢价的个股就列入黑名单) 、竞价高开低走次数多的也不靠谱。 使用AkShare获取个股历史行情数据,需包含开盘价、收盘价、涨跌幅等关键字段:
import akshare as ak
import 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.01
df["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 ak
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
def 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_price
def 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, df
if __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[["日期", "开盘", "最高", "最低", "收盘", "涨停价"]])
如果我的分享对你投资有所帮助,不吝啬给个点赞关注呗。如果对每日复盘感兴趣,欢迎关注我另外一个号。重在市场理解(大盘情绪、 热门概念板块、 热门个股), 技术只是辅助。