股票与期货的联动选股逻辑
股票与期货并非孤立市场。期货价格往往领先于股票现货,尤其在大宗商品、金融衍生品领域。螺纹钢期货上涨,钢铁股可能滞后反应;股指期货升贴水变化,预示市场情绪转折。程序化交易系统可实时抓取期货行情,计算基差、持仓量、波动率等因子,映射到对应股票板块。
一个实用的量化选股流程:

获取期货主力合约的分钟级或日级数据
计算期货的动量、期限结构、成交量变化
将期货因子与股票因子结合,生成综合评分
按评分排序,选出前N只股票
用期货对冲系统性风险
代码示例(Python,使用tushare与pandas):
import tushare as ts
import pandas as pd
import numpy as np
# 获取期货数据
def get_futures_data(symbol, start, end):
df = ts.fut_daily(ts_code=symbol, start_date=start, end_date=end)
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
return df[['close', 'vol', 'oi']]
# 获取股票数据
def get_stock_data(symbol, start, end):
df = ts.pro_bar(ts_code=symbol, start_date=start, end_date=end, adj='qfq')
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
return df[['close', 'vol']]
# 计算期货因子
def futures_factor(fut_df):
fut_df['mom_5'] = fut_df['close'].pct_change(5)
fut_df['vol_ratio'] = fut_df['vol'] / fut_df['vol'].rolling(10).mean()
fut_df['oi_change'] = fut_df['oi'].pct_change(3)
return fut_df[['mom_5', 'vol_ratio', 'oi_change']].dropna()
# 股票筛选
fut = get_futures_data('RB.SHF', '20240101', '20240301')
stk = get_stock_data('600019.SH', '20240101', '20240301')
fut_fac = futures_factor(fut)
combined = stk.join(fut_fac, how='inner')
combined['score'] = combined['mom_5'] * 0.4 + combined['vol_ratio'] * 0.3 + combined['oi_change'] * 0.3
selected = combined[combined['score'] > combined['score'].quantile(0.8)]
print(selected.index)
量化模型如何识别好股票
好股票的定义随时间、策略变化。短线交易者关注波动率与流动性,长线投资者看重盈利增长与估值。程序化手段可同时处理上百个因子。常用因子分组:
价值因子:市盈率、市净率、股息率
成长因子:营收增速、净利润增速、ROE变化
质量因子:资产负债率、现金流、毛利率
动量因子:过去20日、60日收益率
波动因子:ATR、标准差、beta
期货相关因子:基差、展期收益率、持仓异动
将因子标准化后,用IC加权或机器学习模型(如LightGBM)合成打分。每月或每周调仓。回测时注意滑点、手续费、停牌处理。
股票与期货的配对交易也常用。找到历史协整关系强的股票与期货品种,当价差偏离均值2倍标准差时开仓。程序自动监控价差,触发交易。
程序化选股与期货对冲实战
选股结果需要期货工具管理风险。持有股票组合时,用股指期货(IF、IC、IM)对冲大盘下跌。计算组合beta,卖出相应手数的期货合约。
代码片段展示beta对冲:
# 计算股票组合beta
def calc_beta(stock_returns, futures_returns):
cov = np.cov(stock_returns, futures_returns)[0][1]
var = np.var(futures_returns)
return cov / var
# 确定对冲手数
def hedge_ratio(portfolio_value, futures_price, multiplier, beta):
return (portfolio_value * beta) / (futures_price * multiplier)
# 示例
stock_ret = np.random.normal(0.001, 0.02, 100)
fut_ret = np.random.normal(0.0005, 0.015, 100)
beta = calc_beta(stock_ret, fut_ret)
print(f'Beta: {beta:.2f}')
实际运行中,期货保证金、展期成本、基差风险都要纳入模型。程序化系统可每日收盘后重新计算beta与对冲手数,自动生成交易指令。
股票池构建与期货信号过滤
不要直接问哪个股票好,而应建立可重复的筛选流程。步骤:
剔除ST、退市风险、流动性差股票
获取期货主力合约信号,判断板块轮动方向
在对应板块中按多因子打分排序
结合期货持仓量变化,过滤掉资金流出的股票
输出候选列表,人工复核或直接程序下单
期货信号过滤示例:当螺纹钢期货持仓量连续3日下降,且价格跌破20日均线,则钢铁股暂时回避。当豆粕期货基差走强,且成交量放大,则饲料养殖股可关注。
这些规则可写成条件语句嵌入交易系统。
常见量化选股陷阱与期货数据注意事项
回测过拟合是最大陷阱。股票历史数据有限,期货数据虽然更长,但不同合约切换需要拼接。主力合约换月时价格跳空,必须做复权处理。
程序化交易中,期货夜盘与股票交易时间不重叠。用期货信号预测股票开盘,需考虑信息传导延迟。建议使用前一日期货收盘后数据,在股票开盘前生成选股列表。
滑点模拟:股票按开盘价或VWAP成交,期货按对手价。手续费:股票万二点五,期货按品种不同。这些参数影响策略净值和夏普比率。
没有永远好的股票,只有适合当前市场状态的策略。程序化交易的价值在于纪律执行与快速迭代。期货作为风险管理与信号来源,能提升股票选股系统的稳健性。持续监控因子失效、调整权重、更新代码,才能在市场中生存。