快速开始
本指南将帮助您快速上手 NautilusTrader,从基本概念到运行您的第一个回测。
前提条件
在开始之前,请确保您已经:
- 安装了 NautilusTrader(参见 安装指南)
- 熟悉 Python 编程
- 了解基本的交易概念
基本概念
核心组件
NautilusTrader 的核心组件包括:
- TradingNode: 交易系统的主要入口点
- Strategy: 交易策略的基类
- Instrument: 交易工具(股票、期货、加密货币等)
- Data: 市场数据(K线、tick数据等)
- Orders: 订单管理
- Portfolio: 投资组合管理
架构概览
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Data Feed │ │ Strategy │ │ Execution │
│ │───▶│ │───▶│ │
│ (Market Data) │ │ (Trading Logic)│ │ (Orders) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
第一个策略
让我们创建一个简单的移动平均交叉策略:
from nautilus_trader.model.data import Bar
from nautilus_trader.model.data import BarType
from nautilus_trader.model.identifiers import InstrumentId
from nautilus_trader.model.instruments import CurrencyPair
from nautilus_trader.trading.strategy import Strategy
from nautilus_trader.indicators.average.sma import SimpleMovingAverage
class MovingAverageCrossStrategy(Strategy):
"""
简单的移动平均交叉策略
"""
def __init__(self, config=None):
super().__init__(config)
# 创建技术指标
self.fast_ma = SimpleMovingAverage(10) # 快速移动平均线
self.slow_ma = SimpleMovingAverage(20) # 慢速移动平均线
# 策略状态
self.instrument_id = None
self.instrument = None
def on_start(self):
"""策略启动时调用"""
self.log.info("策略启动")
# 订阅市场数据
self.instrument_id = InstrumentId.from_str("EUR/USD.SIM")
self.subscribe_bars(BarType.from_str("EUR/USD.SIM-1-MINUTE-BID-INTERNAL"))
def on_bar(self, bar: Bar):
"""接收到新K线数据时调用"""
# 更新指标
self.fast_ma.update_raw(bar.close.as_double())
self.slow_ma.update_raw(bar.close.as_double())
# 检查指标是否已初始化
if not self.fast_ma.initialized or not self.slow_ma.initialized:
return
# 交易逻辑
fast_value = self.fast_ma.value
slow_value = self.slow_ma.value
# 金叉:快线上穿慢线,买入信号
if fast_value > slow_value and not self.portfolio.is_net_long(self.instrument_id):
self.buy()
# 死叉:快线下穿慢线,卖出信号
elif fast_value < slow_value and not self.portfolio.is_net_short(self.instrument_id):
self.sell()
def buy(self):
"""买入操作"""
order = self.order_factory.market(
instrument_id=self.instrument_id,
order_side=OrderSide.BUY,
quantity=Quantity.from_int(100_000),
)
self.submit_order(order)
def sell(self):
"""卖出操作"""
order = self.order_factory.market(
instrument_id=self.instrument_id,
order_side=OrderSide.SELL,
quantity=Quantity.from_int(100_000),
)
self.submit_order(order)
设置回测环境
现在让我们设置回测环境来测试策略:
from nautilus_trader.backtest.node import BacktestNode
from nautilus_trader.config import BacktestRunConfig
from nautilus_trader.config import BacktestVenueConfig
from nautilus_trader.config import BacktestDataConfig
from nautilus_trader.config import BacktestEngineConfig
from nautilus_trader.model.currencies import USD
from nautilus_trader.model.objects import Money
# 配置回测参数
config = BacktestRunConfig(
engine=BacktestEngineConfig(
strategies=[
{
"strategy_class": MovingAverageCrossStrategy,
"config": {},
}
]
),
venues=[
BacktestVenueConfig(
name="SIM",
oms_type="HEDGING",
account_type="MARGIN",
base_currency="USD",
starting_balances=["1000000 USD"],
)
],
data=[
BacktestDataConfig(
catalog_path="path/to/your/data/catalog",
data_cls="nautilus_trader.model.data.bar.Bar",
instrument_id="EUR/USD.SIM",
start_time="2023-01-01T00:00:00Z",
end_time="2023-12-31T23:59:59Z",
)
],
)
# 创建回测节点
node = BacktestNode(configs=[config])
# 运行回测
results = node.run()
分析结果
回测完成后,您可以分析结果:
# 获取账户统计
account = results[0].account
print(f"起始余额: {account.starting_balances}")
print(f"结束余额: {account.balances()}")
print(f"总盈亏: {account.total_pnl()}")
print(f"已实现盈亏: {account.realized_pnl()}")
print(f"未实现盈亏: {account.unrealized_pnl()}")
# 获取交易统计
portfolio = results[0].portfolio
print(f"总交易次数: {len(portfolio.orders)}")
print(f"盈利交易: {portfolio.win_rate}")
print(f"最大回撤: {portfolio.max_drawdown}")
实时交易
要将策略用于实时交易,您需要:
- 配置实时数据源
- 配置交易所连接
- 使用
TradingNode
而不是BacktestNode
from nautilus_trader.live.node import TradingNode
from nautilus_trader.config import TradingNodeConfig
# 实时交易配置
config = TradingNodeConfig(
# 配置数据提供商
data_clients={
"BINANCE": {
"api_key": "your_api_key",
"api_secret": "your_api_secret",
}
},
# 配置执行客户端
exec_clients={
"BINANCE": {
"api_key": "your_api_key",
"api_secret": "your_api_secret",
}
},
# 策略配置
strategies=[
{
"strategy_class": MovingAverageCrossStrategy,
"config": {},
}
],
)
# 创建交易节点
node = TradingNode(config=config)
# 启动实时交易
node.start()
下一步
现在您已经了解了 NautilusTrader 的基础知识,建议您:
常见问题
Q: 如何获取历史数据?
A: 您可以使用各种数据提供商,如 Databento、Tardis 或直接从交易所获取数据。
Q: 支持哪些交易所?
A: NautilusTrader 支持多个交易所,包括 Binance、Bybit、Interactive Brokers 等。
Q: 如何优化策略性能?
A: 使用内置的性能分析工具,优化指标计算,并考虑使用 Cython 扩展。
Q: 可以进行纸上交易吗?
A: 是的,您可以使用模拟账户进行纸上交易测试。
获取帮助
如果您需要帮助:
- 查看 GitHub Issues
- 加入 Discord 社区
- 阅读 开发者指南
- 查看 示例代码