期货量化交易 - 经典策略回顾 附Python代码
一、趋势跟踪
趋势跟踪策略是一种基于价格趋势的交易策略,假设市场价格会继续沿着其当前趋势运行。该策略不试图预测市场的转折点,而是通过跟随市场趋势来捕捉价格波动的主要部分。趋势跟踪策略可以应用于各种金融市场,包括期货市场。
核心理念
趋势跟踪策略的核心理念是“顺势而为”,即在价格上涨时做多(买入),在价格下跌时做空(卖出)。它基于以下两个主要假设:
市场趋势的持续性:一旦市场形成趋势,价格将继续沿着该趋势运动一段时间。
市场反转的不可预测性:价格趋势的反转是难以预测的,因此交易者不试图提前捕捉市场的顶部或底部,而是顺应已经形成的趋势进行交易。
Python代码示例
为了实现基于趋势跟踪策略的期货量化交易,我们需要从Alltick API获取实时商品价格数据,并使用Python进行移动平均线交叉和动量指标策略的计算。以下是一个示例代码,用于获取原油价格数据并应用这些策略。
import requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Github: https://github.com/alltick/alltick-realtime-forex-crypto-stock-tick-finance-websocket-api
# 实时行情数据token申请地址:https://alltick.co
# 备用地址:https://alltick.io
def get_realtime_data(symbol, api_key):
url = f"https://api.alltick.co/"
headers = {'Authorization': f'Bearer {api_key}'}
response = requests.get(url, headers=headers)
data = response.json()
df = pd.DataFrame(data)
return df
def moving_average_crossover_strategy(df, short_window, long_window):
df['short_mavg'] = df['close'].rolling(window=short_window, min_periods=1).mean()
df['long_mavg'] = df['close'].rolling(window=long_window, min_periods=1).mean()
df['signal'] = 0
df['signal'][short_window:] = np.where(df['short_mavg'][short_window:] > df['long_mavg'][short_window:], 1, 0)
df['positions'] = df['signal'].diff()
return df
def calculate_rsi(df, window):
delta = df['close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()
rs = gain / loss
df['rsi'] = 100 - (100 / (1 + rs))
return df
def calculate_momentum(df, window):
df['momentum'] = df['close'].diff(window)
return df
def plot_trading_signals(df):
plt.figure(figsize=(14, 7))
plt.plot(df['close'], label='Close Price')
plt.plot(df['short_mavg'], label='Short Moving Average')
plt.plot(df['long_mavg'], label='Long Moving Average')
plt.plot(df[df['positions'] == 1].index, df['short_mavg'][df['positions'] == 1], '^', markersize=10, color='g', lw=0, label='Buy Signal')
plt.plot(df[df['positions'] == -1].index, df['short_mavg'][df['positions'] == -1], 'v', markersize=10, color='r', lw=0, label='Sell Signal')
plt.title('Moving Average Crossover Strategy')
plt.legend()
plt.show()
# 示例:获取原油价格数据
api_key = 'your_api_key_here'
symbol = 'CL' # 原油的符号
df = get_realtime_data(symbol, api_key)
# 应用策略
short_window = 40
long_window = 100
rsi_window = 14
momentum_window = 10
df = moving_average_crossover_strategy(df, short_window, long_window)
df = calculate_rsi(df, rsi_window)
df = calculate_momentum(df, momentum_window)
# 可视化
plot_trading_signals(df)
二、均值回归策略
均值回归策略(Mean Reversion Strategy)是基于资产价格会回归其历史平均水平的假设。该策略利用市场价格的波动来识别价格的偏离程度,并在价格偏离均值时进行逆向交易,即在价格高于均值时卖出,在价格低于均值时买入。
均值回归策略的核心理念是“回归到均值”,即价格无论如何波动,最终会回到其平均水平。这一理念基于以下几个假设:
价格波动具有均值回归特性:资产价格会围绕一个长期均值波动。
市场噪音和短期波动:短期内的价格波动主要受市场噪音影响,长期来看这些波动会被均值吸收。
统计性质稳定:均值和波动性等统计性质在一段时间内是稳定的。
常用工具和指标
在期货市场中,均值回归策略通常使用以下工具和技术指标来识别价格的偏离程度:
布林带(Bollinger Bands):
使用移动平均线和标准差带来判断价格的偏离程度。当价格触及上带时,视为超买信号;触及下带时,视为超卖信号。
相对强弱指数(RSI):
衡量价格的上涨和下跌速度,判断市场是否处于超买或超卖状态。RSI在高位(如70以上)时,视为超买信号;在低位(如30以下)时,视为超卖信号。
价格与均值的偏离程度:
使用均值与当前价格的差异来判断回归的潜力。可以通过简单移动平均线(SMA)或指数移动平均线(EMA)来计算均值。
Python代码
接下来,我们依然以上面的原油为例,尝试给出均值回归策略的Python代码。
import requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Github: https://github.com/alltick/alltick-realtime-forex-crypto-stock-tick-finance-websocket-api
# 实时行情数据token申请地址:https://alltick.co
# 备用地址:https://alltick.io
def get_realtime_data(symbol, api_key):
url = f"https://api.alltick.co/"
headers = {'Authorization': f'Bearer {api_key}'}
response = requests.get(url, headers=headers)
data = response.json()
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
return df
def bollinger_bands_strategy(df, window, num_std_dev):
df['SMA'] = df['close'].rolling(window=window).mean()
df['std_dev'] = df['close'].rolling(window=window).std()
df['upper_band'] = df['SMA'] + (df['std_dev'] * num_std_dev)
df['lower_band'] = df['SMA'] - (df['std_dev'] * num_std_dev)
df['signal'] = 0
df['signal'][df['close'] < df['lower_band']] = 1 # Buy
df['signal'][df['close'] > df['upper_band']] = -1 # Sell
df['positions'] = df['signal'].diff()
return df
def plot_trading_signals(df):
plt.figure(figsize=(14, 7))
plt.plot(df['close'], label='Close Price')
plt.plot(df['SMA'], label='Simple Moving Average')
plt.plot(df['upper_band'], label='Upper Bollinger Band')
plt.plot(df['lower_band'], label='Lower Bollinger Band')
plt.plot(df[df['positions'] == 1].index, df['close'][df['positions'] == 1], '^', markersize=10, color='g', lw=0, label='Buy Signal')
plt.plot(df[df['positions'] == -1].index, df['close'][df['positions'] == -1], 'v', markersize=10, color='r', lw=0, label='Sell Signal')
plt.title('Bollinger Bands Mean Reversion Strategy')
plt.legend()
plt.show()
# 示例:获取原油价格数据
api_key = 'your_api_key_here'
symbol = 'CL' # 原油的符号
df = get_realtime_data(symbol, api_key)
# 应用布林带策略
window = 20
num_std_dev = 2
df = bollinger_bands_strategy(df, window, num_std_dev)
# 可视化
plot_trading_signals(df)
- 点赞
- 收藏
- 关注作者
评论(0)