背景
1、使用框架帮助提升回测的准确度
基础概念
量化回测
手续费(Commission):
手续费是交易者在执行交易时需要支付给经纪商的费用。这个费用可能是固定的,也可能是基于交易金额的百分比。
滑点(Slippage):
滑点是指交易实际执行价格与预期执行价格之间的差异。滑点可能是由于市场波动、交易量不足或执行速度慢等原因造成的。
保证金(Margin):
保证金是交易者在进行杠杆交易时需要存入的一部分资金,作为潜在亏损的保证。保证金允许交易者借入资金进行更大额度的交易。
Filler:
在某些交易系统中,Filler 是一个组件,用于模拟订单的执行过程,包括订单如何被填充(即成交)。
Writer:
Writer 在交易系统中可能指的是将交易数据写入文件或数据库的组件,用于记录交易历史和策略表现。
Broker:
Broker 是提供交易平台和执行交易服务的个人或公司。Broker 可以是传统的金融经纪商,也可以是提供算法交易接口的电子经纪商。
策略结果分析和评价:
这是指对交易策略的表现进行定量和定性的评估,以确定其有效性和潜在的改进空间。
Observer与Analyzer:
在量化交易框架如 Backtrader 中,Observer 和 Analyzer 是用于监控和分析策略表现的工具。Observer 可以在策略运行时实时监控数据,而 Analyzer 提供了多种分析方法来评估策略的历史表现。
Pyfolio Analyzer:
Pyfolio 是一个用于分析和可视化金融策略表现的 Python 库。它提供了一套丰富的工具,可以帮助交易者评估策略的表现,并与基准进行比较。
策略结果分析和评价
Observer与Analyzer
Pyfolio Analyzer
什么叫做portfolio基本的回测
有多个资产通常调仓时间固定目标是使得特定资产达到特定权重
使用场景:多因子组合的回测、FOF的回测,大类资产配置.
代码
下面代码创建一个基本的回测策略,并对上证指数的历史数据进行回测。
1、数据获取
import backtrader as bt
import akshare as ak
import pandas as pd
# 获取上证指数的历史数据,这里使用前复权数据
stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol='000001.SH',
start_date='20200101',
end_date='20240829',
adjust='qfq')
# 将数据转换为适合Backtrader的格式
data = pd.DataFrame(stock_zh_a_hist_df['日K线'])
data['date'] = pd.to_datetime(data['日期'])
data.set_index('date', inplace=True)
data = data[['开盘价', '最高价', '最低价', '收盘价', '成交量']] # 选取需要的列
2、策略构建
使用简单的移动平均线作为策略模式。
# 创建一个简单的移动平均交叉策略
class SmaCross(bt.Strategy):
params = dict(
pfast=10, # 快速移动平均线的周期
pslow=30 # 慢速移动平均线的周期
)
def __init__(self):
# 初始化两个移动平均线
self.ma_fast = bt.indicators.SimpleMovingAverage(self.data, period=self.p.pfast)
self.ma_slow = bt.indicators.SimpleMovingAverage(self.data, period=self.p.pslow)
def next(self):
# 检查是否两个移动平均线都已经计算完成
if self.ma_fast[-1] and self.ma_slow[-1]:
# 买入条件:快速线从下向上穿过慢速线
if self.ma_fast[-1] < self.ma_slow[-1] and self.ma_fast[0] > self.ma_slow[0]:
self.buy()
# 卖出条件:快速线从上向下穿过慢速线
elif self.ma_fast[-1] > self.ma_slow[-1] and self.ma_fast[0] < self.ma_slow[0]:
self.sell()
3、使用回测框架进行测试
# 创建Cerebro引擎
cerebro = bt.Cerebro()
# 将数据添加到Cerebro引擎
data = bt.feeds.PandasData(dataname=data)
cerebro.adddata(data)
# 添加策略
cerebro.addstrategy(SmaCross)
# 设定初始资金
cerebro.broker.setcash(100000)
# 运行回测
cerebro.run()
# 绘制结果
cerebro.plot()
额外内容设置方式
import backtrader as bt
# 定义交易费用和滑点
class MyCommissionInfo(bt.CommInfo):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 设置滑点为价格的2%,即0.02
self.perc = 0.02
# 创建 cerebro 对象
cerebro = bt.Cerebro()
# 设置交易费用
cerebro.broker.setcommission(commission=MyCommissionInfo())
# 其余的策略和数据设置...
参考文献
Backtrader 文档学习- 整体架构功能分析理解
backtrader简明教程01
backtrader简明教程02
backtrader简明教程03