量化交易回测Backtrader3读取股票数据

使用 Backtrader 框架创建一个简单的量化交易回测环境。首先,它导入了必要的模块和 Backtrader 库,创建了 Cerebro 对象作为回测的核心管理单元。接着,通过 os.path 和 sys.argv 定位到股票数据文件(000001.csv),并使用 GenericCSVData 类从该文件中读取指定时间范围(2019 年 10 月 1 日至 2020 年 2 月 29 日)的股票价格数据。然后,将初始资金设置为 10 万,并打印出初始的投资组合价值。最后,运行回测流程,由于没有添加具体的交易策略,所以不会进行实际的交易操作,回测结束后打印出最终的投资组合价值,理论上初始和最终价值应该相同。

(1)Backtrader程序代码

# -*- coding: utf-8 -*-
"""
Created on Fri Feb 21 16:16:01 2025
(1)创建一个简单的 Backtrader 回测环境。首先导入必要的模块和 Backtrader 库,
然后创建 Cerebro 对象作为回测的核心管理单元。接着打印出初始的投资组合价值,
之后运行回测流程,但由于代码中未添加具体的交易策略和数据,
这个回测流程实际上没有进行任何有意义的交易操作。
最后打印出回测结束后的投资组合价值,由于没有实际交易,
所以初始和最终价值应该是相同的。
(2)设置代理的资金量为10万。
(3)添加股票数据
@author: Administrator
"""

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)
import datetime  # 用于datetime对象操作
import os.path  # 用于管理路径
import sys  # 用于在argvTo[0]中找到脚本名称
import backtrader as bt # 引入backtrader框架

# 创建cerebro实体
cerebro = bt.Cerebro()
# 先找到脚本的位置,然后根据脚本与数据的相对路径关系找到数据位置
# 这样脚本从任意地方被调用,都可以正确地访问到数据
modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
datapath = os.path.join(modpath, '../../TQDat/day/stk/000001.csv')
# 创建价格数据
data = bt.feeds.GenericCSVData(
        dataname = datapath,
        fromdate = datetime.datetime(2019, 10, 1),
        todate = datetime.datetime(2020, 2, 29),
        nullvalue = 0.0,
        dtformat = ('%Y-%m-%d'),
        datetime = 0,
        open = 1,
        high = 2,
        low = 3,
        close = 4,
        volume = 5,
        openinterest = -1
        )
# 在Cerebro中添加价格数据
cerebro.adddata(data)
# 设置启动资金
cerebro.broker.setcash(100000.0)
# 打印开始信息
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
# 遍历所有数据
cerebro.run()
# 打印最后结果
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

(2)Backtrader程序代码输出结果

runfile('D:/zwPython/zwrk/1_Quant_TensorFlow/B-3.py', wdir='D:/zwPython/zwrk/1_Quant_TensorFlow')
Starting Portfolio Value: 100000.00
Final Portfolio Value: 100000.00

(3)程序代码注释

# -*- coding: utf-8 -*-
"""
Created on Fri Feb 21 16:16:01 2025
(1)创建一个简单的 Backtrader 回测环境。首先导入必要的模块和 Backtrader 库,
然后创建 Cerebro 对象作为回测的核心管理单元。接着打印出初始的投资组合价值,
之后运行回测流程,但由于代码中未添加具体的交易策略和数据,
这个回测流程实际上没有进行任何有意义的交易操作。
最后打印出回测结束后的投资组合价值,由于没有实际交易,
所以初始和最终价值应该是相同的。
(2)设置代理的资金量为10万。
(3)添加股票数据
@author: Administrator
"""

# 从 __future__ 模块导入绝对导入、除法、打印函数和 Unicode 字面量支持
# 这些导入确保代码在不同 Python 版本中具有一致的行为
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)
# 导入 datetime 模块,用于处理日期和时间相关的操作,如指定数据的时间范围
import datetime  
# 导入 os.path 模块,用于管理文件和目录路径,方便找到数据文件
import os.path  
# 导入 sys 模块,用于获取命令行参数和系统相关信息,这里用于找到脚本名称
import sys  
# 引入 backtrader 框架,用于进行量化交易的回测
import backtrader as bt 

# 创建 cerebro 实体,Cerebro 是 Backtrader 的核心管理单元,负责管理回测的各个方面
cerebro = bt.Cerebro()

# 先找到脚本的位置,os.path.abspath(sys.argv[0]) 获取脚本的绝对路径
# os.path.dirname 提取该路径的目录部分
modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
# 根据脚本所在目录和相对路径关系,构建数据文件的完整路径
datapath = os.path.join(modpath, '../../TQDat/day/stk/000001.csv')

# 创建价格数据对象,使用 GenericCSVData 类从 CSV 文件中读取数据
data = bt.feeds.GenericCSVData(
        # 数据文件的路径
        dataname = datapath,
        # 数据的起始日期
        fromdate = datetime.datetime(2019, 10, 1),
        # 数据的结束日期
        todate = datetime.datetime(2020, 2, 29),
        # 当数据中存在缺失值时,用 0.0 填充
        nullvalue = 0.0,
        # 日期的格式
        dtformat = ('%Y-%m-%d'),
        # 日期列在 CSV 文件中的索引
        datetime = 0,
        # 开盘价列在 CSV 文件中的索引
        open = 1,
        # 最高价列在 CSV 文件中的索引
        high = 2,
        # 最低价列在 CSV 文件中的索引
        low = 3,
        # 收盘价列在 CSV 文件中的索引
        close = 4,
        # 成交量列在 CSV 文件中的索引
        volume = 5,
        # 持仓量列在 CSV 文件中的索引,-1 表示没有该列
        openinterest = -1
        )

# 在 Cerebro 中添加价格数据,以便回测时使用
cerebro.adddata(data)

# 设置启动资金,将经纪人(代理)的初始资金设置为 10 万
cerebro.broker.setcash(100000.0)

# 打印开始信息,显示初始的投资组合价值
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())

# 运行回测流程,由于没有添加具体的交易策略,所以不会进行实际的交易操作
cerebro.run()

# 打印最后结果,显示回测结束后的投资组合价值
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/913380
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 3分钟前
下一篇 2分钟前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注