跳转至

前置知识:A 股市场基础知识

本篇导览

项目 说明
适合 未熟悉 A 股代码规则、T+1、涨跌停、税费与主要指数的读者
预计 约 45 分钟
价值 有助于正确理解回测假设与 eqlib 中的成交限制

本文面向没有炒过 A 股、或需要了解中国股市规则的读者。理解这些规则能帮助你写出更符合实际的策略,也能正确解读回测报告中的各项指标。


目录

  1. 什么是 A 股
  2. 股票代码格式与交易所
  3. 交易时间
  4. T+1 交易制度
  5. 涨跌停板制度
  6. ST 股与退市风险
  7. 交易成本:手续费与税
  8. 主要市场指数
  9. 基本面数据:PE / PB / ROE 等
  10. 资金流向
  11. 北向资金
  12. 融资融券
  13. 涨跌停统计
  14. 限售股解禁
  15. 这些规则在 eqlib 中的体现
  16. 下一步

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:3015: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. 下一步