前置知识:A 股市场基础知识¶
本篇导览
| 项目 | 说明 |
|---|---|
| 适合 | 未熟悉 A 股代码规则、T+1、涨跌停、税费与主要指数的读者 |
| 预计 | 约 45 分钟 |
| 价值 | 有助于正确理解回测假设与 eqlib 中的成交限制 |
本文面向没有炒过 A 股、或需要了解中国股市规则的读者。理解这些规则能帮助你写出更符合实际的策略,也能正确解读回测报告中的各项指标。
目录¶
- 什么是 A 股
- 股票代码格式与交易所
- 交易时间
- T+1 交易制度
- 涨跌停板制度
- ST 股与退市风险
- 交易成本:手续费与税
- 主要市场指数
- 基本面数据:PE / PB / ROE 等
- 资金流向
- 这些规则在 eqlib 中的体现
- 下一步
1. 什么是 A 股¶
A 股(A-Share) 是在中国大陆的上海证券交易所(SSE)和深圳证券交易所(SZSE)上市、以人民币计价的股票。
| 类型 | 说明 |
|---|---|
| A 股 | 中国大陆上市,人民币计价,本文的焦点 |
| H 股 | 同一家公司在香港上市的股票,港元计价 |
| B 股 | 历史遗留,外币计价,交易冷清 |
| 美股 ADR | 中概股在美国上市的存托凭证 |
EasyQuant 只支持 A 股,不支持港股、美股、期货、期权、加密货币。
2. 股票代码格式与交易所¶
2.1 代码规则¶
A 股代码为 6 位数字,前缀决定上市地和板块:
| 前缀 | 交易所 | 板块 | 例子 |
|---|---|---|---|
600xxx 601xxx 603xxx 605xxx |
上海交易所(SSE) | 沪市主板 | 601390(工商银行)600519(贵州茅台) |
000xxx 001xxx |
深圳交易所(SZSE) | 深市主板 | 000858(五粮液) |
002xxx 003xxx |
深圳交易所 | 中小板(已并入主板) | 002415(海康威视) |
300xxx 301xxx |
深圳交易所 | 创业板(GEM) | 300750(宁德时代) |
688xxx 689xxx |
上海交易所 | 科创板(STAR) | 688981(中芯国际) |
8xxxxx |
全国股转系统 | 北交所 | — |
2.2 指数代码格式(带交易所后缀)¶
在 eqlib 中,指数代码需要加交易所后缀:
| 指数 | 代码 | 备注 |
|---|---|---|
| 沪深300 | 000300.XSHG |
最常用的基准 |
| 上证综指 | 000001.XSHG |
反映沪市整体 |
| 深证成指 | 399001.XSHE |
反映深市整体 |
| 中证500 | 000905.XSHG |
中等市值股票 |
| 创业板指 | 399006.XSHE |
创业板整体 |
| 科创50 | 000688.XSHG |
科创板头部 |
| 上证50 | 000016.XSHG |
沪市蓝筹 |
规则(来自项目内部):
-000xxx.XSHG= 上海指数(如沪深300)
-399xxx.XSHE= 深圳指数(如深证成指、创业板指)
-000xxx.XSHE或纯000xxx= 深圳股票(如五粮液000858)
# 设置基准
set_benchmark('000300.XSHG') # 沪深300
# 获取指数成分股
from eqlib import get_index_stocks
hs300_stocks = get_index_stocks('000300.XSHG')
3. 交易时间¶
A 股交易分为两个时段(北京时间):
| 时段 | 时间 | 说明 |
|---|---|---|
| 集合竞价 | 9:15–9:25 | 提前报价,确定开盘价 |
| 早盘 | 9:30–11:30 | 连续竞价 |
| 午休 | 11:30–13:00 | 不交易 |
| 午盘 | 13:00–15:00 | 连续竞价 |
eqlib 中的影响:
- 日线回测以 9:30 开盘价作为订单成交价(下一个交易日)
- 分钟线从 09:30 到 15:00,不含午休
- 节假日(春节、国庆等)无交易日
4. T+1 交易制度¶
T+1 是 A 股最重要的规则之一:
当天买入的股票,必须等到下一个交易日才能卖出。
对比美股(T+3 直到 2024 年改为 T+1,且有限制短线操作);香港股市是 T+2 结算。
对策略的影响¶
# 在回测中:eqlib 自动处理 T+1 限制
# 今天买入 → 今天 closeable_amount = 0 → 明天 closeable_amount = 买入股数
def market_open(context):
position = context.portfolio.positions.get('601390')
if position:
# closeable_amount = 可立即卖出的股数(T+1 限制后的数量)
can_sell = position.closeable_amount
# 刚买入的不计入 can_sell
策略影响:不能当天"高卖低买"(日内 T+0 操作),必须持有到次日才能卖出,也不允许"抢帽子"(短线高频操作)。
5. 涨跌停板制度¶
A 股单日价格涨跌幅有限制:
| 板块 | 限制 |
|---|---|
| 沪深主板(含中小板) | ±10% |
| 创业板(GEM) | ±20% |
| 科创板(STAR) | ±20% |
| ST / *ST 股票 | ±5% |
| 北交所 | ±30% |
对策略的影响¶
# 涨停的股票当天无法买入(没有卖出方)
# 跌停的股票当天无法卖出(没有买入方)
# eqlib 回测会忽略流动性限制,实盘中需要注意
# 正确做法:过滤掉当天已涨停的股票
hist = attribute_history(security, 2, '1d', ['close'])
prev_close = hist['close'].iloc[-2]
today_close = hist['close'].iloc[-1]
limit_up = today_close >= prev_close * 1.099 # 接近涨停
if limit_up:
continue # 跳过,不买涨停股
6. ST 股与退市风险¶
ST 的含义¶
| 标记 | 含义 |
|---|---|
ST |
特别处理(Special Treatment):公司连续两年亏损或净资产为负 |
*ST |
退市风险警示:连续三年亏损,面临退市 |
S*ST |
正在被整顿 |
ST 股有以下特点: - 涨跌停幅度从 ±10% 压缩到 ±5% - 流动性差,容易暴力下跌 - 信息不透明,风险极高
在策略中过滤 ST 股¶
from eqlib import filter_st_stocks
candidates = ['601390', '600519', '000858', '000001']
# 过滤掉 ST / *ST 股票
safe_stocks = filter_st_stocks(candidates)
7. 交易成本:手续费与税¶
7.1 标准费率(2024 年)¶
| 费用 | 买入 | 卖出 | 说明 |
|---|---|---|---|
| 佣金(Brokerage Commission) | 0.02%–0.03% | 0.02%–0.03% | 向券商支付,最低 5 元 |
| 印花税(Stamp Tax) | 0 | 0.05% | 向国家税务总局缴纳(2023 年 8 月从 0.1% 降至 0.05%) |
| 过户费(Transfer Fee,仅沪市) | 0.00002% | 0.00002% | 极小,可忽略 |
7.2 单次买卖的实际成本¶
以 10 万元买卖为例(佣金 0.03%,最低 5 元): - 买入:10 万 × 0.03% = 30 元 - 卖出:10 万 × 0.03% + 10 万 × 0.05% = 30 + 50 = 80 元 - 一个来回总成本:110 元(0.11%)
频繁交易会严重侵蚀收益!
7.3 在 eqlib 中设置交易成本¶
def initialize(context):
set_order_cost(OrderCost(
open_tax=0, # 买入印花税(目前为 0)
close_tax=0.0005, # 卖出印花税 0.05%(2024 年现行)
open_commission=0.0003, # 买入佣金 0.03%
close_commission=0.0003, # 卖出佣金 0.03%
min_commission=5, # 最低佣金 5 元
))
如果不设置,eqlib 默认不收手续费——这会让回测结果虚高!务必设置合理费率。
8. 主要市场指数¶
| 指数 | 代码(eqlib 格式) | 成分股 | 常用场景 |
|---|---|---|---|
| 沪深300 | 000300.XSHG |
300 只大型蓝筹股 | 最常用基准 |
| 中证500 | 000905.XSHG |
500 只中等市值股 | 中盘策略基准 |
| 上证综指 | 000001.XSHG |
全部沪市股票 | 反映整体市场 |
| 创业板指 | 399006.XSHE |
创业板头部 100 只 | 成长股策略基准 |
| 科创50 | 000688.XSHG |
科创板前 50 | 科技策略基准 |
选哪个做基准?¶
- 主板蓝筹策略:沪深300(
000300.XSHG) - 中小盘策略:中证500(
000905.XSHG) - 成长/创新策略:创业板指(
399006.XSHE) - 全市场策略:上证综指(
000001.XSHG)
9. 基本面数据:PE / PB / ROE 等¶
量化策略中常用的基本面因子:
| 指标 | 全称 | 含义 | 越低越… |
|---|---|---|---|
| PE | Price-to-Earnings | 市盈率 = 股价 / 每股盈利 | 越低越"便宜"(价值因子) |
| PB | Price-to-Book | 市净率 = 股价 / 每股净资产 | 越低越"便宜" |
| PS | Price-to-Sales | 市销率 = 市值 / 年销售额 | — |
| ROE | Return on Equity | 净资产收益率 = 净利润 / 净资产 | 越高越好(质量因子) |
| ROA | Return on Assets | 总资产收益率 | 越高越好 |
| EPS | Earnings Per Share | 每股收益 | 越高越好 |
| 毛利率 | Gross Margin | 毛利润 / 营收 | 越高越好(竞争护城河) |
from eqlib import fetch_factor_data
# 获取候选股票的多维基本面数据
candidates = ['601390', '600519', '000858']
df = fetch_factor_data(candidates, fields=['pe', 'pb', 'roe'])
# pe pb roe
# 601390 5.4 0.62 11.2
# 600519 28.1 10.3 35.6
# 000858 19.7 6.1 24.8
# 按 PE 从低到高排序(价值选股)
df_sorted = df.sort_values('pe', ascending=True)
10. 资金流向¶
资金流向 反映当天主力资金(大单)是净买入还是净卖出:
| 指标 | 含义 |
|---|---|
| 主力净流入 | 大单净买入金额(超过 50 万的单子) |
| 超大单 | 单笔 > 100 万 |
| 大单 | 单笔 50–100 万 |
| 中单 | 单笔 10–50 万 |
| 小单 | 单笔 < 10 万 |
连续多日主力净流入 → 机构/主力在吸筹,往往是上涨的前兆。
from eqlib import get_money_flow
money_flow = get_money_flow('601390', days=5)
# 返回 DataFrame,包含 net_main(主力净流入)等字段
11. 这些规则在 eqlib 中的体现¶
| 规则 | eqlib 的处理方式 |
|---|---|
| T+1 | position.closeable_amount 在买入当天为 0 |
| 涨跌停 | 回测不自动过滤(需手动判断);实盘中影响委托成交 |
| 印花税 | OrderCost(close_tax=0.0005) 设置 |
| ST 过滤 | filter_st_stocks(securities) |
| 指数成分股 | get_index_stocks('000300.XSHG') |
| 基准对比 | set_benchmark('000300.XSHG') |
| 基本面数据 | fetch_factor_data()、get_fundamentals() |
12. 下一步¶
- 完成所有前置知识:Python 基础、技术分析基础
- 进入正式教程:Tutorial 00:环境与第一次运行
- Tutorial 01 有更多 A 股市场常见错误的介绍:01_quant_basics.md
- Tutorial 07 深入讲解 A 股行业轮动:07_sector_rotation.md