python评估今日股票涨停质量,并且对各个涨停股票进行打分

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

一、数据获取与预处理‌

1. 获取当日涨停股票清单‌

使用AKShare获取当日涨停股票基础数据,包含股票代码、名称、涨停价等核心字段:
import akshare as ak
import pandas as pd
获取当日涨停板数据(假设当前日期为2025-05-01)
df_limit = ak.stock_zt_pool_em(date=“20250501”) # :ml-citation{ref=“4” data=“citationList”}
df_limit = df_limit[[“代码”, “名称”, “最新价”, “涨停价”, “封单金额”, “首次封板时间”, “换手率”, “流通市值”]]
df_limit.columns = [“code”, “name”, “price”, “limit_price”, “order_amount”, “limit_time”, “turnover”, “circ_mv”]

2. 补充历史数据‌

通过Tushare获取近5日涨停次数和板块关联性数据:

import tushare as ts
ts.set_token(‘your_token’)
pro = ts.pro_api()
获取近5日涨停次数
hist_data = pro.limit_list(start_date=“20250426”, end_date=“20250501”)
hist_count = hist_data.groupby(“ts_code”)[“trade_date”].count().reset_index(name=“limit_count”)

合并数据
df_limit = pd.merge(df_limit, hist_count, left_on=“code”, right_on=“ts_code”, how=“left”)

二、评估维度与权重分配‌

构建6个核心指标评估涨停质量,权重分配如下:

指标 权重 说明 数据来源
封单强度 25% 封单金额/流通市值(比值越大强度越高) AKShare
涨停时间 20% 首次封板时间(越早得分越高) AKShare
换手率 15% 换手率越低表明筹码稳定性越好 AKShare
流通市值 15% 市值越小越容易获资金关注(小盘股优先) AKShare
历史连板次数 15% 近5日涨停次数(次数越多风险越高) Tushare
板块效应 10% 同板块涨停股数量(数量越多协同效应越强) Tushare

三、指标计算与归一化‌

1. 封单强度计算‌

封单强度 = 封单金额 / 流通市值

df_limit[“order_strength”] = df_limit[“order_amount”] / df_limit[“circ_mv”]
df_limit[“order_score”] = (df_limit[“order_strength”] / df_limit[“order_strength”].max()) * 25 # 归一化到25分

2. 涨停时间转换‌

将时间转为分钟数(如09:35→575分钟)

df_limit[“limit_minute”] = df_limit[“limit_time”].apply(
lambda x: int(x.split(“:”)[0])60 + int(x.split(“:”)[1])
)
df_limit[“time_score”] = (1 - df_limit[“limit_minute”]/570) * 20 # 09:30开盘,570=9
60+30

3. 其他指标归一化‌

换手率(越低越好)

df_limit[“turnover_score”] = (1 - df_limit[“turnover”]/df_limit[“turnover”].max()) * 15

流通市值(越小越好)

df_limit[“circ_mv_score”] = (1 - df_limit[“circ_mv”]/df_limit[“circ_mv”].max()) * 15

历史连板次数(反向指标)

df_limit[“history_score”] = (1 - df_limit[“limit_count”]/df_limit[“limit_count”].max()) * 15

板块效应(获取同板块涨停数量)

sector_count = df_limit.groupby(“sector”)[“code”].count().reset_index(name=“sector_count”)
df_limit = pd.merge(df_limit, sector_count, on=“sector”)
df_limit[“sector_score”] = (df_limit[“sector_count”] / df_limit[“sector_count”].max()) * 10

四、综合评分输出‌

1. 总分计算‌

df_limit[“total_score”] = (
df_limit[“order_score”] + df_limit[“time_score”] +
df_limit[“turnover_score”] + df_limit[“circ_mv_score”] +
df_limit[“history_score”] + df_limit[“sector_score”]
)
df_limit = df_limit.sort_values(“total_score”, ascending=False)

2. 结果展示‌

输出TOP10涨停股评分

print(df_limit[[“code”, “name”, “total_score”]].head(10))

可视化评分分布(Matplotlib)

