fastquant封装backtrader,仅用3行代码即可回测交易策略,含机器学习、情绪策略

1 概述

为了进一步简化backtrader的操作,Github上有人封装backtrader,形成了一个新的框架fastquant,可以极大地简化backtrader开发,对初学者可能有帮助,其框架和策略结构,对老手也有借鉴意义。

2 使用案例

首先,安装该框架: pip install fastquant

2.1 股票经典双均线策略回测

以下三行代码,从网上api提取菲律宾股市的股票"JFC"的日线数据,然后用经典的双均线策略进行回测。

from fastquant import backtest, get_stock_data
jfc = get_stock_data("JFC", "2018-01-01", "2019-01-01",format="ohlcv")
backtest('smac', jfc, fast_period=15, slow_period=40)
# Starting Portfolio Value: 100000.00
# Final Portfolio Value: 1002272.90

代码分析:

(1)get_stock_data函数:可以从yahoo金融提美股数据(需要翻墙,比如提取特斯拉的数据tsla = get_stock_data("TSLA", "2018-01-01", "2019-01-01", format="ohlcv")),这里提取的是菲律宾股市的数据,不需要翻墙。可以修订该函数,使其支持提取中国股票数据的功能,比如从baostock提取数据。返回pandas dataframe。

(2)backtest函数:这里的smac是框架提供的内置双均线策略,可以在python该框架安装处找到策略文件,目前支持如下策略。你也可以把自己开发的策略加进去。

backtest的第二个参数接收dataframe或者csv文件路径。该策略默认全仓买入,全仓卖出。你可以通过参数改变买入或卖出金额比例,比如backtest("smac", jfc, buy_prop=0.50, sell_prop=0.50, commission=0.01)

读者可以运行上述代码观察结果。

如何你进入backtest函数查看,就会看到作者如何封装backtrader了,很简单。

2.2 新闻情绪策略

根据新闻分析情绪,进行交易。比如如下代码提取特斯拉相关新闻,进行情绪分析和交易(代码运行需要翻墙)。

from fastquant import get_yahoo_data, get_bt_news_sentiment
data = get_yahoo_data("TSLA", "2020-01-01", "2020-07-04")
sentiments = get_bt_news_sentiment(keyword="tesla", page_nums=3)
backtest("sentiment", data, sentiments=sentiments, senti=0.2)

# Starting Portfolio Value: 100000.00
# Final Portfolio Value: 313198.37
# Note: Unfortunately, you can't recreate this scenario due to inconsistencies in the dates and sentiments that is scraped by get_bt_news_sentiment. In order to have a quickstart with News Sentiment Strategy you need to make the dates consistent with the sentiments that you are scraping.

from fastquant import get_yahoo_data, get_bt_news_sentiment
from datetime import datetime, timedelta

# we get the current date and delta time of 30 days
current_date = datetime.now().strftime("%Y-%m-%d")
delta_date = (datetime.now() - timedelta(30)).strftime("%Y-%m-%d")
data = get_yahoo_data("TSLA", delta_date, current_date)
sentiments = get_bt_news_sentiment(keyword="tesla", page_nums=3)
backtest("sentiment", data, sentiments=sentiments, senti=0.2)

2.3 多策略同时运行

以下代码同时执行多个策略、同时进行策略参数的优化。

df = get_stock_data("JFC", "2018-01-01", "2019-01-01")

# Utilize single set of parameters
strats = { 
    "smac": {"fast_period": 35, "slow_period": 50}, 
    "rsi": {"rsi_lower": 30, "rsi_upper": 70} 
} 
res = backtest("multi", df, strats=strats)
res.shape
# (1, 16)


# Utilize auto grid search
strats_opt = { 
    "smac": {"fast_period": 35, "slow_period": [40, 50]}, 
    "rsi": {"rsi_lower": [15, 30], "rsi_upper": 70} 
} 

res_opt = backtest("multi", df, strats=strats_opt)
res_opt.shape
# (4, 16)

2.4 基于机器学习和统计预测定制策略(比特币案例)

正如我们以前说的,backtrader可以和机器学习结合。将机器学习的预测结果送进backtrader。这里送进fastquant也是一样。

需要安装fbprophet包,它是Facebook出品的基于机器学习的预测包。以下代码首先预测明日价格,然后构造未来一日收益率。

回测时,输入数据加一列"custom",记录的是明日收益率,然后,当明日收益率大于1.5%则买入,小于-1.5%则卖出。

from fastquant import get_crypto_data, backtest
from fbprophet import Prophet
from matplotlib import pyplot as plt

# Pull crypto data
df = get_crypto_data("BTC/USDT", "2019-01-01", "2020-05-31")

# Fit model on closing prices 训练模型
ts = df.reset_index()[["dt", "close"]]
ts.columns = ['ds', 'y']
m = Prophet(daily_seasonality=True, yearly_seasonality=True).fit(ts)
forecast = m.make_future_dataframe(periods=0, freq='D')

# Predict and plot 预测明日收盘价
pred = m.predict(forecast)
fig1 = m.plot(pred)
plt.title('BTC/USDT: Forecasted Daily Closing Price', fontsize=25)

# Convert predictions to expected 1 day returns 将预测值转为1日收益率
expected_1day_return = pred.set_index("ds").yhat.pct_change().shift(-1).multiply(100)

# Backtest the predictions, 
# given that we buy bitcoin when the predicted next day return is > +1.5%, 
# and sell when it's < -1.5%.
# 回测,当明日收益率大于1.5%则买入,小于-1.5%则卖出。
df["custom"] = expected_1day_return.multiply(-1)
backtest("custom", df.dropna(),upper_limit=1.5, lower_limit=-1.5)

小结:fastquant提供了一层封装,简化了一些开发场景。当然,你也可以不用封装,直接使用backtrader来实现如上功能,并不麻烦。

猜你喜欢

转载自blog.csdn.net/qtbgo/article/details/114406704