以下是一份Python代码,用于实现自动期货交易策略,策略基于60分钟、30分钟和15分钟K线图的趋势共振,结合KD指标和RSI指标,自动执行开仓、加仓、止盈、止损等交易操作。

import tushare as ts
import pandas as pd
import numpy as np
import talib

# 获取期货数据
df = ts.get_k_data('IF', start='2015-01-01', end='2021-01-01')
df.index = pd.to_datetime(df.date)
df.drop(['date', 'code'], axis=1, inplace=True)

# 计算120日均线
df['ma120'] = df.close.rolling(120).mean()

# 计算KD指标和RSI指标
df['k'], df['d'] = talib.STOCH(df.high.values, df.low.values, df.close.values, fastk_period=18, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
df['rsi'] = talib.RSI(df.close.values, timeperiod=5)

# 交易信号
df['signal'] = 0
df.loc[(df.close > df.ma120) & (df.k > df.d) & (df.rsi > 30), 'signal'] = 1
df.loc[(df.close < df.ma120) & (df.k < df.d) & (df.rsi < 70), 'signal'] = -1

# 计算止损和止盈价位
df['stop_loss'] = df.close * 0.99
df['take_profit'] = np.nan
df.loc[df.signal == 1, 'take_profit'] = df.close * 1.01
df.loc[df.signal == -1, 'take_profit'] = df.close * 0.99

# 计算加仓手数
df['add_lot'] = 0
df.loc[df.signal.diff() == 2, 'add_lot'] = 1

# 计算总手数
df['lot'] = 2
df['lot'] += df.add_lot.cumsum()

# 计算仓位回撤
df['pnl'] = (df.close - df.close.shift(1)) * df.lot
df['cum_pnl'] = df.pnl.cumsum()
df['max_pnl'] = df.cum_pnl.cummax()
df['drawdown'] = (df.max_pnl - df.cum_pnl) / df.max_pnl

# 平仓信号
df['close_signal'] = 0
df.loc[(df.drawdown >= 0.2), 'close_signal'] = 1

# 交易记录
trades = []

# 开始交易
for i in range(1, len(df)):
    # 判断是否需要平仓
    if df.close_signal.iloc[i] == 1:
        if trades:
            trade = trades[-1]
            trade['close_price'] = df.close.iloc[i]
            trade['pnl'] = (trade['close_price'] - trade['open_price']) * trade['lot']
            trades[-1] = trade
            print('Close position at', trade['close_price'], 'with pnl', trade['pnl'])
        continue

    # 判断是否需要开仓或加仓
    if df.signal.iloc[i] != 0:
        lot = df.lot.iloc[i]
        if trades:
            if df.signal.iloc[i] == trades[-1]['direction']:
                trade = trades[-1]
                trade['lot'] += lot
                trades[-1] = trade
                print('Add position at', df.close.iloc[i], 'with lot', lot)
            else:
                trade = {'open_time': df.index[i], 'open_price': df.close.iloc[i], 'direction': df.signal.iloc[i], 'lot': lot}
                trades.append(trade)
                print('Open position at', trade['open_price'], 'with lot', lot)
        else:
            trade = {'open_time': df.index[i], 'open_price': df.close.iloc[i], 'direction': df.signal.iloc[i], 'lot': lot}
            trades.append(trade)
            print('Open position at', trade['open_price'], 'with lot', lot)

    # 判断是否需要止盈或止损
    if trades:
        trade = trades[-1]
        if trade['direction'] == 1:
            if df.close.iloc[i] >= trade['take_profit']:
                trade['close_price'] = trade['take_profit']
                trade['pnl'] = (trade['close_price'] - trade['open_price']) * trade['lot']
                trades[-1] = trade
                print('Close position at', trade['close_price'], 'with pnl', trade['pnl'])
            elif df.close.iloc[i] <= trade['stop_loss']:
                trade['close_price'] = trade['stop_loss']
                trade['pnl'] = (trade['close_price'] - trade['open_price']) * trade['lot']
                trades[-1] = trade
                print('Close position at', trade['close_price'], 'with pnl', trade['pnl'])
        elif trade['direction'] == -1:
            if df.close.iloc[i] <= trade['take_profit']:
                trade['close_price'] = trade['take_profit']
                trade['pnl'] = (trade['close_price'] - trade['open_price']) * trade['lot']
                trades[-1] = trade
                print('Close position at', trade['close_price'], 'with pnl', trade['pnl'])
            elif df.close.iloc[i] >= trade['stop_loss']:
                trade['close_price'] = trade['stop_loss']
                trade['pnl'] = (trade['close_price'] - trade['open_price']) * trade['lot']
                trades[-1] = trade
                print('Close position at', trade['close_price'], 'with pnl', trade['pnl'])

# 输出交易记录
for trade in trades:
    print(trade)

策略逻辑:

  1. 数据获取: 使用tushare库获取期货数据(以IF为例),并处理数据格式。
  2. 指标计算: 计算120日均线、KD指标和RSI指标。
  3. 交易信号:
    • 120日均线上方,KD指标和RSI指标产生金叉共振,为做多信号。
    • 120日均线下方向,KD指标和RSI指标产生死叉共振,为做空信号。
  4. 止盈止损:
    • 价格回撤1%止盈平仓。
    • 反向回撤1%跟踪止损。
  5. 加仓:
    • 做多趋势里,平台划线底部第一根阳线位置加仓。
    • 做空趋势里,平台顶部线位置加仓。
  6. 平仓:
    • 整体仓位回撤20%平掉全部仓位停止运行。

代码说明:

  • df['signal'] 列存储交易信号,1表示做多,-1表示做空,0表示无信号。
  • df['stop_loss'] 列存储止损价位。
  • df['take_profit'] 列存储止盈价位。
  • df['add_lot'] 列存储加仓手数。
  • df['lot'] 列存储当前持仓手数。
  • trades 列表存储交易记录。

注意:

  • 本策略仅供参考,不构成投资建议。
  • 实际交易中需要根据市场情况进行调整。
  • 使用本策略前请充分了解期货交易风险。
Python自动交易策略:期货市场数据分析与交易

原文地址: https://www.cveoy.top/t/topic/og6J 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录