量化交易系统开发-实时行情自动化交易-8.18.Manifold Capital平台

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

接下来会对于Manifold Capital平台介绍。

Manifold Capital是一款专业的量化交易平台,支持Python开发环境,专注于多资产类别的策略开发和回测,包括股票、期货、外汇和加密货币等。平台提供高效的数据获取、策略运行和回测功能,适合从基础学习到专业应用的量化交易开发者。

以下通过一个经典的“双均线策略”实例,介绍如何在Manifold Capital平台上完成量化交易策略的开发与回测。


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

策略逻辑

双均线策略是一种简单的趋势跟随策略,通过短期均线和长期均线的交叉信号捕捉趋势方向:

  • 买入信号:短期均线上穿长期均线(黄金交叉)。
  • 卖出信号:短期均线下穿长期均线(死亡交叉)。
策略适用范围
  • 优势:适用于趋势性市场,如商品期货或股票市场的牛市阶段。
  • 局限:在震荡市中容易产生频繁的虚假信号。

2. 策略开发

在Manifold Capital平台上,量化策略通常通过Python语言编写,以下为实现双均线策略的具体步骤和代码。

(1)初始化策略

首先,设定策略的基本信息,包括初始资金、交易标的和均线参数。

from manifold import Strategy, MarketData

class DualMovingAverageStrategy(Strategy):
    def initialize(self):
        # 设置初始资金
        self.set_initial_cash(100000)
        
        # 定义交易标的
        self.symbol = "AAPL"  # 苹果股票
        self.add_symbol(self.symbol)
        
        # 定义短期和长期均线的时间窗口
        self.short_window = 10
        self.long_window = 50

        # 初始化持仓状态
        self.position = 0  # 0表示空仓,1表示多头持仓

        # 打印日志
        self.log("策略初始化完成")

(2)获取数据和计算均线

利用Manifold的MarketData接口,获取历史数据并计算短期和长期均线。

    def calculate_moving_average(self, data, window):
        """
        计算移动平均线
        :param data: 收盘价列表
        :param window: 均线窗口
        :return: 平均值
        """
        if len(data) < window:
            return None
        return sum(data[-window:]) / window
(3)生成交易信号

根据短期和长期均线的交叉关系生成买入或卖出信号。

    def on_data(self, data: MarketData):
        # 获取当前收盘价
        close_prices = data.get_prices(self.symbol, field="close")

        # 确保数据足够
        if len(close_prices) < self.long_window:
            return

        # 计算短期均线和长期均线
        short_ma = self.calculate_moving_average(close_prices, self.short_window)
        long_ma = self.calculate_moving_average(close_prices, self.long_window)

        # 买入逻辑
        if short_ma > long_ma and self.position == 0:
            self.buy(self.symbol, quantity=100)  # 买入100股
            self.position = 1
            self.log(f"买入信号触发,价格: {close_prices[-1]}")

        # 卖出逻辑
        elif short_ma < long_ma and self.position == 1:
            self.sell(self.symbol, quantity=100)  # 卖出100股
            self.position = 0
            self.log(f"卖出信号触发,价格: {close_prices[-1]}")

3. 策略回测

在Manifold Capital平台中,回测是验证策略历史表现的核心步骤,以下是具体实现。

(1)设置回测时间范围

配置回测时间范围以及数据频率。

from manifold import Backtest

# 设置回测时间
backtest = Backtest(
    strategy=DualMovingAverageStrategy,
    start_date="2020-01-01",
    end_date="2022-01-01",
    frequency="daily"  # 数据频率为日线
)
(2)运行回测

通过回测引擎执行策略,系统会自动加载历史数据并执行交易逻辑。

# 运行回测
results = backtest.run()

# 打印日志
for log in results.logs:
    print(log)

4. 策略优化

(1)参数优化

通过改变短期和长期均线的时间窗口,寻找最佳参数组合。

# 参数范围
short_windows = range(5, 20)
long_windows = range(30, 60)

# 网格搜索
for short in short_windows:
    for long in long_windows:
        if short >= long:
            continue
        backtest = Backtest(
            strategy=DualMovingAverageStrategy,
            start_date="2020-01-01",
            end_date="2022-01-01",
            frequency="daily",
            parameters={"short_window": short, "long_window": long}
        )
        results = backtest.run()
        print(f"短期均线: {short}, 长期均线: {long}, 收益率: {results.total_return}")
(2)止盈止损机制

为进一步控制风险,可以引入止盈和止损条件。

    def on_data(self, data: MarketData):
        close_prices = data.get_prices(self.symbol, field="close")
        if len(close_prices) < self.long_window:
            return

        short_ma = self.calculate_moving_average(close_prices, self.short_window)
        long_ma = self.calculate_moving_average(close_prices, self.long_window)

        if self.position == 1:
            # 检查止盈止损
            current_price = close_prices[-1]
            entry_price = self.get_position(self.symbol).entry_price
            pnl = (current_price - entry_price) / entry_price

            if pnl >= 0.1:  # 止盈10%
                self.sell(self.symbol, quantity=100)
                self.position = 0
                self.log(f"止盈触发,价格: {current_price}")

            elif pnl <= -0.05:  # 止损5%
                self.sell(self.symbol, quantity=100)
                self.position = 0
                self.log(f"止损触发,价格: {current_price}")

        # 其他交易逻辑(买入或卖出)