编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Python量化backtrader01:账户资金初始化

wxchong 2025-02-17 14:21:52 开源技术 41 ℃ 0 评论

1 Installation【安装】

1.1Requirements and versions【所需要的库以及版本】

backtrader is self-contained with no external dependencies (except if you want to plot)

  • Python3.X【也可以支持2.X,但是2.X未来不会维护了,所以默认3.X版本】
  • Matplotlib>=1.4.1

1.2 Install from pypi(including matplotlib)【安装方式】

这里仅介绍pip方式

pip install backtrader

2.Quickstart【快速启动】

提示:注意backtrader更新,需要维护好自己的代码块。

Using the platform【使用平台】

在运行backtrader之前,我们必须弄清楚两个概念。

一个是line【这个是backtrader独有的概念】

一个是索引0的方法

  • 1.line:

这里笔者能够理解的就是一列数据,比如df['close']是df的一列,也是一line。

而要要运行backtrader,就必须至少传入6line,它们分别是:

Open, High, Low, Close, Volume, OpenInterest

OpenInterest:为持仓量,初始默认为0

如果我们还要考虑“datatime”【交易时间】,那么传入到backtrader,就是7line,不过一般datatime会被处理成df.index。

  • 2. Index 0 Approach:

我们访问当前值的位置始终是0,即close[0]

self.sma = SimpleMovingAverage(.....)#初始化self.sma
av = self.sma[0]#av代表self.sma[0]当前值

在我们进行比较和分析的过程中,你无须知道len(line)有多长,无需知道已经处理了多少个条/分钟/天/月,因为“ 0”唯一地标识当前时刻。

There is no need to know how many bars/minutes/days/months have been processed, because “0”uniquely identifies the current instant.

访问0索引之前的输出值:

previous_value = self.sma[-1]

以此类推,[-2],[-3]...

案例一:简单运行backtrader:

from __future__ import (absolute_import, division, print_function,
unicode_literals)
import backtrader as bt
if __name__ == '__main__':
    cerebro = bt.Cerebro()
    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
    cerebro.run()
    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

Starting Portfolio Value:初始投资组合价值

bs_func:cerebro.broker.getvalue()

Final Portfolio Value:最终投资组合价值

bs_func:cerebro.broker.getvalue()


run_result:

Starting Portfolio Value: 10000.00
Final Portfolio Value: 10000.00

实例讲解

  • 1.引入backtrader库的书写方法
  • 2.实例化交易资金
  • 3.运行【无策略,数据加载】
  • 4.打印结果
  • 5.Starting Portfolio Value默认为1万资金。

案例二:设置Starting Portfolio Value交易资金

from __future__ import (absolute_import, division, print_function,
unicode_literals)
import backtrader as bt
if __name__ == '__main__':
    cerebro = bt.Cerebro()
    cerebro.broker.setcash(100000.0)
    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
    cerebro.run()
    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

通过实例化的cerebro.broker.setcash函数进行修改初始交易资金金额

run_result:

Starting Portfolio Value: 100000.00
Final Portfolio Value: 100000.00

案例三:添加数据【Adding a Data Feed】

这里主要是因为backtrader使用的是YahooFinanceCSVData数据接口,笔者是用的本地的csv文本,所以要注意以下几点:

1.backtrader只接受7line,datetime as df.index,剩余6列作为col,一般而言,由于爬虫,购买或者专业的接口的不同,业务需求不同,都会使得原始数据无法直接在backtrader进行加载。

2.如何增加数据line,则需要对于backtrader的函数进行修改,这个未来介绍。

3.策略以及训练才是我们的目的,因此,我们需要对照自己的策略对于数据的要求,策略训练评估的要求,对于数据进行处理。


import os.path  # 路径管理
import sys  # 获取当前运行脚本的路径 (in argv[0])
import pandas as pd
from datetime import datetime
import backtrader as bt

import backtrader as bt
if __name__ == '__main__':
		# Create a cerebro entity
		cerebro = bt.Cerebro()
		# Datas are in a subfolder of the samples. Need to find where the script is
		# because it could have been called from anywhere
    
    #create a data feed
    
if __name__ == '__main__':
    # 创建Cerebro引擎
    cerebro = bt.Cerebro()
    # Cerebro引擎在后台创建broker(经纪人),系统默认资金量为10000

    # 为Cerebro引擎添加策略
    #cerebro.addstrategy(TestStrategy)

    pf_bank = pd.read_csv('sh600000.csv', index_col=0, parse_dates=True)  # 导入数据
    pf_bank['date'] = pd.to_datetime(pf_bank.date)  # 将str格式转为date格式
    pf_bank = pf_bank.sort_values(by='date')
    pf_bank = pf_bank.reset_index(drop=True)
    # 所以必须先print(pf_bank.info()),查询date因子的格式情况,然后进行转换
    pf_bank.index = pd.to_datetime(pf_bank.date)  # 变为索引

    pf_bank['openinterest'] = 0
    pf_bank = pf_bank[['open', 'high', 'low', 'close', 'volume', 'openinterest']]
    print(pf_bank)
    # openinterest:持仓量(Open Interest)
    start = datetime(2018, 3, 31)
    end = datetime(2019, 3, 31)
    # 加载数据
    data = bt.feeds.PandasData(dataname=pf_bank, fromdate=start, todate=end)
    # 加载交易数据
    cerebro.adddata(data)


    # 设置投资金额1000.0
    cerebro.broker.setcash(1000.0)

    # 每笔交易使用固定交易量
    cerebro.addsizer(bt.sizers.FixedSize, stake=10)
    # 设置佣金为0.0
    cerebro.broker.setcommission(commission=0.0)

    # 引擎运行前打印期出资金
    print('组合期初资金: %.2f' % cerebro.broker.getvalue())
    cerebro.run()
    # 引擎运行后打期末资金
    print('组合期末资金: %.2f' % cerebro.broker.getvalue())

run_result:

Starting Portfolio Value: 1000.00
Final Portfolio Value: 1000.00


matters needing attention

  • openinterest处理均为0,而且需要自己进行添加
  • 由于没有加载策略,所以即便初始化了交易账户资金以及加载数据,仍然没有任何变化
  • 我们要理解一点的是,一般而言的量化回测都是通过矢量化的方式去生成:

一般而言,我们的处理是先生成信号,持仓位置以及空仓位置,再加载账户进行处理。

  • backtrader是通过只是反复比较前后三个bar【条】数据来判断,近似于实盘交易,因此在交易和持仓过程中的止盈止损才更好设置。

backtrader是根据数据不断传输中,产生买入-持仓-卖出-空仓的过程。

  • 只有理解了市面上的一般性回测与backtrader回测的不同,才能继续深入理解和学习。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表