返回介绍

开始一个简单的回测

发布于 2024-05-30 23:39:26 字数 5311 浏览 0 评论 0 收藏 0

在上面的描述中我们已经取得了标准的历史数据格式, 那么我们现在来实现一个标准的历史回测

from datetime import datetime
from ctpbee import get_current_trade_day, CtpBee
from ctpbee import CtpbeeApi
from ctpbee.constant import TickData, OrderData, Offset, Direction, TradeData, Status, ContractData, BarData
from ctpbee.message import Mail

import pandas as pd

CODE = "rb2105.SHFE"


class Str(CtpbeeApi):
    def __init__(self):
        super().__init__("api")
        self.instrument_set = [CODE]

    def on_bar(self, tick: BarData) -> None:
        print(tick.close_price)

    def on_init(self, init: bool):
        print("新的一天开始了")


def run_looper_app():
    info = {
        "PATTERN": "looper",
        "LOOPER": {
            "initial_capital": 10000,  # 初始资金 
            "deal_pattern": "price",  # 撮合模式 
            "margin_ratio": {
                CODE: 0.1,  # 保证金占用率 
            },
            "commission_ratio": {
                CODE: {
                    "close": 0.00003,  # 平昨手续费 <支持整数位手续费,比如三块 >
                    "close_today": 0.00003  # 平今手续费 
                },
            },
            "size_map": {
                CODE: 10  # 合约乘数 
            }
        }
    }
    app = CtpBee("looper", __name__)
    app.config.from_mapping(info)
    strategy = Str()
    data = pd.read_csv("rbdata.csv")  # 读取k线的csv
    data = list(data.to_dict(orient="index").values())
    for x in data:
        x["datetime"] = datetime.strptime(x["datetime"], "%Y-%m-%d %H:%M:%S")  # 转换时间为标准datetime格式
    app.add_data(data)  # 加载进去
    app.add_extension(strategy)
    app.start()
    result, trade = app.get_result(report=True, auto_open=True)
    print(result)


if __name__ == '__main__':
    run_looper_app()

csv下载地址 密码: 54en

载入数据

创建完App之后,我们便开始往容器里面添加数据,

app.add_data(data)

注意:

history数据应该是一个[{}, {}, {}]这样类型的python数据,你需要做一重转换处理, datetime数据它会自动进行转换, 当然仅针对特定格式

添加策略

我们需要在此处添加标准形式的策略实例 和ctpbeeCtpbeeApi示例类似, 用户都需要继承CtpbeeApi,提供了on_baron_tickon_trade等方法 他们的调用和实盘接口是无缝的

开始回测

与实盘一样都可以调用run接口即可完成

app.start()

获取回测结果

result, trade_record = app.get_result()

如果你什么参数都不添加的话, 那么它将返回一个dataframe和成交单信息, 但是有两个可选参数可供你使用

  • report, 是否生成HTML报告信息
  • auto_open, bool型参数,当这个参数为True的时候,会自动调用默认浏览器打开页面

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文