-
Notifications
You must be signed in to change notification settings - Fork 6.3k
backtest #855
Copy link
Copy link
Closed
Labels
Description
❓ 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}!")
请问这是什么原因导致的呢?
Reactions are currently unavailable