Py学习  »  Python

【Python技术】A股涨停最高板多个情况展示并附上表格明细

灵度智能 • 3 月前 • 597 次点击  
说下为啥重复写最高板的例子。 先说下背景
今天在群聊看他们发的图片注意到,之前写的最高板程序有个比较大的问题, 分析的当天涨停最高板可能有多个,而我只取了第1条,  这样分析可能会误事 , 还是要改一下逻辑。
怎么理解这句话呢, 就以昨天为例子说明, 昨天展示的金安国纪5板, 其实 2025.1.20 金安国纪、 冀凯股份、爱慕股份 3只股票都是5板。 今天只有冀凯股份 晋级。

完整代码如下:
import streamlit as st
from datetime import datetime, timedelta
import pywencai
import pandas as pd
import plotly.graph_objects as go
import pandas_market_calendars as mcal
from contextlib import contextmanager

@contextmanager
def st_spinner(text="处理中..."):
    try:
        with st.spinner(text):
            yield
    finally:
        pass

def app():
    # 设置页面标题
    st.title('涨停股最高板分析')

    with st_spinner("正在获取和处理数据,请稍候..."):
        # 获取当前日期并往前推20天(增加天数以便滑动)
        end_date = datetime.now()
        dates = [(end_date - timedelta(days=x)).strftime('%Y%m%d'for x in range(20)]

        # 获取中国的交易日历
        nyse = mcal.get_calendar('XSHG')
        trading_schedule = nyse.schedule(start_date=min(dates), end_date=max(dates))
        trading_days = trading_schedule.index.strftime('%Y%m%d').tolist()

        # 存储结果的列表
        results = []

        # 循环获取每个日期的数据,仅在交易日执行
        for date in trading_days:
            query = f"非ST,{date}连续涨停天数排序,涨停原因"
            try:
                data = pywencai.get(query=query)
                if not data.empty:
                    # 获取最高连续涨停天数
                    max_days = data[f'连续涨停天数[{date}]'].max()
                    # 筛选出所有最高连续涨停天数的股票
                    highest_stocks = data[data[f'连续涨停天数[{date}]'] == max_days]
                    for _, row in highest_stocks.iterrows():
                        results.append({
                            '日期': datetime.strptime(date, '%Y%m%d'),
                            '股票简称': row['股票简称'],
                            '股票代码': row['股票代码'],
                            '连续涨停天数': row[f'连续涨停天数[{date}]'],
                            '涨停原因': row[f'涨停原因类别[{date}]']
                        })
            except Exception as e:
                st.error(f"查询 {date} 数据时出错: {e}")

        # 检查是否有数据
        if results:
             # 创建一个DataFrame来存储所有数据
            df_all = pd.DataFrame(results)

            # 按日期排序
            df_filtered = df_all.sort_values('日期', ascending=True)

            # 创建一个字典来存储每个日期的股票
            date_stocks = {}
            for _, row in df_filtered.iterrows():
                date = row['日期'].strftime('%Y-%m-%d')
                if date not in date_stocks:
                    date_stocks[date] = []
                date_stocks[date].append(row['股票简称'])

            # 创建图表数据
            x = []
            y = []
            text = []
            hover_text = []

            for date, stocks in date_stocks.items():
                for i, stock in enumerate(stocks):
                    stock_data = df_filtered[(df_filtered['日期'].dt.strftime('%Y-%m-%d') == date) & (
                                df_filtered['股票简称'] == stock)].iloc[0]
                    x.append(date)
                    y.append(i)
                    text.append(f"{stock}({stock_data['连续涨停天数']}板)")

                    hover_text.append(f"{stock}({stock_data['股票代码']})
连续涨停天数: {stock_data['连续涨停天数']}
涨停原因: {stock_data['涨停原因']}"
)

            # 创建图表
            fig = go.Figure()

            fig.add_trace(go.Scatter(
                x=x,
                y=y,
                mode='markers+text',
                marker=dict(size=10, color='red'),
                text=text,
                textposition='top center',
                hovertext=hover_text,
                hoverinfo='text'
            ))

            # 更新布局
            fig.update_layout(
                title='最高涨停股分布',
                xaxis_title='日期',
                yaxis_title='股票',
                xaxis=dict(
                    type='category',
                    tickangle=45
                ),
                yaxis=dict(
                    showticklabels=False,
                    showgrid=False
                ),
                hovermode='closest',
                showlegend=False,
                height=600,
                margin=dict(l=50, r=50, t=80, b=100),
            )

            # 全屏展示图表
            st.plotly_chart(fig, use_container_width=True)

            df_table = df_all.sort_values('日期', ascending=False)

            st.subheader("最高板股票详情")
            for date, group in df_table.groupby('日期', sort=False):
                st.write(f"日期: {date.strftime('%Y-%m-%d')}")
                st.dataframe(group[['股票简称''股票代码''连续涨停天数''涨停原因']])
                st.write("---")
        else:
            st.warning("没有找到符合条件的数据")

if __name__ == "__main__":
    st.set_page_config(layout="wide")
    app()

之前的折线图想了很久,调整了几个方案, 文本基本是重叠或不好看, 所以更改了下 展示方式。
为了直观显示某天的概念, 我增加了表格显示,方便看清楚当天最高板的涨停原因。 貌似和我之前分析连板分析有点重叠了。这个是按照 最高板多个日期维度分析, 之前的涨停分析是 当天和上一交易日对比分析。 

这2周行情确实不错, 每天都能赚个鸡腿钱。为了年后赚大钱,下面打个广告。未开户或费率较高的同学可以看一下。

QMT量化交易系统,全称为迅投QMT极速策略交易系统,是一款专为券商、期货公司、信托等机构的高净值客户以及专业投资者设计的综合性量化交易平台。它集成了行情显示、策略研究、产品交易及风险控制等多种功能于一体,为投资者提供了高效、智能的交易解决方案。

1.高速行情

QMT系统提供实时、准确的行情数据,覆盖沪深两市、国内五大期货交易所等多个市场,支持多种交易品种,如股票、期货、期权、两融、港股通、可转债、ETF等。

2.智能策略

系统支持多种编程语言(如Python、VBA等)进行策略编写,投资者可以根据自己的需求开发个性化的量化交易策略。同时,系统还提供了丰富的策略模板和函数库,降低了策略开发的门槛。

3.策略回测

QMT系统内置了强大的回测引擎,投资者可以利用历史数据对策略进行回测,评估策略的有效性和稳定性。回测结果包括收益率、风险指标等详细信息,为投资者提供科学的决策依据。

4.自动化交易

系统支持策略自动执行,投资者只需设定好策略参数,系统即可根据市场情况自动进行买卖操作,极大地提高了交易效率和准确性。

5.多维度风控

QMT系统提供了多层次并行的风控处理方式,可以对单一账号、多个账号分别同时进行不同规则的风控检查,大幅降低交易延迟、提高风控执行效率。同时,系统还支持多种风险管理工具,如资金管理、仓位控制、止损止盈等,帮助投资者有效控制风险。

6.行情展示

QMT系统提供了灵活多样的行情展示方式,包括K线图、分时图、报价表等多种形式。投资者可以根据个人喜好和市场分析需求选择合适的展示方式。同时,系统还支持多周期、多品种的行情数据查询和下载,方便投资者进行深度分析。

以下是我了解到的的一家券商,佣金以及双融利率都是市场很低的水平,并且赠送QMT使用教程,具体情况如下(文末附赠联系方式):

同时附上不同券商佣金费率的收费对比:

不管对开户感不感兴趣都可以加我。 前几天建了3个群, 编程交流、 AI交流、 投资交流。 加我进群交流







Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/178350
 
597 次点击