Skip to content

backtest #855

@aiot-tech

Description

@aiot-tech

❓ Questions and Help

We sincerely suggest you to carefully read the documentation of our library as well as the official paper. After that, if you still feel puzzled, please describe the question clearly under this issue.
你好,当我运行以下代码时,

from pprint import pprint

import qlib
import pandas as pd
from qlib.utils.time import Freq
from qlib.utils import flatten_dict
from qlib.backtest import backtest, executor
from qlib.contrib.evaluate import risk_analysis
from qlib.contrib.strategy import TopkDropoutStrategy


if __name__ == "__main__":
    qlib.init(provider_uri=r"qlib_cn_data")
    df = pd.read_csv(r"backtest_result.csv")
    df["datetime"] = pd.to_datetime(df["datetime"])
    df = df.set_index(["datetime", "instrument"])
    pred_score = df["score"]
    CSI300_BENCH = "SH000300"
    FREQ = "day"
    STRATEGY_CONFIG = {
        "topk": 50,
        "n_drop": 5,
        "signal": pred_score,
    }

    EXECUTOR_CONFIG = {
        "time_per_step": "day",
        "generate_portfolio_metrics": True,
        "verbose": True,
    }

    backtest_config = {
        "start_time": "2021-06-15",
        "end_time": "2021-12-10",
        "account": 100000000,
        "benchmark": CSI300_BENCH,
        "exchange_kwargs": {
            "freq": FREQ,
            "limit_threshold": 0.095,
            "deal_price": "close",
            "open_cost": 0.0005,
            "close_cost": 0.0015,
            "min_cost": 5,
        },
    }

    strategy_obj = TopkDropoutStrategy(**STRATEGY_CONFIG)
    executor_obj = executor.SimulatorExecutor(**EXECUTOR_CONFIG)

    portfolio_metric_dict, indicator_dict = backtest(executor=executor_obj, strategy=strategy_obj, **backtest_config)
    analysis_freq = "{0}{1}".format(*Freq.parse(FREQ))

    report_normal, positions_normal = portfolio_metric_dict.get(analysis_freq)
    analysis = dict()
    analysis["excess_return_without_cost"] = risk_analysis(
        report_normal["return"] - report_normal["bench"], freq=analysis_freq
    )
    analysis["excess_return_with_cost"] = risk_analysis(
        report_normal["return"] - report_normal["bench"] - report_normal["cost"], freq=analysis_freq
    )

    analysis_df = pd.concat(analysis)  # type: pd.DataFrame
    # log metrics
    analysis_dict = flatten_dict(analysis_df["risk"].unstack().T.to_dict())
    # print out results
    pprint(f"The following are analysis results of benchmark return({analysis_freq}).")
    pprint(risk_analysis(report_normal["bench"], freq=analysis_freq))
    pprint(f"The following are analysis results of the excess return without cost({analysis_freq}).")
    pprint(analysis["excess_return_without_cost"])
    pprint(f"The following are analysis results of the excess return with cost({analysis_freq}).")
    pprint(analysis["excess_return_with_cost"])

出现以下的报错:

[76700:MainThread](2022-01-17 18:51:32,751) INFO - qlib.Initialization - [config.py:403] - default_conf: client.
[76700:MainThread](2022-01-17 18:51:34,792) WARNING - qlib.Initialization - [config.py:428] - redis connection failed(host=127.0.0.1 port=6379), DiskExpressionCache and DiskDatasetCache will not be used!
[76700:MainThread](2022-01-17 18:51:34,793) WARNING - qlib.Initialization - [__init__.py:64] - auto_path is False, please make sure None is mounted
[76700:MainThread](2022-01-17 18:51:36,389) INFO - qlib.Initialization - [__init__.py:74] - qlib successfully initialized based on client settings.
[76700:MainThread](2022-01-17 18:51:36,389) INFO - qlib.Initialization - [__init__.py:76] - data_path={'__DEFAULT_FREQ': WindowsPath('qlib_backtest')}
[76700:MainThread](2022-01-17 18:51:36,893) WARNING - qlib.data - [data.py:613] - load calendar error: freq=day, future=True; return current calendar!
[76700:MainThread](2022-01-17 18:51:36,893) WARNING - qlib.data - [data.py:616] - You can get future calendar by referring to the following document: https://github.com/microsoft/qlib/blob/main/scripts/data_collector/contrib/README.md
[76700:MainThread](2022-01-17 18:51:36,894) ERROR - qlib.workflow - [utils.py:38] - An exception has been raised[ValueError: can't find a freq from [] that can resample to day!].
ValueError: can't find a freq from [] that can resample to day!
  File "qlib_backtest.py", line 51, in <module>
    executor_obj = executor.SimulatorExecutor(**EXECUTOR_CONFIG)
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\backtest\executor.py", line 497, in __init__
    super(SimulatorExecutor, self).__init__(
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\backtest\executor.py", line 113, in __init__
    self.reset(start_time=start_time, end_time=end_time, common_infra=common_infra)
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\backtest\executor.py", line 164, in reset
    self.level_infra.reset_cal(freq=self.time_per_step, start_time=start_time, end_time=end_time)
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\backtest\utils.py", line 239, in reset_cal
    trade_calendar=TradeCalendarManager(freq, start_time=start_time, end_time=end_time, level_infra=self)
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\backtest\utils.py", line 44, in __init__
    self.reset(freq=freq, start_time=start_time, end_time=end_time)
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\backtest\utils.py", line 58, in reset
    _calendar = Cal.calendar(freq=freq, future=True)
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\data\data.py", line 90, in calendar
    _calendar, _calendar_index = self._get_calendar(freq, future)
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\data\data.py", line 171, in _get_calendar
    _calendar = np.array(self.load_calendar(freq, future))
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\data\data.py", line 619, in load_calendar
    backend_obj = self.backend_obj(freq=freq, future=False).data
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\data\storage\file_storage.py", line 123, in data
    self.check()
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\data\storage\file_storage.py", line 72, in check
    if not self.uri.exists():
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\data\storage\file_storage.py", line 119, in uri
    return self.dpm.get_data_uri(self._freq_file).joinpath(f"{self.storage_name}s", self.file_name)
  File "D:\ProgramData\Miniconda3\lib\site-packages\qlib\data\storage\file_storage.py", line 100, in _freq_file
    raise ValueError(f"can't find a freq from {self.support_freq} that can resample to {self.freq}!")

请问这是什么原因导致的呢?

Metadata

Metadata

Assignees

Labels

questionFurther information is requestedstale

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions