Python实时股票行情数据获取库详解

1. Tushare Pro

  • 最受欢迎的中国股票数据接口之一
  • 提供实时行情、历史数据、基本面等多维度数据
  • 需要注册获取token
  • import tushare as ts
    ts.set_token('your_token')
    pro = ts.pro_api()
    
    # 获取实时行情
    df = ts.get_realtime_quotes('000001')  # 上证指数
    

    2. baostock

  • 免费的证券数据平台
  • 提供历史和实时行情数据
  • import baostock as bs
    import pandas as pd
    
    # 登陆系统
    lg = bs.login()
    # 获取实时数据
    rs = bs.query_history_k_data_plus("sh.600000",
        "date,time,code,open,high,low,close,volume,amount",
        start_date='2024-03-07', frequency="5")
    

    3. yfinance

  • Yahoo Finance的Python库
  • 主要用于获取美股数据
  • import yfinance as yf
    
    # 获取实时数据
    tsla = yf.Ticker("TSLA")
    data = tsla.history(period="1d", interval="1m")
    

    4. akshare

  • 开源财经数据接口库
  • 支持中国股市、美股、期货等多个市场
  • import akshare as ak
    
    # 获取A股实时行情
    stock_zh_a_spot_df = ak.stock_zh_a_spot()
    

    5. mplfinance

  • 用于绘制金融图表
  • 常与其他数据源配合使用
  • import mplfinance as mpf
    
    # 绘制K线图
    mpf.plot(data, type='candle', volume=True)
    

    主要特点比较

    1. Tushare Pro

  • 优点:数据全面、稳定、实时性好
  • 缺点:部分功能需要付费
  • 2. baostock

  • 优点:完全免费、使用简单
  • 缺点:数据延迟性较高
  • 3. yfinance

  • 优点:国际市场数据全面
  • 缺点:A股数据支持有限
  • 4. akshare

  • 优点:数据源丰富、免费
  • 缺点:可能需要配置代理
  • 使用建议

    1. A股数据获取

  • 建议使用Tushare Pro或akshare
  • 对实时性要求高的场景推荐Tushare Pro
  • 对成本敏感的场景推荐akshare
  • 2. 美股数据获取

  • 建议使用yfinance
  • 需要更专业数据可以考虑使用付费API
  • 3. 数据获取示例代码

    # 使用tushare获取实时数据
    import tushare as ts
    ts.set_token('your_token')
    pro = ts.pro_api()
    
    def get_realtime_data(stock_code):
        try:
            df = ts.get_realtime_quotes(stock_code)
            return df[['code', 'name', 'price', 'bid', 'ask', 'volume', 'amount']]
        except Exception as e:
            print(f"Error getting realtime data: {e}")
            return None
    
    # 使用baostock获取历史K线数据
    def get_historical_data(stock_code, start_date, end_date):
        bs.login()
        rs = bs.query_history_k_data_plus(stock_code,
            "date,code,open,high,low,close,volume,amount",
            start_date=start_date, end_date=end_date,
            frequency="d", adjustflag="3")
        data_list = []
        while (rs.error_code == '0') & rs.next():
            data_list.append(rs.get_row_data())
        result = pd.DataFrame(data_list, columns=rs.fields)
        bs.logout()
        return result
    
    # 使用akshare获取股票基本面数据
    def get_stock_fundamentals(stock_code):
        try:
            # 获取市盈率、市净率等指标
            pe_df = ak.stock_a_lg_indicator(symbol=stock_code)
            # 获取公司基本信息
            info_df = ak.stock_individual_info_em(symbol=stock_code)
            return pe_df, info_df
        except Exception as e:
            print(f"Error getting fundamental data: {e}")
            return None, None
    
    # 使用yfinance下载美股历史数据并绘制图表
    def plot_stock_chart(ticker_symbol, period="1y"):
        try:
            # 获取股票数据
            stock = yf.Ticker(ticker_symbol)
            hist = stock.history(period=period)
            
            # 使用mplfinance绘制K线图
            mpf.plot(hist, 
                    type='candle',
                    title=f'{ticker_symbol} Stock Price',
                    ylabel='Price ($)',
                    volume=True,
                    style='charles',
                    savefig='stock_chart.png')
        except Exception as e:
            print(f"Error plotting chart: {e}")
    
    # 实际使用示例
    if __name__ == "__main__":
        # A股实时数据示例
        sh_index = get_realtime_data('000001')  # 上证指数
        print("上证指数实时数据:")
        print(sh_index)
        
        # A股历史数据示例
        hist_data = get_historical_data("sh.600000", "2024-01-01", "2024-03-07")
        print("\n浦发银行历史数据:")
        print(hist_data.head())
        
        # 基本面数据示例
        pe_data, info_data = get_stock_fundamentals("000001")
        print("\n平安银行基本面数据:")
        if pe_data is not None:
            print(pe_data.head())
        
        # 美股图表示例
        plot_stock_chart("AAPL")  # 绘制苹果公司股票图表
    

    4. 高级应用场景

    数据分析和回测
    import pandas as pd
    import numpy as np
    
    def calculate_ma(data, window=20):
        """计算移动平均线"""
        return data['close'].rolling(window=window).mean()
    
    def simple_strategy(data):
        """简单的均线交易策略"""
        data['MA20'] = calculate_ma(data, 20)
        data['MA60'] = calculate_ma(data, 60)
        
        # 生成交易信号
        data['Signal'] = 0
        data.loc[data['MA20'] > data['MA60'], 'Signal'] = 1  # 买入信号
        data.loc[data['MA20'] < data['MA60'], 'Signal'] = -1 # 卖出信号
        
        return data
    
    # 使用示例
    stock_data = get_historical_data("sh.600000", "2023-01-01", "2024-03-07")
    if not stock_data.empty:
        stock_data['close'] = stock_data['close'].astype(float)
        result = simple_strategy(stock_data)
        print("\n策略信号:")
        print(result[['date', 'close', 'MA20', 'MA60', 'Signal']].tail())
    
    实时监控预警
    import time
    from datetime import datetime
    
    def price_alert(stock_code, target_price, check_interval=60):
        """
        价格预警监控
        :param stock_code: 股票代码
        :param target_price: 目标价格
        :param check_interval: 检查间隔(秒)
        """
        while True:
            try:
                current_data = get_realtime_data(stock_code)
                if current_data is not None:
                    current_price = float(current_data['price'].iloc[0])
                    print(f"当前时间: {datetime.now()}")
                    print(f"当前价格: {current_price}")
                    
                    if current_price >= target_price:
                        print(f"警报!{stock_code} 已达到目标价格 {target_price}")
                        break
                        
                time.sleep(check_interval)
                
            except Exception as e:
                print(f"监控出错: {e}")
                break
    
    # 使用示例
    # price_alert('000001', 16.5)  # 监控平安银行价格
    

    5. 注意事项与最佳实践

    1. 数据获取频率限制
  • Tushare Pro: 根据积分等级限制
  • baostock: 建议请求间隔>3秒
  • akshare: 建议请求间隔>1秒
    1. 错误处理
  • 始终包含异常处理
  • 检查返回数据的完整性
  • 考虑网络超时情况
    1. 数据存储
  • 考虑使用数据库存储历史数据
  • 定期备份重要数据
  • 建议使用SQLite或MySQL
    1. 性能优化
  • 使用异步请求处理大量数据
  • 实现数据缓存机制
  • 批量处理而非单条处理
  • 6. 官方文档和资源链接

    Tushare Pro
  • 官方网站:https://tushare.pro
  • 官方文档:https://tushare.pro/document/1
  • Github仓库:https://github.com/waditu/tushare
  • 社区论坛:https://tushare.pro/community
  • baostock
  • 官方网站:http://baostock.com
  • API文档:http://baostock.com/baostock/index.php/Python_API%E6%96%87%E6%A1%A3
  • Github仓库:https://github.com/baostock/baostock
  • yfinance
  • Github仓库和文档:https://github.com/ranaroussi/yfinance
  • PyPI页面:https://pypi.org/project/yfinance/
  • Yahoo Finance:https://finance.yahoo.com/
  • akshare
  • 官方文档:https://www.akshare.xyz/
  • Github仓库:https://github.com/akfamily/akshare
  • 示例教程:https://www.akshare.xyz/tutorial.html
  • mplfinance
  • Github仓库和文档:https://github.com/matplotlib/mplfinance
  • 官方文档:https://matplotlib.org/mplfinance/
  • 示例图库:https://matplotlib.org/mplfinance/examples.html
  • 7. 安装指南

    所有库都可以通过pip安装:

    # Tushare Pro
    pip install tushare
    
    # baostock
    pip install baostock
    
    # yfinance
    pip install yfinance
    
    # akshare
    pip install akshare
    
    # mplfinance
    pip install mplfinance
    

    对于国内用户,建议使用镜像源加速安装:

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
    

    8. 社区支持

  • Tushare Pro:提供付费技术支持和社区论坛
  • akshare:有活跃的GitHub Issues和QQ群支持
  • yfinance:主要通过GitHub Issues提供支持
  • baostock:提供邮件支持和GitHub Issues
  • mplfinance:通过GitHub Issues和Stack Overflow提供支持
  • 作者:老大白菜

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python实时股票行情数据获取库详解

    发表回复