0 前言
三个月前,我们发布了公众号的量化投研工具包 trade-learn 第一版,有许多小伙伴私信咨询我该如何使用,这也让我们感受了大家的热情以及该计划的价值。
近期,trade-learn 也开始陆陆续续进行更新维护,希望能在未来几年一点一滴地把这个工具包打造成一个比较适用的开源项目,现在还是挺简陋的。
相比于第一版的初涉外盘行情,现在开始全面拥抱外盘,同时它将回测引擎 backtrader 进行更换成 backtesting.py,并且仍然支持投资组合多标的策略搭建。
本文就首次尝试使用 tradingview 的历史行情进行策略回测,并评估 trade-learn 的新回测引擎的有效性。
1 使用 trade-learn 搭建单标的多空策略
在这一节中,我们通过调用 trade-learn 的 Query 数据查询模块,得到来自 tradingview 的位于 NASDAQ 交易所的 GOOG 股票行情,并用来搭建单标的多空策略并进行回测。
在搭建过程中,我们假设每次指标计算均使用昨日收盘价,如果满足买卖点规则,那么在今日开盘价进行交易,每笔佣金为千二,初始金额为一百万元。
买卖点规则:当短期均线上穿长期均线时做多股票,当短期均线上穿长期均线时做空股票。
from tradelearn.query import Query
from tradelearn.strategy.backtest import Backtest, Strategy
from tradelearn.strategy.evaluate import Evaluate
GOOG = Query.history_ohlc(engine='tv', symbol='GOOG', exchange='NASDAQ')
def crossover(series1, series2):
return series1[-2] < series2[-2] and series1[-1] > series2[-1]
class SmaCross(Strategy):
fast = 10
slow = 20
def init(self):
def SMA(arr, n):
return arr.rolling(n).mean()
price = self.data.close.df
self.ma1 = self.I(SMA, price, self.fast, overlay=True)
self.ma2 = self.I(SMA, price, self.slow, overlay=True)
def next(self):
if crossover(self.ma1, self.ma2):
self.position().close()
self.buy()
elif crossover(self.ma2, self.ma1):
self.position().close()
self.sell()
bt = Backtest(GOOG, SmaCross, cash=1000000, commission=.002, trade_on_close=False)
stats = bt.run()
bt.plot(plot_volume=True, superimpose=True)
Evaluate.analysis_report(stats, GOOG, engine='quantstats')
下面是 trade-learn 的回测引擎自动打印出来的评估结果与 HTML 图表:
Start 2014-03-27 00:00:00
End 2024-08-16 00:00:00
Duration 3795 days 00:00:00
Exposure Time [%] 98.509174
Equity Final [$] 233497.861225
Equity Peak [$] 1043778.801501
Return [%] -76.650214
Buy & Hold Return [%] 529.083876
Return (Ann.) [%] -13.163701
Volatility (Ann.) [%] 24.393102
Sharpe Ratio -0.539648
Sortino Ratio -0.680248
Calmar Ratio -0.154556
Max. Drawdown [%] -85.1713
Avg. Drawdown [%] -85.1713
Max. Drawdown Duration 3734 days 00:00:00
Avg. Drawdown Duration 3734 days 00:00:00
# Trades 146
Win Rate [%] 33.561644
Best Trade [%] 20.325583
Worst Trade [%] -15.835971
Avg. Trade [%] -0.991343
Max. Trade Duration 116 days 00:00:00
Avg. Trade Duration 26 days 00:00:00
Profit Factor 0.702201
Expectancy [%] -0.808854
SQN -2.538763
Kelly Criterion -0.272909
_strategy SmaCross
_equity_curve ...
_trades EntryBar E...
_orders Ticke...
_positions {'Asset': -1154,...
_trade_start_bar 19
同时,trade-learn 也与市面上主流的几个策略评估工具完成了对接,在这一节里,我们选用 quantstats 来进行更细致的结果分析,同样是 HTML 图表。
2 使用 tradingview 平台进行策略验证
在这一节中,我们反过来在 tradingview 平台编写相同的交易策略,使用平台的策略回测结果来与上一节的结果进行对比,以验证我们的 trade-learn 的回测引擎的有效性。
下面是相应的 tradingview 策略代码,不同于 trade-learn ,它使用的是 pine 编程语言。
//@version=5
strategy("MovingAvg2Line Cross", overlay=true)
fastLength = input(10)
slowLength = input(20)
price = close
mafast = ta.sma(price, fastLength)
maslow = ta.sma(price, slowLength)
if (ta.crossover(mafast, maslow))
strategy.entry("MA2CrossLE", strategy.long, comment="MA2CrossLE")
if (ta.crossunder(mafast, maslow))
strategy.entry("MA2CrossSE", strategy.short, comment="MA2CrossSE")
其中,佣金和初始金额均在页面上进行设置,与上一节保持一致,分别是千二、一百万元。
根据回测评估界面可知,它的净收益、总交易次数、胜率、最大回撤、单笔交易平均利润和单笔交易频率分别是 -78.19%、145、33.10%、84.50%、-0.88% 和 19。
在上一节中 trade-learn 的评估结果是 -76.65%、146、33.56%、-85.17%、-0.99% 和 19。考虑到不同的回测系统之间的必然差异,trade-learn 的回测引擎结果可以被认定为接近 tradingview 平台结果。
trade-learn 的 github 仓库地址:https://github.com/MuuYesen/trade-learn