Python自动交易策略:期货市场数据分析与交易
以下是一份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)
策略逻辑:
- 数据获取: 使用tushare库获取期货数据(以IF为例),并处理数据格式。
- 指标计算: 计算120日均线、KD指标和RSI指标。
- 交易信号:
- 120日均线上方,KD指标和RSI指标产生金叉共振,为做多信号。
- 120日均线下方向,KD指标和RSI指标产生死叉共振,为做空信号。
- 止盈止损:
- 价格回撤1%止盈平仓。
- 反向回撤1%跟踪止损。
- 加仓:
- 做多趋势里,平台划线底部第一根阳线位置加仓。
- 做空趋势里,平台顶部线位置加仓。
- 平仓:
- 整体仓位回撤20%平掉全部仓位停止运行。
代码说明:
df['signal']列存储交易信号,1表示做多,-1表示做空,0表示无信号。df['stop_loss']列存储止损价位。df['take_profit']列存储止盈价位。df['add_lot']列存储加仓手数。df['lot']列存储当前持仓手数。trades列表存储交易记录。
注意:
- 本策略仅供参考,不构成投资建议。
- 实际交易中需要根据市场情况进行调整。
- 使用本策略前请充分了解期货交易风险。
原文地址: https://www.cveoy.top/t/topic/og6J 著作权归作者所有。请勿转载和采集!