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}")
# 其他交易逻辑(买入或卖出)