金融市场基础:股票、期货、期权与微观结构
各位同学,今天我们来聊聊金融市场的基础。说实话,这部分内容看起来有点枯燥,但它是你构建多因子模型的根基。我见过太多人一上来就调参数、跑回测,结果连交易成本都没算清楚——嗯,那基本等于白干。
我个人习惯把金融市场理解成一个「信息与资金的博弈场」。你想想看,每个价格波动背后,都是无数交易者的决策。而我们做量化,就是试图从这些混乱中找到规律。
股票市场基础
股票市场,说白了就是公司拿股权换钱的地方。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%,给自己留点安全垫。
知识体系总览
下面这张图,是我自己总结的金融市场基础框架。你可以把它当成一个「检查清单」——做策略之前,先看看这些要素都考虑到了没有。
这张图把四个核心模块串起来了。你注意看,它们不是孤立的——股票市场的规则会影响微观结构,微观结构又决定了你的交易成本。做多因子模型时,这四个方面都要考虑到。
好了,这一章的内容就到这里。记住一句话:不了解市场规则,就别谈量化交易。下一章我们会讲数据获取与清洗,到时候你会感谢今天打下的基础。
公众号:蓝海资料掘金营,微信deep3321