金融市场基础:股票、期货、期权与微观结构

各位同学,今天我们来聊聊金融市场的基础。说实话,这部分内容看起来有点枯燥,但它是你构建多因子模型的根基。我见过太多人一上来就调参数、跑回测,结果连交易成本都没算清楚——嗯,那基本等于白干。

我个人习惯把金融市场理解成一个「信息与资金的博弈场」。你想想看,每个价格波动背后,都是无数交易者的决策。而我们做量化,就是试图从这些混乱中找到规律。

股票市场基础

股票市场,说白了就是公司拿股权换钱的地方。A股、港股、美股,规则各有不同,但核心逻辑一致:你买的是公司的一部分所有权。

我在项目中遇到过最坑的事,就是有人把A股的涨跌停板机制直接套用到美股上。结果回测曲线漂亮得不行,实盘一跑就崩。为什么?因为美股没有涨跌停限制,波动完全不是一个量级。

这里有几个关键点你要记住:

  • 交易时间:A股是9:30-15:00,中午休市;美股是夏令时21:30-次日4:00,连续交易
  • T+1 vs T+0:A股当天买入,第二天才能卖;美股可以当天买卖
  • 最小变动单位:A股是0.01元,美股是0.0001美元(某些低价股)

重要提醒:做多因子模型时,一定要把交易规则写进代码。我见过有人用美股T+0的规则去回测A股策略,结果胜率虚高30%。

期货与期权市场

期货和期权,很多人觉得复杂。其实没那么玄乎。

期货就是「约定未来某个时间,以某个价格买卖某样东西」。你想想看,一个农民种小麦,他怕6个月后价格跌了亏钱,就现在把小麦「期货」卖出去。这就是最朴素的套期保值。

期权呢?它给你一个「选择权」——你可以选择执行,也可以选择不执行。我刚开始做期权策略时,总觉得这东西跟赌博差不多。后来做了几年才明白,期权其实是「管理不确定性的工具」。

举个例子:

# 一个简单的期权定价模型(Black-Scholes)
import numpy as np
from scipy.stats import norm

def black_scholes(S, K, T, r, sigma, option_type='call'):
    d1 = (np.log(S/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
    d2 = d1 - sigma*np.sqrt(T)
    
    if option_type == 'call':
        price = S*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)
    else:
        price = K*np.exp(-r*T)*norm.cdf(-d2) - S*norm.cdf(-d1)
    return price

# 假设当前股价100,行权价105,剩余30天,无风险利率3%,波动率20%
price = black_scholes(100, 105, 30/365, 0.03, 0.20, 'call')
print(f'看涨期权理论价格: {price:.2f}')

这段代码看起来简单,但实际用的时候要注意——波动率σ是唯一需要你「猜」的参数。我曾经因为用了历史波动率,结果期权定价偏差了15%。后来我改用隐含波动率,效果好了很多。

我的经验:做期货多因子时,别忘了考虑「展期收益」。期货合约会到期,你得不断换月。这个换月成本,有时候比交易佣金还高。

市场微观结构

市场微观结构,听起来高大上,其实就是「订单是怎么成交的」。你下了一个买单,它怎么找到卖单?价格怎么确定的?这里面门道很多。

我举个例子你就明白了。假设你想买1000股茅台,当前盘口是这样的:

卖五 卖四 卖三 卖二 卖一 买一 买二 买三 买四 买五
2000股@180.50 1500股@180.40 1000股@180.30 800股@180.20 500股@180.10 300股@180.00 600股@179.90 900股@179.80 1200股@179.70 1800股@179.60

你的1000股买单,会先吃掉卖一的500股(180.10元),再吃掉卖二的500股(180.20元)。最终成交均价是(500*180.10 + 500*180.20)/1000 = 180.15元。这就是「滑点」的来源之一。

我做过一个统计:对于小市值股票,一次中等规模的交易,滑点可能占到交易成本的50%以上。你想想看,如果你的策略年化收益只有10%,滑点吃掉5%,那还玩什么?

避坑指南:我曾经在回测中忽略了「订单簿深度」这个因素。结果策略在模拟中表现完美,实盘一跑就亏。后来我加了一个「流动性过滤器」,只交易日均成交额在1亿以上的股票,情况才好转。

交易成本与滑点

交易成本,不只是佣金。它包括:

  • 显性成本:佣金、印花税、过户费、交易所规费
  • 隐性成本:滑点、市场冲击、延迟成本

我建议你做一个「成本计算器」,把每笔交易的成本算清楚。下面是我常用的一个模板:

def calculate_trading_cost(price, shares, commission_rate=0.0003, 
                           stamp_tax_rate=0.001, slippage_rate=0.001):
    """
    计算单笔交易成本
    price: 成交价格
    shares: 成交股数
    commission_rate: 佣金费率(默认万三)
    stamp_tax_rate: 印花税率(默认千一,仅卖出)
    slippage_rate: 滑点率(默认千一)
    """
    turnover = price * shares
    commission = turnover * commission_rate
    stamp_tax = turnover * stamp_tax_rate  # 仅卖出时收取
    slippage = turnover * slippage_rate
    
    total_cost = commission + stamp_tax + slippage
    cost_per_share = total_cost / shares
    
    return {
        'total_cost': total_cost,
        'cost_per_share': cost_per_share,
        'commission': commission,
        'stamp_tax': stamp_tax,
        'slippage': slippage
    }

# 示例:买入1000股,每股50元
cost = calculate_trading_cost(50, 1000)
print(f'总成本: {cost["total_cost"]:.2f}元')
print(f'每股成本: {cost["cost_per_share"]:.4f}元')

你看,光是滑点一项,1000股就吃掉50元。如果你的策略是高频交易,一天做几十次,那成本就非常可观了。

核心观点:多因子模型的收益,往往只有几个百分点。如果交易成本控制不好,策略很容易从「盈利」变成「亏损」。我个人习惯在回测中把交易成本设得比实际高20%,给自己留点安全垫。

知识体系总览

下面这张图,是我自己总结的金融市场基础框架。你可以把它当成一个「检查清单」——做策略之前,先看看这些要素都考虑到了没有。

金融市场基础 股票市场 交易规则 · 板块划分 T+1/T+0 · 涨跌停 期货与期权 套期保值 · 杠杆 Black-Scholes · 隐含波动率 市场微观结构 订单簿 · 盘口深度 撮合机制 · 流动性 交易成本与滑点 显性成本 · 隐性成本 滑点计算 · 成本控制 核心目标:降低交易成本,提高策略胜率

这张图把四个核心模块串起来了。你注意看,它们不是孤立的——股票市场的规则会影响微观结构,微观结构又决定了你的交易成本。做多因子模型时,这四个方面都要考虑到。

好了,这一章的内容就到这里。记住一句话:不了解市场规则,就别谈量化交易。下一章我们会讲数据获取与清洗,到时候你会感谢今天打下的基础。


公众号:蓝海资料掘金营,微信deep3321