股指期货是连接股票市场和期货市场的桥梁,具有高流动性、T+0交易、可做空等特点。对于量化交易者来说,股指期货提供了对冲股票持仓、捕捉市场波动的绝佳工具。
本文将介绍:
- 股指期货品种介绍(IF/IC/IH)
- 股指期货交易规则
- 量化策略实现
- 与股票市场的联动
在众多期货量化工具中,**天勤量化(TqSdk)**是目前国内最受欢迎的开源期货量化框架之一:
| 特点 |
说明 |
| 完全免费 |
开源免费,无需付费即可获取实时行情 |
| 数据全面 |
支持国内所有期货交易所的实时行情和历史数据 |
| 上手简单 |
几行Python代码即可获取数据 |
| 文档完善 |
官方文档详细,示例代码丰富 |
安装方法:
bash
复制代码
pip install tqsdk
| 项目 |
IF(沪深300) |
IC(中证500) |
IH(上证50) |
| 交易所 |
中金所 |
中金所 |
中金所 |
| 合约乘数 |
300元/点 |
200元/点 |
300元/点 |
| 最小变动 |
0.2点 |
0.2点 |
0.2点 |
| 每跳盈亏 |
60元 |
40元 |
60元 |
| 保证金 |
约12% |
约12% |
约12% |
| 标的指数 |
沪深300 |
中证500 |
上证50 |
| 风格特点 |
大盘蓝筹 |
中小盘成长 |
超大盘蓝筹 |
| 时段 |
时间 |
| 上午 |
09:30 - 11:30 |
| 下午 |
13:00 - 15:00 |
注意:股指期货无夜盘,交易时间与股票市场基本同步。
| 合约 |
说明 |
| 当月合约 |
如IF2501(2025年1月) |
| 下月合约 |
如IF2502 |
| 季月合约 |
3、6、9、12月 |
| 要求 |
说明 |
| 资金 |
50万以上 |
| 知识测试 |
80分以上 |
| 交易经验 |
10笔以上商品期货交易 |
python
复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
功能:获取股指期货实时行情
说明:本代码仅供学习参考
"""
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth("快期账户", "快期密码"))
# 三大股指期货主力合约
SYMBOLS = {
"IF": "CFFEX.IF2501", # 沪深300
"IC": "CFFEX.IC2501", # 中证500
"IH": "CFFEX.IH2501", # 上证50
}
quotes = {name: api.get_quote(symbol) for name, symbol in SYMBOLS.items()}
print("=" * 70)
print("股指期货实时行情")
print("=" * 70)
api.wait_update()
print(f"{'品种':<6} {'代码':<15} {'最新价':<10} {'涨跌幅':<10} {'成交量':<12}")
print("-" * 70)
for name, quote in quotes.items():
change_pct = (quote.last_price - quote.pre_close) / quote.pre_close * 100
print(f"{name:<6} {SYMBOLS[name]:<15} {quote.last_price:<10.2f} "
f"{change_pct:<+10.2f}% {quote.volume:<12}")
# 计算合约价值
print("\n合约价值(以最新价计算):")
multipliers = {"IF": 300, "IC": 200, "IH": 300}
for name, quote in quotes.items():
value = quote.last_price * multipliers[name]
margin = value * 0.12
print(f" {name}: 合约价值={value:.0f}元 保证金≈{margin:.0f}元")
api.close()
python
复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
功能:获取股指期货主力合约
说明:本代码仅供学习参考
"""
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth("快期账户", "快期密码"))
# 主力合约代码
MAIN_SYMBOLS = {
"沪深300": "KQ.m@CFFEX.IF",
"中证500": "KQ.m@CFFEX.IC",
"上证50": "KQ.m@CFFEX.IH",
}
print("=" * 60)
print("股指期货主力合约")
print("=" * 60)
for name, symbol in MAIN_SYMBOLS.items():
quote = api.get_quote(symbol)
api.wait_update()
actual = quote.underlying_symbol
print(f"{name}: {actual}")
api.close()
python
复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
功能:股指期货日内动量策略
说明:本代码仅供学习参考
"""
from tqsdk import TqApi, TqAuth, TqSim
from tqsdk.lib import TargetPosTask
import numpy as np
from datetime import datetime
# ============ 策略参数 ============
SYMBOL = "CFFEX.IF2501"
MOMENTUM_PERIOD = 10 # 动量周期(5分钟K线数)
ENTRY_THRESHOLD = 0.3 # 入场阈值(%)
EXIT_TIME = "14:55" # 日内平仓时间
ATR_PERIOD = 14
STOP_ATR = 1.5
LOTS = 1
# ============ 初始化 ============
api = TqApi(TqSim(init_balance=1000000), auth=TqAuth("快期账户", "快期密码"))
klines = api.get_kline_serial(SYMBOL, 300, MOMENTUM_PERIOD + ATR_PERIOD + 10)
quote = api.get_quote(SYMBOL)
position = api.get_position(SYMBOL)
target_pos = TargetPosTask(api, SYMBOL)
print("=" * 60)
print("股指期货日内动量策略")
print("=" * 60)
print(f"合约: {SYMBOL}")
print(f"动量周期: {MOMENTUM_PERIOD}根5分钟K线")
print(f"入场阈值: {ENTRY_THRESHOLD}%")
print("-" * 60)
entry_price = 0
stop_loss = 0
direction = 0
traded_today = False
last_day = None
while True:
api.wait_update()
if api.is_changing(klines.iloc[-1], "datetime"):
current_time = klines.iloc[-1]["datetime"]
current_day = current_time.date() if hasattr(current_time, 'date') else None
hour = current_time.hour if hasattr(current_time, 'hour') else 9
minute = current_time.minute if hasattr(current_time, 'minute') else 30
# 新的一天重置
if current_day != last_day:
traded_today = False
direction = 0
last_day = current_day
print(f"\n[新交易日] {current_day}")
close = klines["close"].values
high = klines["high"].values
low = klines["low"].values
current_price = quote.last_price
current_pos = position.pos_long - position.pos_short
# 计算动量
momentum = (close[-1] - close[-MOMENTUM_PERIOD-1]) / close[-MOMENTUM_PERIOD-1] * 100
# 计算ATR
tr = np.maximum(high[-ATR_PERIOD:] - low[-ATR_PERIOD:],
np.abs(high[-ATR_PERIOD:] - close[-ATR_PERIOD-1:-1]))
atr = np.mean(tr)
# ============ 交易逻辑 ============
# 交易时段:9:35-14:55
in_trading_time = (hour == 9 and minute >= 35) or (10 <= hour <= 14)
if hour == 14 and minute >= 55:
in_trading_time = False
# 收盘前平仓
if hour == 14 and minute >= 55 and current_pos != 0:
target_pos.set_target_volume(0)
print(f"\n[日内平仓] 时间={hour}:{minute:02d}")
direction = 0
# 开仓逻辑
elif in_trading_time and not traded_today and current_pos == 0:
if momentum > ENTRY_THRESHOLD:
# 强势做多
target_pos.set_target_volume(LOTS)
entry_price = current_price
stop_loss = entry_price - atr * STOP_ATR
direction = 1
traded_today = True
print(f"\n[动量做多] 动量={momentum:.2f}% 止损={stop_loss:.2f}")
elif momentum < -ENTRY_THRESHOLD:
# 弱势做空
target_pos.set_target_volume(-LOTS)
entry_price = current_price
stop_loss = entry_price + atr * STOP_ATR
direction = -1
traded_today = True
print(f"\n[动量做空] 动量={momentum:.2f}% 止损={stop_loss:.2f}")
# 止损检查
if direction == 1 and current_price < stop_loss:
target_pos.set_target_volume(0)
print(f"\n[止损平多]")
direction = 0
elif direction == -1 and current_price > stop_loss:
target_pos.set_target_volume(0)
print(f"\n[止损平空]")
direction = 0
print(f"\r{hour}:{minute:02d} 价格={current_price:.2f} 动量={momentum:+.2f}% "
f"ATR={atr:.2f} 持仓={current_pos}", end="")
python
复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
功能:股指期货择时策略
说明:本代码仅供学习参考
"""
from tqsdk import TqApi, TqAuth, TqSim
from tqsdk.lib import TargetPosTask
import numpy as np
# ============ 策略参数 ============
SYMBOL = "CFFEX.IF2501"
RSI_PERIOD = 14
RSI_OVERBOUGHT = 70
RSI_OVERSOLD = 30
MA_PERIOD = 20
LOTS = 1
# ============ 初始化 ============
api = TqApi(TqSim(init_balance=1000000), auth=TqAuth("快期账户", "快期密码"))
klines = api.get_kline_serial(SYMBOL, 3600, max(RSI_PERIOD, MA_PERIOD) + 20) # 小时线
position = api.get_position(SYMBOL)
target_pos = TargetPosTask(api, SYMBOL)
print("=" * 60)
print("股指期货择时策略")
print("=" * 60)
print(f"RSI周期: {RSI_PERIOD}")
print(f"超买/超卖: {RSI_OVERBOUGHT}/{RSI_OVERSOLD}")
print("-" * 60)
def calculate_rsi(prices, period):
"""计算RSI"""
deltas = np.diff(prices)
gains = np.where(deltas > 0, deltas, 0)
losses = np.where(deltas < 0, -deltas, 0)
avg_gain = np.mean(gains[-period:])
avg_loss = np.mean(losses[-period:])
if avg_loss == 0:
return 100
rs = avg_gain / avg_loss
return 100 - (100 / (1 + rs))
last_signal = 0
while True:
api.wait_update()
if api.is_changing(klines.iloc[-1], "datetime"):
close = klines["close"].values
# 计算指标
rsi = calculate_rsi(close, RSI_PERIOD)
ma = np.mean(close[-MA_PERIOD:])
current_price = close[-1]
current_pos = position.pos_long - position.pos_short
# ============ 信号判断 ============
# 趋势+超卖=做多
if current_price > ma and rsi < RSI_OVERSOLD:
signal = 1
reason = "趋势向上+超卖"
# 趋势+超买=做空
elif current_price < ma and rsi > RSI_OVERBOUGHT:
signal = -1
reason = "趋势向下+超买"
# RSI回归中性=平仓
elif 40 < rsi < 60:
signal = 0
reason = "RSI中性"
else:
signal = last_signal
reason = "持仓"
if signal != last_signal:
target_pos.set_target_volume(signal * LOTS)
if signal == 1:
print(f"\n[做多] {reason} RSI={rsi:.1f}")
elif signal == -1:
print(f"\n[做空] {reason} RSI={rsi:.1f}")
else:
print(f"\n[平仓] {reason} RSI={rsi:.1f}")
last_signal = signal
trend = "↑" if current_price > ma else "↓"
print(f"\r价格={current_price:.2f} MA={ma:.2f}{trend} RSI={rsi:.1f} 持仓={current_pos}", end="")
| 特点 |
说明 |
| 高杠杆 |
约8-10倍 |
| 日内限制 |
有日内开仓限制 |
| 无夜盘 |
隔夜风险大 |
| T+0 |
可日内多次交易 |
| 账户资金 |
IF建议手数 |
保证金占比 |
| 100万 |
1手 |
<15% |
| 200万 |
1-2手 |
<15% |
| 500万 |
2-4手 |
<15% |
python
复制代码
# 股指期货风控配置
RISK_CONFIG = {
"max_position": 2, # 最大持仓手数
"max_daily_loss": 0.02, # 最大日亏损2%
"stop_loss_points": 30, # 止损点数
"no_overnight": True, # 不隔夜
"avoid_settlement": True, # 避开交割日
}
python
复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
功能:股指期货基差监控
说明:本代码仅供学习参考
"""
from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth("快期账户", "快期密码"))
# 股指期货和对应指数
PAIRS = {
"IF": ("CFFEX.IF2501", "SSE.000300"), # 沪深300
"IC": ("CFFEX.IC2501", "SSE.000905"), # 中证500
"IH": ("CFFEX.IH2501", "SSE.000016"), # 上证50
}
print("=" * 60)
print("股指期货基差监控")
print("=" * 60)
quotes = {}
for name, (future, index) in PAIRS.items():
quotes[name] = {
"future": api.get_quote(future),
"index": api.get_quote(index),
}
api.wait_update()
print(f"{'品种':<6} {'期货':<10} {'指数':<10} {'基差':<10} {'基差率':<10}")
print("-" * 60)
for name, q in quotes.items():
future_price = q["future"].last_price
index_price = q["index"].last_price
basis = future_price - index_price
basis_pct = basis / index_price * 100
print(f"{name:<6} {future_price:<10.2f} {index_price:<10.2f} "
f"{basis:<+10.2f} {basis_pct:<+10.2f}%")
api.close()
| 要点 |
内容 |
| 品种选择 |
IF大盘、IC中小盘、IH超大盘 |
| 合约价值 |
IF/IH约100万、IC约100万 |
| 交易时间 |
9:30-15:00,无夜盘 |
| 适合策略 |
日内动量、趋势跟踪 |
| 风险控制 |
不建议隔夜、控制仓位 |
| 开户门槛 |
50万+知识测试 |
免责声明:本文仅供学习交流使用,不构成任何投资建议。期货交易有风险,入市需谨慎。股指期货杠杆较高,请根据自身风险承受能力谨慎参与。
更多资源: