最近听粉丝留言,我折腾了一个小项目:A股行情查询与分析工具。(文末附源码)
先放上运行效果👇
✨ 功能概览
整个工具由四个核心文件组成:
stock_fetcher.py:核心数据获取,封装了 Baostock + Akshare 双数据源;utils.py:通用工具函数(格式化、汇总、交易状态判断等);config.py:全局配置(常量、显示规则等);app.py:主入口,调用查询并展示结果。
实现的主要功能包括:
- 查询多只股票行情(最多 10 个)
 - 自动兜底:Baostock 不可用时切换 Akshare
 - 计算 1~10 日累计收益率
 - 格式化展示:金额带“万/亿”,涨跌幅带正负号和颜色
 
🔍 技术解析
1. 多数据源兜底机制
核心逻辑在 get_stock_complete_data:
def get_stock_complete_data(self, stock_code: str) -> Optional[Dict]:
    if self.baostock_logged_in:
        data = self._fetch_with_baostock(stock_code)
        if data:
            return data
    return self._fetch_with_akshare(stock_code)
- 优先尝试 Baostock(数据更全)
 - 如果失败,自动回退到 Akshare
 - 避免因为单一接口挂掉而导致整个程序不可用
 
👉 这是一种 高可用设计,相当于给行情接口加了“双保险”。
2. 频率控制与请求重试
行情接口容易被刷爆,所以加了 _rate_limit 和 requests 的重试策略:
retry_strategy = Retry(
    total=max_retries,
    status_forcelist=[429, 500, 502, 503, 504],
    backoff_factor=1
)
- 限速:两次请求之间间隔 0.5s;
 - 失败重试:遇到 429/500 等错误时自动重试;
 - 退避策略:每次重试间隔逐渐延长,避免压垮接口。
 
👉 这保证了工具能长期稳定运行。
3. 累计收益率的计算
在 calculate_cumulative_returns 里:
cumulative_return = ((end_price / start_price) - 1) * 100
它会计算 过去 1~10 日的累计收益率。
- 如果你在写量化策略,可以直接用它来做“短期趋势筛选”;
 - 这一步其实就是小型“策略引擎”的雏形。
 
4. 数据格式化与可读性优化
在 utils.py 里:
- 金额自动转“万/亿”
 - 百分比自动加正负号
 - 涨跌幅配红绿样式
 
def format_currency(amount: float) -> str:
    if abs(amount) >= 1e8:
        return f"{amount/1e8:.2f}亿"
    elif abs(amount) >= 1e4:
        return f"{amount/1e4:.2f}万"
    return f"{amount:.2f}"
👉 数据可读性大幅提升,避免一长串没意义的大数字。
5. 整体市场温度计
不仅能查单只股票,还能统计市场整体表现:
metrics = {
    'total_stocks': len(data_list),
    'positive_count': len([x for x in changes if x > 0]),
    'avg_change': np.mean(changes),
    'total_amount': sum(amounts),
}
最终可以得到:
- 市场上涨家数 vs 下跌家数
 - 平均涨跌幅
 - 成交总额、市值规模
 
👉 相当于做了一个迷你版的 市场热力图。
✅ 总结
这个项目总结:
- 多数据源兜底 → 保证可用性
 - 限速与重试机制 → 保证稳定性
 - 格式化展示 → 提升可读性
 - 市场整体指标 → 从查询走向分析
 
📌 附源码
项目由5个文件组成,完整项目可以直接复制到本地运行,运行streamlit run app.py –server.port 8501即可。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
    











![表情[chi]-寻找资源网](http://www.seekresource.com/wp-content/themes/zibll/img/smilies/chi.gif)



暂无评论内容