期货量化交易 - 经典策略回顾 附Python代码

举报
yd_232559543 发表于 2024/06/20 10:22:01 2024/06/20
【摘要】 一、趋势跟踪趋势跟踪策略是一种基于价格趋势的交易策略,假设市场价格会继续沿着其当前趋势运行。该策略不试图预测市场的转折点,而是通过跟随市场趋势来捕捉价格波动的主要部分。趋势跟踪策略可以应用于各种金融市场,包括期货市场。核心理念趋势跟踪策略的核心理念是“顺势而为”,即在价格上涨时做多(买入),在价格下跌时做空(卖出)。它基于以下两个主要假设:市场趋势的持续性:一旦市场形成趋势,价格将继续沿着该...

一、趋势跟踪
趋势跟踪策略是一种基于价格趋势的交易策略,假设市场价格会继续沿着其当前趋势运行。该策略不试图预测市场的转折点,而是通过跟随市场趋势来捕捉价格波动的主要部分。趋势跟踪策略可以应用于各种金融市场,包括期货市场。

核心理念
趋势跟踪策略的核心理念是“顺势而为”,即在价格上涨时做多(买入),在价格下跌时做空(卖出)。它基于以下两个主要假设:

市场趋势的持续性:一旦市场形成趋势,价格将继续沿着该趋势运动一段时间。
市场反转的不可预测性:价格趋势的反转是难以预测的,因此交易者不试图提前捕捉市场的顶部或底部,而是顺应已经形成的趋势进行交易。


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)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。