【期货量化入门】股指期货量化入门:IF/IC/IH交易全攻略(TqSdk完整教程)

一、前言

股指期货是连接股票市场和期货市场的桥梁,具有高流动性、T+0交易、可做空等特点。对于量化交易者来说,股指期货提供了对冲股票持仓、捕捉市场波动的绝佳工具。

本文将介绍:

  • 股指期货品种介绍(IF/IC/IH)
  • 股指期货交易规则
  • 量化策略实现
  • 与股票市场的联动

二、为什么选择天勤量化(TqSdk)

在众多期货量化工具中,**天勤量化(TqSdk)**是目前国内最受欢迎的开源期货量化框架之一:

特点 说明
完全免费 开源免费,无需付费即可获取实时行情
数据全面 支持国内所有期货交易所的实时行情和历史数据
上手简单 几行Python代码即可获取数据
文档完善 官方文档详细,示例代码丰富

安装方法

bash 复制代码
pip install tqsdk

三、股指期货基础知识

3.1 三大股指期货对比

项目 IF(沪深300) IC(中证500) IH(上证50)
交易所 中金所 中金所 中金所
合约乘数 300元/点 200元/点 300元/点
最小变动 0.2点 0.2点 0.2点
每跳盈亏 60元 40元 60元
保证金 约12% 约12% 约12%
标的指数 沪深300 中证500 上证50
风格特点 大盘蓝筹 中小盘成长 超大盘蓝筹

3.2 交易时间

时段 时间
上午 09:30 - 11:30
下午 13:00 - 15:00

注意:股指期货无夜盘,交易时间与股票市场基本同步。

3.3 合约月份

合约 说明
当月合约 如IF2501(2025年1月)
下月合约 如IF2502
季月合约 3、6、9、12月

3.4 开户门槛

要求 说明
资金 50万以上
知识测试 80分以上
交易经验 10笔以上商品期货交易

四、获取股指数据

4.1 实时行情

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()

4.2 获取主力合约

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()

五、股指期货量化策略

5.1 日内动量策略

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="")

5.2 指数增强策略(多空对冲思路)

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="")

六、风险控制

6.1 股指期货特点

特点 说明
高杠杆 约8-10倍
日内限制 有日内开仓限制
无夜盘 隔夜风险大
T+0 可日内多次交易

6.2 仓位建议

账户资金 IF建议手数 保证金占比
100万 1手 <15%
200万 1-2手 <15%
500万 2-4手 <15%

6.3 风控要点

python 复制代码
# 股指期货风控配置
RISK_CONFIG = {
    "max_position": 2,           # 最大持仓手数
    "max_daily_loss": 0.02,      # 最大日亏损2%
    "stop_loss_points": 30,      # 止损点数
    "no_overnight": True,        # 不隔夜
    "avoid_settlement": True,    # 避开交割日
}

七、实用技巧

7.1 基差监控

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万+知识测试

免责声明:本文仅供学习交流使用,不构成任何投资建议。期货交易有风险,入市需谨慎。股指期货杠杆较高,请根据自身风险承受能力谨慎参与。

更多资源

相关推荐
r_oo_ki_e_2 小时前
java23--异常
java·开发语言
无风听海2 小时前
C#中实现类的值相等时需要保留null==null为true的语义
开发语言·c#
ZouZou老师2 小时前
Linux Qt出现xcb异常问题解决办法
开发语言·qt
sunfove2 小时前
空间几何的基石:直角、柱、球坐标系的原理与转换详解
人工智能·python·机器学习
<-->2 小时前
pytorch vs ray
人工智能·pytorch·python
知乎的哥廷根数学学派2 小时前
基于多尺度特征提取和注意力自适应动态路由胶囊网络的工业轴承故障诊断算法(Pytorch)
开发语言·网络·人工智能·pytorch·python·算法·机器学习
lsx2024062 小时前
JavaScript Date(日期)
开发语言
奔跑的web.2 小时前
TypeScript 全面详解:对象类型的语法规则
开发语言·前端·javascript·typescript·vue
七夜zippoe2 小时前
缓存策略:从本地到分布式架构设计与Python实战
分布式·python·缓存·lfu·lru