
今天盘中的时候,我突然想看当前哪些概念涨停比较多。 虽然很多APP也有这个功能, 但对于自己喜欢捣鼓程序的我来说,还是自己直接写程序来实在。
为什么有这个想法呢?
比如盘中我有些时候想看当前哪些概念个股涨停多,是否存在套利的机会。
盘后,我想看连板梯度完整情况,比如今天跨境电商有哪些板,梯度是怎么分布的,之前我是通过其他软件看的, 或者通过我之前写的连板分析肉眼看。
这些只是举例, 对于我有点用处。 对于其他人可能没啥用。 临时记录在这。
最后附上完整代码,需要的自取。
import streamlit as st
import pywencai
import pandas as pd
from datetime import datetime
# 列对齐设置
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.expand_frame_repr', False)
pd.set_option('display.max_colwidth', 100)
def app():
st.title("股票涨停分析")
# 日期选择
selected_date = st.date_input("选择分析日期", datetime.today())
date_str = selected_date.strftime("%Y%m%d")
try:
# 获取数据
param = f"{date_str}涨停,非ST"
df = pywencai.get(query=param, sort_key='成交金额', sort_order='desc')
if df.empty:
st.warning("当日没有涨停股票数据!")
return
# 列选择和处理
selected_columns = [
'股票代码', '股票简称', '最新价', '最新涨跌幅',f'连续涨停天数[{date_str}]', f'首次涨停时间[{date_str}]',
f'最终涨停时间[{date_str}]', f'涨停封单量[{date_str}]',
f'涨停封单额[{date_str}]', f'涨停类型[{date_str}]',
f'几天几板[{date_str}]', f'涨停原因类别[{date_str}]',
f'a股市值(不含限售股)[{date_str}]'
]
jj_df = df[selected_columns].copy()
# 展开概念列表(关键修改)
exploded_df = jj_df.assign(
涨停原因=lambda x: x[f'涨停原因类别[{date_str}]'].str.split('+')
).explode('涨停原因')
# 正确统计出现次数(包含重复个股)
concept_counts = exploded_df.groupby('涨停原因').size().reset_index(name='出现次数')
concept_counts = concept_counts.sort_values('出现次数', ascending=False)
# 显示概念统计
# st.subheader("涨停概念统计")
# st.dataframe(concept_counts, use_container_width=True)
# 分组显示数据
st.subheader("按涨停原因分组")
# 创建合并后的展示数据
merged_df = pd.merge(
exploded_df,
concept_counts,
on='涨停原因',
how='left'
).sort_values(
['出现次数', '涨停原因', f'连续涨停天数[{date_str}]'],
ascending=[False, True, False]
)
# 按出现次数排序分组
for concept in concept_counts['涨停原因']:
group_df = merged_df[merged_df['涨停原因'] == concept]
with st.expander(f"{concept}(出现次数:{len(group_df)})"):
st.dataframe(
group_df[[
'股票代码', '股票简称', '最新价', '最新涨跌幅', '涨停原因',
f'首次涨停时间[{date_str}]',
f'最终涨停时间[{date_str}]', f'涨停封单量[{date_str}]',
f'涨停封单额[{date_str}]', f'涨停类型[{date_str}]',
f'几天几板[{date_str}]',
f'a股市值(不含限售股)[{date_str}]'
]].reset_index(drop=True),
use_container_width=True
)
# 显示原始数据
st.subheader("原始数据(未展开)")
if st.checkbox("显示完整数据"):
st.dataframe(jj_df, use_container_width=True)
except Exception as e:
st.error(f"获取数据时发生错误:{str(e)}")
if __name__ == "__main__":
st.set_page_config(page_title="涨停分析", layout="wide")
app()备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。
题外话:
这几个月写技术文章写得多了,感觉没啥写的,所以自己最近闲暇时候在学习充电。 不管是各类爬虫(后续应该不会公开写了)、还是写各种技术指标分析、 还是写机器学习各类算法, 还是用AI模型辅助炒股,亦或者是量化交易理论, 网上也有类似的文章, 写雷同的文章感觉也没啥意思。 最近 有同学问到某个问题或者自己偶尔有个念头,就写一写。 文章写得比较随意,凑合着看。