19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。

接下来会对于爱交易平台介绍。

爱交易是一款专为量化交易开发者设计的平台,提供了从数据获取、策略开发到回测的全流程工具支持。平台支持多种编程语言(如Python和C++),并提供了丰富的API接口和强大的回测引擎,适合用于各类量化交易策略的研究与开发。

本文将通过一个经典的“双均线策略”为例,展示如何在爱交易平台上完成量化交易策略的开发与回测。


1. 策略背景:双均线策略

策略逻辑

双均线策略是一种趋势跟随型交易策略,通过比较短期均线和长期均线的位置关系生成买卖信号:

  • 买入信号:短期均线(如10日均线)上穿长期均线(如50日均线),即黄金交叉。
  • 卖出信号:短期均线下穿长期均线,即死亡交叉。
适用场景
  • 优势:适用于趋势性较强的市场,能有效捕捉价格波动。
  • 局限:在震荡市场中容易产生较多的错误信号。

2. 策略开发

以下代码基于爱交易平台的Python SDK实现双均线策略的开发与回测。

(1)准备工作

在使用爱交易平台前,需要完成以下准备:

  1. 安装SDK:爱交易提供了官方Python库,用户需提前安装。
    pip install iaj
    
  2. 注册开发者账号:申请API权限。
(2)初始化参数与环境
# 导入必要模块
from iaj import Strategy, MarketData, BacktestEngine
import pandas as pd

# 策略参数
SHORT_PERIOD = 10  # 短期均线周期
LONG_PERIOD = 50   # 长期均线周期
INITIAL_CAPITAL = 100000  # 初始资金
STOCK_CODE = '000001.SZ'  # 平安银行
(3)获取历史数据

通过爱交易的MarketData模块获取指定标的的历史行情数据。

# 获取历史数据函数
def get_stock_data(stock_code, start_date, end_date):
    market_data = MarketData()
    df = market_data.get_kline(stock_code, start_date=start_date, end_date=end_date, ktype='1d')
    df = df[['date', 'close']]  # 提取日期和收盘价
    df.rename(columns={'date': 'Date', 'close': 'Close'}, inplace=True)
    df['Date'] = pd.to_datetime(df['Date'])
    df.set_index('Date', inplace=True)
    return df

# 加载数据
start_date = '2020-01-01'
end_date = '2022-01-01'
data = get_stock_data(STOCK_CODE, start_date, end_date)
(4)计算均线

利用Pandas计算短期和长期均线。

# 计算短期和长期均线
data['Short_MA'] = data['Close'].rolling(window=SHORT_PERIOD).mean()
data['Long_MA'] = data['Close'].rolling(window=LONG_PERIOD).mean()
(5)生成交易信号

根据短期均线与长期均线的交叉情况生成交易信号。

# 生成交易信号
data['Signal'] = 0  # 初始化信号列
data.loc[data['Short_MA'] > data['Long_MA'], 'Signal'] = 1  # 买入信号
data.loc[data['Short_MA'] <= data['Long_MA'], 'Signal'] = -1  # 卖出信号
(6)回测逻辑

基于生成的信号模拟交易过程,计算资金和持仓变化。

# 初始化回测变量
data['Position'] = 0  # 持仓状态
data['Cash'] = INITIAL_CAPITAL  # 初始资金
data['Portfolio'] = INITIAL_CAPITAL  # 总资产

holdings = 0  # 当前持仓
entry_price = 0  # 买入价格

# 回测主逻辑
for i in range(1, len(data)):
    current_signal = data.iloc[i]['Signal']  # 当前信号
    current_price = data.iloc[i]['Close']   # 当前收盘价

    # 买入逻辑
    if current_signal == 1 and holdings == 0:
        holdings = data.iloc[i - 1]['Cash'] // current_price  # 按资金最大买入
        data.at[data.index[i], 'Cash'] = data.iloc[i - 1]['Cash'] - holdings * current_price
        data.at[data.index[i], 'Position'] = holdings
        entry_price = current_price  # 记录买入价格

    # 卖出逻辑
    elif current_signal == -1 and holdings > 0:
        data.at[data.index[i], 'Cash'] = data.iloc[i - 1]['Cash'] + holdings * current_price
        holdings = 0
        data.at[data.index[i], 'Position'] = holdings

    # 计算总资产
    current_holdings = holdings * current_price  # 持仓市值
    data.at[data.index[i], 'Portfolio'] = data.iloc[i]['Cash'] + current_holdings

3. 策略优化

(1)参数优化

通过遍历不同的短期和长期均线参数,寻找最优组合。

best_params = None
best_return = -float('inf')

for short_period in range(5, 21):
    for long_period in range(30, 101):
        if short_period >= long_period:
            continue

        # 重新计算均线
        data['Short_MA'] = data['Close'].rolling(window=short_period).mean()
        data['Long_MA'] = data['Close'].rolling(window=long_period).mean()

        # 根据均线生成交易信号
        data['Signal'] = 0
        data.loc[data['Short_MA'] > data['Long_MA'], 'Signal'] = 1
        data.loc[data['Short_MA'] <= data['Long_MA'], 'Signal'] = -1

        # 简化回测逻辑
        holdings = 0
        cash = INITIAL_CAPITAL
        for i in range(1, len(data)):
            signal = data.iloc[i]['Signal']
            price = data.iloc[i]['Close']
            if signal == 1 and holdings == 0:
                holdings = cash // price
                cash -= holdings * price
            elif signal == -1 and holdings > 0:
                cash += holdings * price
                holdings = 0

        portfolio = cash + holdings * data.iloc[-1]['Close']
        total_return = (portfolio - INITIAL_CAPITAL) / INITIAL_CAPITAL

        if total_return > best_return:
            best_return = total_return
            best_params = (short_period, long_period)

print(f"最佳参数:短期均线={best_params[0]}, 长期均线={best_params[1]}, 收益率={best_return:.2%}")
(2)风险管理

在策略中添加止盈止损机制,控制回撤风险。

TAKE_PROFIT = 0.1  # 止盈10%
STOP_LOSS = 0.05   # 止损5%

for i in range(1, len(data)):
    if holdings > 0:
        pnl = (data.iloc[i]['Close'] - entry_price) / entry_price
        if pnl >= TAKE_PROFIT or pnl <= -STOP_LOSS:
            data.at[data.index[i], 'Cash'] = data.iloc[i - 1]['Cash'] + holdings * data.iloc[i]['Close']
            holdings = 0
            data.at[data.index[i], 'Position'] = holdings

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