backtrader 如何使用分析器访问数据?

如何解决backtrader 如何使用分析器访问数据?

我对此很陌生。 backtrader有一个addwriter可以写一些数据,
cerebro.addwriter(bt.WriterFile,csv=True,out='outputfiles3\{}cerebro.csv'.format(ticker)) 但买入和卖出价格总是与执行价格不匹配。

或者:

我在cerebro.addanalyzer(WritingAnalyzer)之前做了cerebro.run()

所以我试图用“日期时间”、“打开”、“关闭”、“现金”、“价值”、“仓位大小”来构建 csv 文件 但我不知道如何访问这些数据。我只能用 self.data[0]

指向当天的收盘价

我不知道怎么做才对。我希望有人能给我一些指导。

import backtrader as bt
from backtrader import Analyzer
import csv

class WritingAnalyzer(Analyzer):

    def __init__(self):

    def create_analysis(self):
        self.counter = 0
        print(self.counter)
        with open('demo1.csv',mode='w') as csv_file:
            fieldnames=['datetime','open','close','cash','value','position size']
            writer = csv.DictWriter(csv_file,fieldnames=fieldnames)
            writer.writeheader()

    def next(self):
        self.counter += 1
        print('close price:',self.data[0],"counter:",self.counter,)
        #  the following line suppose to write into csv file but i dont know how to get most of the data.
        bt.writer.writerow({'datetime': '??','open': '??','close': self.data[0],'cash':'??','value':'??','position size':'??'})

    def stop(self):
        print("SSSSSSSSSSSSSTTTTTTOOOOOOOOOOOOPPPPPPPPPP")

        self.rets._close()

解决方法

您需要以不同的方式处理分析器。您可以从字面上获取每个酒吧的数据,然后在最后提供给您。

创建一个新的分析器,在我的例子中我做了:

class BarAnalysis(bt.analyzers.Analyzer):

在开始时的分析器中,您将创建一个新列表。

def start(self):
    self.rets = list()

接下来,您将为每个条形添加数据列表。我使用 try 语句以防万一有任何数据问题,但这可能没有必要。 Strategy 作为子类包含在内,您可以通过调用 self.strategy.getvalue() 作为示例来使用其方法。

def next(self):
    try:
        self.rets.append(
            [
                self.datas[0].datetime.datetime(),self.datas[0].open[0],self.datas[0].high[0],self.datas[0].low[0],self.datas[0].close[0],self.datas[0].volume[0],self.strategy.getposition().size,self.strategy.broker.getvalue(),self.strategy.broker.getcash(),]
        )
    except:
        pass

最后创建一个 get_analysis 方法,您可以使用该方法在最后获得结果。

def get_analysis(self):
    return self.rets

在运行 cerebro 之前将您的分析器添加到。您可以随意命名,我们需要名称来调用结果。

cerebro.addanalyzer(BarAnalysis,_name="bar_data")

确保为 cerebro.run() 方法的结果提供一个变量,以便您可以收集回测的结果。

strat = cerebro.run()

最后,从strat中取出数据,并随心所欲地使用它。在这种情况下,我正在创建一个数据框并打印。

bar_data_res = strat[0].analyzers.bar_data.get_analysis()
df = pd.DataFrame(bar_data_res)
print(df)

打印输出如下:

/home/runout/projects/rb_master/venv/bin/python /home/runout/projects/scratch/20210424_analyzer.py
                             0       1       2  ...  6         7         8
0   2020-01-02 23:59:59.999989  212.70  213.36  ...  0  10000.00  10000.00
1   2020-01-03 23:59:59.999989  210.81  213.28  ...  0  10000.00  10000.00
2   2020-01-06 23:59:59.999989  210.18  213.59  ...  0  10000.00  10000.00
3   2020-01-07 23:59:59.999989  213.11  214.13  ...  0  10000.00  10000.00
4   2020-01-08 23:59:59.999989  212.43  216.47  ...  0  10000.00  10000.00
..                         ...     ...     ...  ... ..       ...       ...
247 2020-12-23 23:59:59.999989  268.38  269.31  ...  1  10015.38   9747.25
248 2020-12-24 23:59:59.999989  267.76  269.67  ...  1  10016.48   9747.25
249 2020-12-28 23:59:59.999989  270.48  270.55  ...  1  10014.82   9747.25
250 2020-12-29 23:59:59.999989  268.30  268.78  ...  1  10011.78   9747.25
251 2020-12-30 23:59:59.999989  264.45  265.64  ...  1  10010.86   9747.25

[252 rows x 9 columns]

Process finished with exit code 0

整个代码如下:

import datetime
import backtrader as bt
import pandas as pd

class BarAnalysis(bt.analyzers.Analyzer):

    def start(self):
        self.rets = list()

    def next(self):
        try:
            self.rets.append(
                [
                    self.datas[0].datetime.datetime(),]
            )
        except:
            pass

    def get_analysis(self):
        return self.rets


class Strategy(bt.Strategy):

    params = (
        ("lowerband",30),("upperband",70),)

    def __init__(self):
        self.rsi = bt.ind.RSI(period=10)

    def next(self):
        if not self.position:
            if self.rsi <= self.p.lowerband:
                self.buy()
        elif self.rsi >= self.p.upperband:
            self.close()

if __name__ == "__main__":

    cerebro = bt.Cerebro()

    ticker = "HD"
    data = bt.feeds.YahooFinanceData(
        dataname=ticker,timeframe=bt.TimeFrame.Days,fromdate=datetime.datetime(2020,1,1),todate=datetime.datetime(2020,12,31),reverse=False,)

    cerebro.adddata(data,name=ticker)

    cerebro.addanalyzer(BarAnalysis,_name="bar_data")
    cerebro.addstrategy(Strategy)

    # Execute
    strat = cerebro.run()

    bar_data_res = strat[0].analyzers.bar_data.get_analysis()
    df = pd.DataFrame(bar_data_res)
    print(df)


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res