import matplotlib.pyplot as plt
plt.figure(figsize=(10,6))
plt.barh(df_limit[“name”][:10], df_limit[“total_score”][:10])
plt.title(“今日涨停股质量评分TOP10”)
plt.xlabel(“综合得分”)
plt.show()

关键实现逻辑‌
封单强度权重最高‌:反映资金封板决心,通过封单金额/流通市值量化资金相对投入规模;
时间维度精细化‌:将首次封板时间转换为分钟数,早盘涨停股得分更高;
动态板块效应‌:通过统计同板块涨停数量捕捉热点联动性;
历史表现反向指标‌:连续涨停次数过多可能预示风险,需降低权重。
注意事项‌
数据清洗‌:需过滤ST股(涨停幅度5%)及新股首日数据;
实时更新‌:盘中封单金额会动态变化,建议结合定时任务更新数据;
阈值调整‌:可根据市场环境调整权重分配(如牛市提高板块效应权重)。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

```sql -- 修正后的完整SQL查询 WITH base_data AS ( SELECT date, instrument, name, close, total_market_cap, float_market_cap, -- 明确命名流通市值 open_gap, zt_count_60d, ret_5d, open_proximity, -- 计算综合评分(修正ret_d错误) 0.5 * PERCENT_RANK() OVER (ORDER BY open_proximity) + 0.3 * PERCENT_RANK() OVER (ORDER BY zt_count_60d) + 0.2 * PERCENT_RANK() OVER (ORDER BY ret_5d) AS strategy_score FROM stock_data WHERE date = '2025-10-30' AND is_risk_warning = 0 AND suspended = 0 AND list_days >= 60 ), filtered_data AS ( SELECT *, -- 明确字段命名 float_market_cap AS circulation_market_cap, strategy_score AS rank_score FROM base_data WHERE open_gap BETWEEN 0.02 AND 0.07 -- 开盘跳空2%-7% AND zt_count_60d >= 1 AND ret_5d > 0 ) SELECT date, instrument, name, close, total_market_cap, circulation_market_cap, open_gap, zt_count_60d, ret_5d, rank_score FROM filtered_data ORDER BY rank_score DESC LIMIT 5; ``` 📊 策略优化增强版 ```python import pandas as pd import numpy as np def enhanced_strategy_analysis(df): """ 增强版策略分析函数 """ # 1. 数据质量检查 print("=== 数据质量检查 ===") print(f"数据总数: {len(df)}") print(f"字段信息:") for col in df.columns: print(f" {col}: {df[col].dtype}, 缺失值: {df[col].isnull().sum()}") # 2. 策略绩效分析 if len(df) > 0: print("\n=== 策略选股分析 ===") print(f"选股数量: {len(df)}") print(f"综合评分范围: {df['rank_score'].min():.3f} - {df['rank_score'].max():.3f}") print(f"平均开盘跳空: {df['open_gap'].mean():.2%}") print(f"平均60日涨停次数: {df['zt_count_60d'].mean():.1f}") print(f"平均5日收益率: {df['ret_5d'].mean():.2%}") # 3. 风险收益特征 print("\n=== 风险收益特征 ===") print(f"总市值分布: {df['total_market_cap'].min():.0f} - {df['total_market_cap'].max():.0f} 亿") print(f"流通市值分布: {df['circulation_market_cap'].min():.0f} - {df['circulation_market_cap'].max():.0f} 亿") # 4. 选股明细 print("\n=== 策略选股明细 ===") result_df = df[[ 'instrument', 'name', 'close', 'open_gap', 'zt_count_60d', 'ret_5d', 'rank_score' ]].copy() result_df['open_gap'] = result_df['open_gap'].apply(lambda x: f"{x:.2%}") result_df['ret_5d'] = result_df['ret_5d'].apply(lambda x: f"{x:.2%}") result_df['rank_score'] = result_df['rank_score'].round(3) return result_df else: print("⚠️ 未筛选到符合条件的股票") return pd.DataFrame() # 执行查询和分析 try: # 执行修正后的查询 sql_query = """ -- 上面修正后的SQL代码 """ df = dai.query(sql_query) print("✅ 查询执行成功") # 进行策略分析 result_df = enhanced_strategy_analysis(df) if not result_df.empty: print("\n🎯 最终选股结果:") print(result_df.to_string(index=False)) except Exception as e: print(f"❌ 查询执行失败: {e}") ``` 💡 进一步优化建议 ```python def strategy_optimization_suggestions(df): """ 基于结果数据的策略优化建议 """ if len(df) == 0: return suggestions = [] # 1. 流动性筛选建议 avg_circulation = df['circulation_market_cap'].mean() if avg_circulation < 50: # 50亿以下 suggestions.append("🔍 增加流动性筛选:当前选股偏向小盘股,建议加入成交量过滤条件") # 2. 风险集中度分析 industry_concentration = len(df) / len(set([name[:2] for name in df['name']])) if len(df) > 0 else 0 if industry_concentration > 3: suggestions.append("📊 行业分散度不足:建议增加行业分散度约束") # 3. 动量持续性检查 high_momentum_stocks = len(df[df['ret_5d'] > 0.1]) # 5日涨幅超过10% if high_momentum_stocks / len(df) > 0.6: suggestions.append("⚡ 动量过热:当前选股动量较强,注意回调风险") # 4. 涨停基因质量 avg_zt_count = df['zt_count_60d'].mean() if avg_zt_count < 2: suggestions.append("🎯 提高涨停基因标准:建议将60日涨停次数要求提高到2次以上") if suggestions: print("\n💡 策略优化建议:") for suggestion in suggestions: print(f" {suggestion}") # 执行优化建议分析 strategy_optimization_suggestions(df) ``` 🚀 高级功能扩展 ```python def advanced_strategy_features(): """ 高级策略功能扩展 """ advanced_sql = """ -- 1. 加入流动性筛选 AND volume > (SELECT AVG(volume_20d) FROM stock_liquidity WHERE instrument = base_data.instrument) -- 2. 加入波动率控制 AND volatility_20d < 0.5 -- 20日波动率小于50% -- 3. 行业分散度约束 AND industry NOT IN ( SELECT industry FROM ( SELECT industry, COUNT(*) as count FROM filtered_data GROUP BY industry ORDER BY count DESC LIMIT 1 ) t -- 避免过度集中在单一行业 ) """ return advanced_sql ``` df 数据样本 1. 🔬 进行详细的策略回测分析 2. 📈 评估选股的质量和风险特征 3. 🎯 给出具体的参数调优建议 4. ⚡ 提供实盘监控代码模
11-01
股票涨停是指在一天内股票价格上涨到一定幅度后,达到规定的涨停限制,停止交易。在Python中,你可以使用各种库来获取股票数据并进行分析,以找到可能的涨停股票。 一种常用的库是pandas_datareader,它可以从各种数据源(如Yahoo Finance)获取股票数据。你可以使用该库来获取股票的历史数据,并根据涨跌幅进行筛选。 首先,确保你已经安装了pandas_datareader库。可以使用以下命令进行安装: ``` pip install pandas_datareader ``` 然后,你可以使用以下代码示例来获取某只股票的历史数据,并筛选出涨幅超过某个阈值的日期: ```python import pandas_datareader as pdr # 设置要获取股票代码和时间范围 stock_code = 'AAPL' # 以苹果公司(AAPL)为例 start_date = '2021-01-01' end_date = '2021-12-31' # 获取股票数据 df = pdr.get_data_yahoo(stock_code, start=start_date, end=end_date) # 计算每日涨跌幅 df['Daily_Return'] = df['Close'].pct_change() # 筛选出涨幅大于某个阈值的日期 threshold = 0.099 # 设置涨幅阈值为9.9% rising_limit_dates = df[df['Daily_Return'] > threshold].index # 打印涨停日期 for date in rising_limit_dates: print(date) ``` 请注意,这只是一个简单的示例代码,你可以根据自己的需求进行修改和扩展。同时,股票市场涨停的规则是复杂且不断变化的,因此需要考虑更多因素来判断股票是否真正涨停。在进行股票交易时,请始终谨慎,并充分了解相关风险。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值