- 以下是使用 Python 实现十种量化交易策略的简要概述,具体实现可能因市场条件和数据质量而有所不同。
海龟交易策略
- 基于唐奇安通道突破系统,买入价格突破20天高点,卖出突破20天低点,退出条件为10天低点或高点。
- 示例:使用 yfinance 下载数据,计算20天和10天高低点,模拟交易信号。
均值回归策略
- 假设价格会回归历史均值,买入低于移动平均线(MA)的价格,卖出高于MA的价格。
- 示例:使用50天MA和标准差,设置上下带宽,生成买卖信号。
套利策略(配对交易)
- 利用两个相关资产的价格差异,检查共整合性,交易价差偏离均值时买入低估资产,卖出高估资产。
- 示例:使用ADF测试检查共整合,计算价差Z分数,设置交易阈值。
趋势跟踪策略
- 跟随市场趋势,买入短期移动平均线(MA)上穿长期MA,卖出下穿时。
- 示例:使用50天和200天MA,生成买卖信号,模拟交易回报。
统计套利策略
- 类似于均值回归和配对交易,基于统计关系识别资产错价。
- 示例:可参考均值回归和配对交易的实现。
事件驱动策略
- 关注重大事件(如财报发布),在事件前后交易,基于预期价格变动。
- 示例:假设有事件日期,提前一天买入,事件后一天卖出,计算回报。
量价分析策略
- 通过价格和交易量变化预测趋势,买入价格上涨且成交量显著增加时,卖出价格下跌且成交量增加时。
- 示例:计算每日价格和成交量变化,设置阈值生成信号。
质量轮动策略
- 根据资产质量(如收益增长)轮换投资,定期选择表现最佳的资产或板块。
- 示例:按月选择上月回报最高的板块,模拟投资轮换。
风险平价策略
- 基于资产风险贡献分配资本,确保每个资产的风险贡献相等。
- 示例:计算协方差矩阵,优化权重使风险贡献均衡。
CTA策略
- 商品交易顾问策略,通常为趋势跟踪,适用于期货市场。
- 示例:可参考趋势跟踪策略,调整为期货数据。
这些策略的实现需要进一步优化和风险管理,建议结合实际市场数据进行回测。
详细报告
以下是针对十种量化交易策略的详细实现指南,涵盖每个策略的核心原理、实现步骤和示例代码。这些策略基于历史价格数据和统计分析,适合量化交易初学者深入研究和优化。
1. 海龟交易策略
海龟交易策略是一种趋势跟随策略,基于唐奇安通道突破系统,旨在捕捉趋势性行情。其核心规则包括:
- 进入规则:当价格突破过去20天最高点时买入;当价格跌破过去20天最低点时卖空。
- 退出规则:多头头寸在价格跌破过去10天最低点时平仓;空头头寸在价格突破过去10天最高点时平仓。
- 仓位管理:基于波动率(True Range,TR)计算单位仓位,初始风险为账户的1%,使用20天指数移动平均线(EMA)计算N(平均真实波幅)。
实现步骤:
- 下载历史价格数据,包括开盘价、高价、低价、收盘价和成交量。
- 计算每日True Range,公式为:TR = max(High - Low, |High - Previous Close|, |Low - Previous Close|)。
- 计算N为TR的20天EMA。
- 计算20天和10天的滚动高点和低点。
- 模拟交易:根据进入和退出规则生成信号,记录每笔交易的回报。
示例代码:
import pandas as pd
import yfinance as yf
import numpy as np
def true_range(df):
df['tr'] = df.apply(lambda row: max(row['high'] - row['low'],
abs(row['high'] - df['close'].shift(1)),
abs(row['low'] - df['close'].shift(1))), axis=1)
return df['tr']
def turtle_strategy(df):
# 计算20天高点和低点(进入)
df['20d_high'] = df['high'].rolling(20).max()
df['20d_low'] = df['low'].rolling(20).min()
# 计算10天低点和高点(退出)
df['10d_low'] = df['low'].rolling(10).min()
df['10d_high'] = df['high'].rolling(10).max()
# 初始化仓位和回报
position = 0
entry_price = None
returns = []
for i in range(len(df)):
if i < 19: # 等待足够数据计算20天窗口
continue
if position == 0:
if df['close'].iloc[i] > df['20d_high'].iloc[i]:
position = 1 # 多头
entry_price = df['close'].iloc[i]
elif df['close'].iloc[i] < df['20d_low'].iloc[i]:
position = -1 # 空头
entry_price = df['close'].iloc[i]
elif position == 1:
if df['close'].iloc[i] < df['10d_low'].iloc[i]:
position = 0
exit_price = df['close'].iloc[i]
returns.append((exit_price - entry_price) / entry_price)
elif position == -1:
if df['close'].iloc[i] > df['10d_high'].iloc[i]:
position = 0
exit_price = df['close'].iloc[i]
returns.append((entry_price - exit_price) / entry_price)
return returns
# 示例使用
df = yf.download('AAPL', start='2010-01-01', end='2020-12-31')
df['tr'] = true_range(df)
df['N'] = df['tr'].ewm(span=20).mean()
returns = turtle_strategy(df)
print(f"Total return: {np.prod(1 + np.array(returns)) - 1:.2%}")
2. 均值回归策略
均值回归策略假设资产价格会回归其历史均值,当价格偏离均值时进行反向操作。
- 进入规则:当价格低于移动平均线(MA)或下轨带(MA - k*标准差)时买入;当价格高于上轨带时卖空。
- 退出规则:多头在价格回到MA或上轨时平仓;空头在价格回到MA或下轨时平仓。
实现步骤:
- 计算50天简单移动平均线(SMA)和标准差。
- 设置上下带宽,例如MA ± 1倍标准差。
- 根据价格与带宽的关系生成买卖信号。
示例代码:
def mean_reversion_strategy(df, window=50, k=1):
df['ma'] = df['close'].rolling(window).mean()
df['std'] = df['close'].rolling(window).std()
df['lower_band'] = df['ma'] - k * df['std']
df['upper_band'] = df['ma'] + k * df['std']
position = 0
returns = []
for i in range(len(df)):
if i < window - 1: # 等待足够数据
continue
if position == 0:
if df['close'].iloc[i] < df['lower_band'].iloc[i]:
position = 1 # 多头
entry_price = df['close'].iloc[i]
elif df['close'].iloc[i] > df['upper_band'].iloc[i]:
position = -1 # 空头
entry_price = df['close'].iloc[i]
elif position == 1:
if df['close'].iloc[i] > df['ma'].iloc[i]:
position = 0
exit_price = df['close'].iloc[i]
returns.append((exit_price - entry_price) / entry_price)
elif position == -1:
if df['close'].iloc[i] < df['ma'].iloc[i]:
position = 0
exit_price = df['close'].iloc[i]
returns.append((entry_price - exit_price) / entry_price)
return returns
returns = mean_reversion_strategy(df)
print(f"Total return: {np.prod(1 + np.array(returns)) - 1:.2%}")
3. 套利策略(配对交易)
配对交易利用两个相关资产的价格差异,通过统计套利获利。
- 共整合检查:使用ADF测试检查两个资产是否共整合。
- 价差计算:通过线性回归计算价差,价差为资产1价格 - 回归系数 * 资产2价格。
- 交易信号:当价差Z分数超过±2时,买入低估资产,卖出高估资产;当Z分数回到0附近时平仓。
实现步骤:
- 下载两个资产的历史价格数据。
- 使用statsmodels库进行ADF测试,检查共整合性。
- 计算价差和Z分数,设置交易阈值。
示例代码:
from statsmodels.tsa.stattools import coint
import numpy as np
def is_cointegrated(series1, series2):
results = coint(series1, series2)
return results[1] < 0.05
def get_hedge_ratio(series1, series2):
results = coint(series1, series2)
hedge_ratio = results[0]
return hedge_ratio
def pairs_trading_strategy(df1, df2):
if is_cointegrated(df1['close'], df2['close']):
hedge_ratio = get_hedge_ratio(df1['close'], df2['close'])
spread = df1['close'] - hedge_ratio * df2['close']
spread_mean = spread.mean()
spread_std = spread.std()
z_score = (spread - spread_mean) / spread_std
entry_threshold = 2
exit_threshold = 0
position = 0
returns = []
for i in range(len(spread)):
if z_score.iloc[i] < -entry_threshold and position == 0:
position = 1 # 多头df1,空头df2
entry_price = spread.iloc[i]
elif z_score.iloc[i] > entry_threshold and position == 0:
position = -1 # 空头df1,多头df2
entry_price = spread.iloc[i]
elif (position == 1 and z_score.iloc[i] > exit_threshold) or (position == -1 and z_score.iloc[i] < -exit_threshold):
position = 0
exit_price = spread.iloc[i]
if position == 1:
returns.append((exit_price - entry_price) / entry_price)
else:
returns.append((entry_price - exit_price) / entry_price)
return returns
else:
print("Assets are not cointegrated.")
return []
df1 = yf.download('AAPL', start='2010-01-01', end='2020-12-31')
df2 = yf.download('MSFT', start='2010-01-01', end='2020-12-31')
returns = pairs_trading_strategy(df1, df2)
print(f"Total return: {np.prod(1 + np.array(returns)) - 1:.2%}")
4. 趋势跟踪策略
趋势跟踪策略通过跟随市场趋势获利,常用移动平均线交叉或MACD指标。
- 移动平均线交叉:当短期MA上穿长期MA时买入,下穿时卖出。
- 实现:使用50天和200天MA,生成买卖信号。
示例代码:
def trend_following_strategy(df, short_window=50, long_window=200):
df['ma_short'] = df['close'].rolling(short_window).mean()
df['ma_long'] = df['close'].rolling(long_window).mean()
position = 0
returns = []
for i in range(len(df)):
if i < long_window - 1:
continue
if df['ma_short'].iloc[i] > df['ma_long'].iloc[i] and position == 0:
position = 1 # 买入
entry_price = df['close'].iloc[i]
elif df['ma_short'].iloc[i] < df['ma_long'].iloc[i] and position == 1:
position = 0
exit_price = df['close'].iloc[i]
returns.append((exit_price - entry_price) / entry_price)
elif df['ma_short'].iloc[i] < df['ma_long'].iloc[i] and position == 0:
position = -1 # 卖空
entry_price = df['close'].iloc[i]
elif df['ma_short'].iloc[i] > df['ma_long'].iloc[i] and position == -1:
position = 0
exit_price = df['close'].iloc[i]
returns.append((entry_price - exit_price) / entry_price)
return returns
returns = trend_following_strategy(df)
print(f"Total return: {np.prod(1 + np.array(returns)) - 1:.2%}")
5. 统计套利策略
统计套利策略基于统计模型分析历史数据,寻找资产组合的价差偏离,构建多空头寸。
- 实现:可参考均值回归和配对交易,基于统计关系生成信号。
6. 事件驱动策略
事件驱动策略关注公司并购、重组等重大事件,分析事件对股价影响制定交易策略。
- 进入规则:在事件(如财报发布)前买入,事件后卖出。
- 实现:假设有事件日期,提前一天买入,事件后一天卖出,计算回报。
示例代码:
import pandas as pd
def event_driven_strategy(df, event_dates, days_before=1, days_after=1):
positions = []
for date in event_dates:
buy_date = pd.to_datetime(date) - pd.Timedelta(days=days_before)
sell_date = pd.to_datetime(date) + pd.Timedelta(days=days_after)
if buy_date in df.index and sell_date in df.index:
entry_price = df.loc[buy_date, 'close']
exit_price = df.loc[sell_date, 'close']
return_rate = (exit_price - entry_price) / entry_price
positions.append(return_rate)
total_return = np.prod(1 + np.array(positions)) - 1
return total_return
earnings_dates = ['2020-01-28', '2020-04-28', '2020-07-28', '2020-10-27']
total_return = event_driven_strategy(df, earnings_dates)
print(f"Total return: {total_return:.2%}")
7. 量价分析策略
量价分析策略通过研究价格、交易量和持仓量关系预测趋势。
- 进入规则:价格上涨且成交量显著增加时买入;价格下跌且成交量增加时卖出。
- 实现:计算每日价格和成交量变化,设置阈值生成信号。
示例代码:
def volume_price_strategy(df, price_threshold=0.01, volume_threshold=0.5):
df['price_change'] = df['close'].pct_change()
df['volume_change'] = df['volume'].pct_change()
buy_signal = (df['price_change'] > price_threshold) & (df['volume_change'] > volume_threshold)
sell_signal = (df['price_change'] < -price_threshold) & (df['volume_change'] > volume_threshold)
position = 0
returns = []
for i in range(1, len(df)):
if buy_signal.iloc[i] and position == 0:
position = 1 # 买入
entry_price = df['close'].iloc[i]
elif sell_signal.iloc[i] and position == 1:
position = 0
exit_price = df['close'].iloc[i]
returns.append((exit_price - entry_price) / entry_price)
elif sell_signal.iloc[i] and position == 0:
position = -1 # 卖空
entry_price = df['close'].iloc[i]
elif buy_signal.iloc[i] and position == -1:
position = 0
exit_price = df['close'].iloc[i]
returns.append((entry_price - exit_price) / entry_price)
return returns
returns = volume_price_strategy(df)
print(f"Total return: {np.prod(1 + np.array(returns)) - 1:.2%}")
8. 质量轮动策略
质量轮动策略根据资产质量评估,发现并投资被低估的高质量资产。
- 进入规则:按月选择上月回报最高的板块或资产,轮换投资。
- 实现:计算各板块月度回报,选择表现最佳的板块。
示例代码:
def quality_rotation_strategy(data, sectors):
monthly_returns = {}
for sector in sectors:
monthly_returns[sector] = data[sector].resample('M').last().pct_change()
positions = []
current_month = None
for month in monthly_returns[sectors[0]].index:
if current_month is None:
current_month = month
continue
prev_month = current_month
current_month = month
best_sector = max(sectors, key=lambda x: monthly_returns[x].loc[prev_month])
positions.append(best_sector)
return positions
sectors = ['XLK', 'XLY', 'XLP', 'XLE', 'XLF', 'XLI', 'XLB', 'XLV', 'XLU']
data = {sector: yf.download(sector, start='2010-01-01', end='2020-12-31')['close'] for sector in sectors}
positions = quality_rotation_strategy(data, sectors)
print("Selected positions:", positions)
9. 风险平价策略
风险平价策略通过平衡投资组合中各资产类别的风险贡献度,优化风险分布。
- 进入规则:计算资产协方差矩阵,优化权重使每个资产的风险贡献相等。
- 实现:使用scipy.optimize求解权重,满足风险贡献均衡。
示例代码:
import numpy as np
from scipy.optimize import fsolve
def risk_contributions(weights, cov):
portfolio_vol = np.sqrt(weights @ cov @ weights.T)
risk_contribution = (weights * np.sqrt(cov.diagonal())) / portfolio_vol
return risk_contribution
def equal_risk_contribution(weights):
rc = risk_contributions(weights, cov_matrix)
return rc[0] - rc[1]
cov_matrix = np.array([[0.04, 0.02], [0.02, 0.09]])
weights_guess = np.array([0.5, 0.5])
weights = fsolve(equal_risk_contribution, weights_guess)
print("Risk parity weights:", weights)
10. CTA策略
CTA策略主要应用于期货和期权市场,通过追踪市场趋势制定决策。
- 实现:类似于趋势跟踪策略,可使用移动平均线交叉或MACD指标,调整为期货数据。
示例代码:参考趋势跟踪策略部分,替换为期货数据。
总结
以上策略的实现基于Python和常用金融库(如yfinance、pandas、statsmodels),每个策略都有其适用场景和复杂性。建议结合实际市场数据进行回测,优化参数并加入风险管理措施以适应真实交易环境。
| 策略名称 | 核心原理 | 主要指标/方法 | 示例数据源 |
|---|---|---|---|
| 龟交易策略 | 趋势跟随,突破系统 | 20天高低点,10天退出,N波动率 | yfinance (股票) |
| 均值回归策略 | 价格回归均值,买卖偏离带宽 | 移动平均线,标准差带宽 | yfinance (股票) |
| 套利策略(配对交易) | 利用资产价差,统计套利 | ADF测试,共整合,Z分数 | yfinance (两资产) |
| 趋势跟踪策略 | 跟随趋势,MA交叉 | 50/200天MA交叉 | yfinance (股票) |
| 统计套利策略 | 基于统计关系,识别错价 | 均值回归,配对交易 | yfinance (多资产) |
| 事件驱动策略 | 事件前后交易,基于预期价格变动 | 事件日期,价格变动 | yfinance + 事件数据 |
| 量价分析策略 | 价格和成交量关系预测趋势 | 价格变化,成交量变化,阈值 | yfinance (股票) |
| 质量轮动策略 | 按质量轮换投资,基于表现或基本面 | 月度回报,板块选择 | yfinance (板块指数) |
| 风险平价策略 | 风险贡献均衡,优化组合 | 协方差矩阵,优化权重 | yfinance (多资产) |
| CTA策略 | 趋势跟随,期货市场 | MA交叉,MACD,调整为期货 | yfinance (期货数据) |