好的,这是一份关于 qstock
库的详细中文教程。qstock
是一个专注于 A 股的 Python 量化数据获取和可视化库,旨在简化数据流程,方便进行量化分析。
qstock 详细中文教程
目录
1. 引言:什么是 qstock?
qstock
是一个由国内开发者维护的 Python 库,专注于中国 A 股市场。它的主要目标是提供一个简洁、易用的接口来获取股票、指数、基金等的行情数据、基本面数据(部分),并内置了强大的可视化功能(基于 Plotly),可以直接绘制交互式的 K 线图和其他图表。它通常整合了多个免费的数据源(如新浪财经、东方财富、腾讯财经等),为用户屏蔽了底层数据获取的复杂性。
主要面向用户:
- 量化交易爱好者
- 金融数据分析师
- 需要快速获取和可视化 A 股数据的开发者或研究人员
2. 主要特点
- 专注 A 股: 主要面向中国股票市场。
- 易于使用: API 设计简洁直观,易于上手。
- 数据获取: 支持获取历史行情(日/周/月线)、实时行情、股票列表、指数列表等。
- 内置可视化: 使用 Plotly 作为后端,可以方便地绘制交互式 K 线图,并支持添加常用技术指标(MA, MACD, RSI等)。
- 数据格式: 返回的数据通常是 Pandas DataFrame 格式,方便后续处理和分析。
- 整合多数据源: 尝试从多个公开渠道获取数据,提高数据的可用性。
3. 安装
通过 pip 可以方便地安装 qstock
:
pip install qstock -U --no-cache-dir
-U
: 表示如果已安装则升级到最新版本。--no-cache-dir
: 避免使用缓存,确保安装的是最新代码(有时 Pypi 缓存会导致问题)。
依赖: qstock
会自动安装其依赖库,主要包括 pandas
, plotly
, requests
, lxml
等。
4. 核心功能与使用
首先,导入 qstock
库,通常简写为 qs
:
import qstock as qs
import pandas as pd # 通常也会用到 pandas
4.1 获取股票/指数列表
-
获取 A 股列表:
stock_list = qs.stock_list() print("A 股列表 (部分):") print(stock_list.head()) # 输出通常包含代码(code)、名称(name)、所属市场(market)等列
-
获取指数列表:
index_list = qs.index_list() print("\n指数列表 (部分):") print(index_list.head())
-
获取其他列表 (基金、港股、美股等,取决于库实现):
# 检查库是否支持,例如: # fund_list = qs.fund_list() # hk_stock_list = qs.hk_stock_list()
4.2 获取历史行情数据 (K线)
这是最常用的功能之一,通常使用 qs.get_price()
函数。
# 获取单只股票日线数据 (默认前复权)
# code: 股票代码,格式通常是 '股票代码.市场' (如 '600000.SH') 或直接 '600000' (库会自动判断)
# freq: 频率, 'D' (日线), 'W' (周线), 'M' (月线), '5m', '15m', '30m', '60m' (分钟线,部分数据源支持)
# start_date: 开始日期 'YYYY-MM-DD'
# end_date: 结束日期 'YYYY-MM-DD'
# fq: 复权类型, 'qfq' (前复权), 'hfq' (后复权), None (不复权)
# 获取浦发银行 (600000) 2023年的日线数据 (前复权)
code = '600000'
start = '2023-01-01'
end = '2023-12-31'
df_daily = qs.get_price(code, start_date=start, end_date=end, freq='D', fq='qfq')
print(f"\n{code} {start} 到 {end} 日线数据 (前复权, 部分):")
print(df_daily.head())
print(df_daily.tail())
# 获取指数数据,例如上证指数 (000001 或 sh)
sh_index = qs.get_price('sh', start_date=start, end_date=end, freq='D')
print("\n上证指数 2023年日线数据 (部分):")
print(sh_index.head())
# 获取周线数据
df_weekly = qs.get_price(code, start_date='2022-01-01', end_date=end, freq='W')
print(f"\n{code} 周线数据 (部分):")
print(df_weekly.head())
返回的 DataFrame 通常包含以下列:
date
或 索引: 日期open
: 开盘价close
: 收盘价high
: 最高价low
: 最低价volume
: 成交量amount
: 成交额 (有时)turnover
或turn
: 换手率 (有时)
4.3 获取实时行情数据
qstock
通常提供获取当前最新行情快照的功能。
- 获取单只或多只股票的实时行情:
返回的 DataFrame 通常包含:代码(code)、名称(name)、当前价(price)、涨跌幅(change_pct)、成交量(volume)、成交额(amount)、最高(high)、最低(low)、开盘(open)、昨收(prev_close) 等字段。# 获取单只股票实时行情 realtime_quote = qs.realtime_data('600519') # 贵州茅台 print("\n贵州茅台 (600519) 实时行情:") print(realtime_quote) # 获取多只股票实时行情 codes = ['600000', '000001', '300750'] # 浦发银行, 平安银行, 宁德时代 realtime_quotes_multi = qs.realtime_data(codes) print("\n多只股票实时行情:") print(realtime_quotes_multi)
4.4 数据可视化 (K线图)
qstock
的强大之处在于其内置的可视化功能,使用 qs.plot_k()
。
# 绘制单只股票的 K 线图
# code: 股票代码
# data: 可选,如果已获取 DataFrame,可以直接传入,否则函数会内部调用 get_price
# start_date, end_date: 如果不传入 data,则需要指定时间范围
# title: 图表标题
# indicators: 要添加的技术指标列表,如 ['MA', 'MACD', 'RSI']
# mav: 移动平均线的周期列表,如 [5, 10, 20]
# 直接根据代码绘制 (内部获取数据)
qs.plot_k('600000', start_date='2023-01-01', end_date='2023-12-31',
title='浦发银行 (600000) 日K线图 (2023)',
indicators=['MA', 'MACD'], mav=[5, 10, 20])
# 先获取数据,再绘制 (推荐,更灵活)
df_maotai = qs.get_price('600519', start_date='2023-06-01', end_date='2023-12-31')
qs.plot_k(data=df_maotai, code='600519', # code 参数主要用于图例显示
title='贵州茅台 (600519) 日K线图 (2023下半年)',
indicators=['MACD', 'RSI'], mav=[10, 30])
# 绘制指数 K 线图
sh_index_data = qs.get_price('sh', start_date='2023-01-01', end_date='2023-12-31')
qs.plot_k(data=sh_index_data, code='sh', title='上证指数 (2023)', indicators=['MA'], mav=[20, 60, 120])
plot_k
会生成一个交互式的 Plotly 图表,通常会直接在 Jupyter Notebook 或浏览器中显示。你可以缩放、平移、查看具体数值等。
4.5 计算技术指标
qstock
可能内置了一些常用指标的计算,通常在 get_price
或 plot_k
中直接使用。如果需要更复杂的指标或自定义计算,可以利用返回的 Pandas DataFrame 结合 TA-Lib
或 pandas-ta
等库。
-
通过
get_price
获取带指标的数据 (部分版本/数据源可能支持):# 尝试在获取数据时直接计算 MA (具体参数看文档或尝试) # 注意:这个功能不一定所有版本的 qstock 或其依赖的数据接口都支持 # df_with_ma = qs.get_price('600000', start_date=start, end_date=end, indicators=['MA'], mav=[5, 10]) # print(df_with_ma.head())
-
使用
pandas-ta
计算指标 (更通用的方法):# 如果未安装 pandas-ta: pip install pandas-ta import pandas_ta as ta # 获取数据 df = qs.get_price('000001', start_date='2023-01-01', end_date='2023-12-31') # 平安银行 # 计算 SMA (简单移动平均) df.ta.sma(length=10, append=True) # 计算10日SMA并添加到 DataFrame,列名为 SMA_10 df.ta.sma(length=20, append=True) # 计算20日SMA并添加到 DataFrame,列名为 SMA_20 # 计算 MACD df.ta.macd(append=True) # 计算默认参数的 MACD,添加 MACD_12_26_9, MACDh_12_26_9, MACDs_12_26_9 列 # 计算 RSI df.ta.rsi(append=True) # 计算默认14日 RSI,添加 RSI_14 列 print("\n平安银行数据 + TA 指标:") print(df.tail()) # 你可以将计算好指标的 DataFrame 传递给 qs.plot_k() # 注意:plot_k 可能无法自动识别 pandas-ta 添加的列作为指标绘图, # 但 K 线本身会绘制,你可能需要用 Plotly 或其他库自行绘制指标线。 # 或者,直接在 plot_k 中使用它内置支持的指标 ['MA', 'MACD', 'RSI'] 等。 qs.plot_k(data=df.iloc[-100:], code='000001', title='平安银行 K线 + 手动计算的指标 (部分)', indicators=['MA'], mav=[10, 20]) # plot_k 仍按其内置方式画 MA
4.6 获取其他数据
qstock
的不同版本或其依赖的数据源可能还支持获取其他类型的数据,例如:
- 龙虎榜数据:
qs.top_list()
或类似函数。 - 行业分类数据:
qs.industry_list()
,qs.get_industry()
。 - 概念题材数据:
qs.concept_list()
,qs.get_concept()
。 - 基本面数据: 如
qs.get_fundamentals()
(可能需要特定数据源支持,如 Tushare,可能需要 token)。 - 新闻公告:
qs.get_news()
。
使用这些功能前,建议查阅 qstock
的最新文档或使用 help(qs)
、dir(qs)
查看可用的函数。
5. 常用代码示例
示例1:获取单只股票日线数据并绘制K线图
import qstock as qs
# 获取宁德时代 (300750) 2023年至今的数据
code = '300750'
df_catl = qs.get_price(code, start_date='2023-01-01') # end_date 默认为今天
# 绘制 K 线图,带 MA(5, 10, 20, 60) 和 MACD 指标
qs.plot_k(data=df_catl, code=code, title=f'{code} - 宁德时代 日K线图',
indicators=['MA', 'MACD'], mav=[5, 10, 20, 60])
示例2:获取多只股票收盘价并比较
import qstock as qs
import pandas as pd
import plotly.express as px # 使用 plotly express 绘图
codes = ['600519', '000858', '600809'] # 茅台, 五粮液, 山西汾酒
start = '2023-01-01'
# 创建一个空的 DataFrame 来存储收盘价
close_prices = pd.DataFrame()
# 循环获取每只股票的数据
for code in codes:
try:
df = qs.get_price(code, start_date=start, fq='qfq') # 使用前复权数据
if not df.empty:
# 获取股票名称用于图例 (假设实时数据接口可用)
stock_info = qs.realtime_data(code)
stock_name = stock_info['name'].iloc[0] if not stock_info.empty else code
close_prices[f'{stock_name}_{code}'] = df['close']
else:
print(f"Warning: No data retrieved for {code}")
except Exception as e:
print(f"Error retrieving data for {code}: {e}")
# 归一化处理 (将起点设为1,方便比较相对涨跌幅)
normalized_prices = close_prices / close_prices.iloc[0]
# 使用 Plotly Express 绘制线图
fig = px.line(normalized_prices, title=f'白酒股走势比较 (自 {start} 起, 归一化)')
fig.show()
示例3:获取指数数据并添加移动平均线
import qstock as qs
# 获取创业板指数 (399006 或 cyb) 2022年至今数据
index_code = 'cyb'
start_date = '2022-01-01'
df_cyb = qs.get_price(index_code, start_date=start_date)
# 绘制 K 线图,包含 20 日和 60 日均线
qs.plot_k(data=df_cyb, code=index_code, title='创业板指数 K 线图',
indicators=['MA'], mav=[20, 60])
示例4:获取实时行情快照
import qstock as qs
import time
codes_to_watch = ['sh', 'sz', 'cyb', '601318', '000002'] # 上证, 深证, 创业板, 中国平安, 万科A
print("实时行情快照:")
try:
realtime_df = qs.realtime_data(codes_to_watch)
print(realtime_df[['code', 'name', 'price', 'change_pct', 'volume', 'amount']])
except Exception as e:
print(f"获取实时行情失败: {e}")
# 可以结合循环实现简单监控
# while True:
# try:
# rt_data = qs.realtime_data(codes_to_watch[3:]) # 只看个股
# print("\n--- 更新 ---")
# print(rt_data[['name', 'price', 'change_pct']])
# time.sleep(10) # 每10秒刷新一次
# except KeyboardInterrupt:
# print("停止监控.")
# break
# except Exception as e:
# print(f"获取失败: {e}")
# time.sleep(5)
6. 注意事项与最佳实践
- 股票代码格式: 留意
qstock
接受的代码格式,通常是xxxxxx
或带市场后缀如xxxxxx.SH
/xxxxxx.SZ
。指数代码可能用简称如sh
,sz
,cyb
或官方代码000001
,399001
,399006
。 - 数据频率与时间范围: 获取分钟线数据时,时间跨度不宜过长,否则可能请求失败或数据量过大。日线、周线、月线数据则可以获取较长时间范围。
- 复权类型: 分析个股时,通常使用前复权 (
qfq
) 数据来消除分红送股对价格连续性的影响。指数本身不存在复权问题。 - 数据更新: 实时行情有一定延迟(通常几秒到几十秒)。历史日线数据通常在收盘后更新。
- 网络问题: 数据获取依赖网络连接和数据源服务器状态,有时可能会因网络波动或数据源限制导致获取失败。建议添加适当的错误处理 (
try-except
)。 - API 变更: 开源库的 API 可能会随着版本更新而变化。如果遇到问题,检查
qstock
的官方文档或 GitHub 仓库是否有更新说明。 - 数据量限制: 频繁大量请求数据可能会触发数据源的访问频率限制。合理安排请求次数和间隔。
- 数据准确性: 免费数据源的数据质量可能不如付费数据源,偶尔可能出现数据错误或缺失,使用时需注意甄别。
7. 数据源说明
qstock
通常聚合了以下一个或多个公开免费的数据源:
- 新浪财经 (Sina Finance): 提供实时行情、部分历史数据。
- 东方财富 (East Money): 提供实时行情、历史数据、龙虎榜、基本面等。
- 腾讯财经 (Tencent Finance): 提供实时行情、历史数据。
- 网易财经 (NetEase Finance): 提供历史数据。
- 雪球 (Xueqiu): 提供实时行情等。
qstock
库内部会处理这些数据源的选择和数据清洗。用户通常不需要关心具体是从哪个源获取的,除非遇到特定数据源的问题。
8. 资源链接
- PyPI 页面: https://pypi.org/project/qstock/ (可以查看最新版本和基本信息)
- GitHub 仓库: (请在 PyPI 页面或通过搜索引擎查找
qstock
的 GitHub 仓库地址,通常包含更详细的文档、示例和问题反馈区)
希望这份详细的 qstock
教程能帮助你快速上手并利用它进行 A 股数据的获取和分析!在使用过程中,结合官方文档和实际尝试是最好的学习方式。