主页 > imtoken苹果版testflight > fastquant仅用3行代码封装了backtrader和回测交易策略

fastquant仅用3行代码封装了backtrader和回测交易策略

imtoken苹果版testflight 2023-01-18 13:30:18

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 finance中提取美股数据(需要翻墙,比如提取特斯拉的数据 tsla = get_stock_data("TSLA", "2018-01-01", "2019-01- 01", format="ohlcv")), 这里是菲律宾股市的数据,不用翻墙。 可以修改此功能支持提取中国股票数据的功能,比如从baostock中提取数据。 返回熊猫数据框。

(2)回测功能:这里的smac是框架提供的内置双均线策略。 策略文件可以在python框架的安装位置找到。 目前,支持以下策略。 您还可以添加自己制定的策略。

比特币案例ppt_比特币案例分析_比特币挖矿源代码分析

backtest 的第二个参数接收 dataframe 或 csv 文件路径。 默认情况下,此策略买入所有头寸并卖出所有头寸。 可以通过参数改变买卖金额比例,比如backtest("smac", jfc, buy_prop=0.50, sell_prop=0.50, commission=0.01)

比特币案例ppt_比特币挖矿源代码分析_比特币案例分析

读者可以运行上面的代码来观察结果。

如果你进入回测功能查看,你会看到作者是如何封装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

比特币挖矿源代码分析_比特币案例分析_比特币案例ppt

# 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} 

比特币挖矿源代码分析_比特币案例分析_比特币案例ppt

} 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)

比特币案例分析_比特币案例ppt_比特币挖矿源代码分析

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)

比特币案例ppt_比特币案例分析_比特币挖矿源代码分析

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实现以上功能,也不麻烦。