前置知识: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.025%,最低 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.00025, # 买入佣金 0.025%
close_commission=0.00025, # 卖出佣金 0.025%
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. 北向资金¶
北向资金 是通过沪港通和深港通从香港流入 A 股市场的资金,常被称为「聪明钱」。
11.1 什么是北向资金¶
| 类型 | 说明 |
|---|---|
| 沪股通 | 香港投资者通过香港交易所买入上交所股票 |
| 深股通 | 香港投资者通过香港交易所买入深交所股票 |
| 北向资金 | 沪股通 + 深股通合计(外资流入 A 股) |
| 南向资金 | 内地投资者买入港股(反向) |
北向资金的特点: - 机构投资者为主,决策更理性 - 持仓周期较长,偏爱蓝筹股 - 常被视为市场风向标
11.2 在 eqlib 中获取北向资金¶
from eqlib import get_north_money_flow
# 获取近 3 个月北向资金流向
north = get_north_money_flow(start_date="2024-01-01", end_date="2024-03-31")
# 返回字段:
# - date: 交易日期
# - net_buy: 净买入额(亿元)
# - total_buy: 总买入额(亿元)
# - total_sell: 总卖出额(亿元)
# 计算近 5 日净买入
recent_5d = north["net_buy"].tail(5).sum()
if recent_5d > 50:
print("北向资金强势流入,市场情绪积极")
elif recent_5d < -50:
print("北向资金强势流出,注意风险")
11.3 策略应用¶
北向资金连续流入/流出可作为市场择时信号:
# 在策略中检查北向资金趋势
north = get_north_money_flow()
if not north.empty:
recent_3d = north["net_buy"].tail(3).sum()
if recent_3d < -50: # 连续 3 日净流出超 50 亿
g.market_sentiment = "bearish" # 减仓信号
12. 融资融券¶
融资融券 是投资者向券商借入资金或股票进行交易的杠杆机制。
12.1 基本概念¶
| 类型 | 说明 |
|---|---|
| 融资 | 借钱买入股票(看多,加杠杆) |
| 融券 | 借股票卖出(看空,做空) |
| 融资余额 | 未偿还的融资总额 |
| 融券余额 | 未偿还的融券总额 |
融资余额上升 → 市场看多情绪升温 融资余额下降 → 市场看多情绪降温
12.2 在 eqlib 中获取融资融券数据¶
from eqlib import get_margin_data
# 获取近 3 个月融资融券数据
margin = get_margin_data(start_date="2024-01-01", end_date="2024-03-31")
# 返回字段:
# - date: 交易日期
# - margin_balance: 融资余额(亿元)
# - margin_buy: 融资买入额(亿元)
# - margin_repay: 融资偿还额(亿元)
# - short_balance: 融券余额(亿元)
# 计算融资余额变化率
margin["balance_change_pct"] = margin["margin_balance"].diff(5) / margin["margin_balance"].shift(5) * 100
12.3 注意事项¶
margin_repay第一行为 NaN(无前日余额可计算)- 融资余额过快增长可能预示杠杆过热,需警惕回调风险
13. 涨跌停统计¶
涨跌停统计 反映市场整体情绪和系统性风险。
13.1 市场宽度指标¶
| 指标 | 说明 |
|---|---|
| 涨停数 | 当日涨停股票数量 |
| 跌停数 | 当日跌停股票数量 |
| 涨跌停比值 | 涨停数 / 跌停数 |
涨停数多 → 市场情绪积极 跌停数多 → 市场情绪悲观 跌停数 > 100 → 可能触发系统性风险
13.2 在 eqlib 中获取涨跌停统计¶
from eqlib import get_limit_up_down_stats
# 获取近 30 天涨跌停统计
limit_stats = get_limit_up_down_stats()
# 返回字段:
# - date: 交易日期
# - limit_up_count: 涨停股票数量
# - limit_down_count: 跌停股票数量
# 系统性风险预警
latest_down = limit_stats["limit_down_count"].iloc[-1]
if latest_down > 100:
print("⚠️ 系统性风险预警:跌停数超过 100")
13.3 注意事项¶
- API 只支持最近 30 个交易日
- 涨跌停数据在交易时段内会变化
14. 限售股解禁¶
限售股解禁 指原本不能流通的股票获得上市交易资格,可能带来卖压。
14.1 解禁类型¶
| 类型 | 说明 |
|---|---|
| 首发原股东限售股 | IPO 时股东承诺持有期限 |
| 定向增发限售股 | 定增参与者承诺持有期限 |
| 股权激励限售股 | 员工激励计划锁定期限 |
解禁后,原持有人可自由卖出,若解禁量大且持有人减持意愿强,股价可能承压。
14.2 在 eqlib 中获取解禁数据¶
from eqlib import get_restriction_release
# 获取未来 30 天解禁列表
releases = get_restriction_release(days=30)
# 返回字段:
# - code: 股票代码
# - name: 股票名称
# - release_date: 解禁日期
# - release_amount: 解禁数量(万股)
# - release_value: 解禁市值(亿元)
# - release_pct: 占解禁前流通市值比例
# 按解禁市值排序,关注大额解禁
large_releases = releases[releases["release_value"] > 50]
print(f"未来 30 天大额解禁(>50亿): {len(large_releases)} 只")
14.3 策略应用¶
在选股时排除即将大额解禁的股票:
# 排除未来 30 天解禁市值超过 100 亿的股票
releases = get_restriction_release(days=30)
large_release_codes = releases[releases["release_value"] > 100]["code"].tolist()
candidates = ["601390", "600519", "000858"]
safe_candidates = [c for c in candidates if c not in large_release_codes]
15. 这些规则在 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() |
| 北向资金 | get_north_money_flow() |
| 融资融券 | get_margin_data() |
| 涨跌停统计 | get_limit_up_down_stats() |
| 限售股解禁 | get_restriction_release() |
16. 下一步¶
- 完成所有前置知识:Python 基础、技术分析基础
- 进入正式教程:Tutorial 00:环境与量化基础
- Tutorial 00 有更多 A 股市场常见错误的介绍:00-getting-started.md
- Tutorial 07: 行业轮动策略 深入讲解 A 股行业轮动:06-sector-rotation.md
- Tutorial 10: A 股特色数据与风控 详细介绍 A 股特色数据与风控:10-ashare-data-risk.md