{"record":{"id":"10f253c82fe0b67e","repo":"microsoft/qlib","slug":"query-trade-dates-respond-error-msg-rs-error-msg","errorCode":null,"errorMessage":"query_trade_dates respond error_msg: {rs.error_msg}","messagePattern":"query_trade_dates respond error_msg: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"scripts/data_collector/future_calendar_collector.py","lineNumber":79,"sourceCode":"        \"\"\"\n\n        Returns\n        -------\n\n        \"\"\"\n        raise NotImplementedError(f\"Please implement the `collector` method\")\n\n\nclass CollectorFutureCalendarCN(CollectorFutureCalendar):\n    def collector(self) -> Iterable[pd.Timestamp]:\n        lg = bs.login()\n        if lg.error_code != \"0\":\n            raise ValueError(f\"login respond error_msg: {lg.error_msg}\")\n        rs = bs.query_trade_dates(\n            start_date=self._format_datetime(self.start_date), end_date=self._format_datetime(self.end_date)\n        )\n        if rs.error_code != \"0\":\n            raise ValueError(f\"query_trade_dates respond error_msg: {rs.error_msg}\")\n        data_list = []\n        while (rs.error_code == \"0\") & rs.next():\n            data_list.append(rs.get_row_data())\n        calendar = pd.DataFrame(data_list, columns=rs.fields)\n        calendar[\"is_trading_day\"] = calendar[\"is_trading_day\"].astype(int)\n        return pd.to_datetime(calendar[calendar[\"is_trading_day\"] == 1][\"calendar_date\"]).to_list()\n\n\nclass CollectorFutureCalendarUS(CollectorFutureCalendar):\n    def collector(self) -> Iterable[pd.Timestamp]:\n        # TODO: US future calendar\n        raise ValueError(\"Us calendar is not supported\")\n\n\ndef run(qlib_dir: Union[str, Path], region: str = \"cn\", start_date: str = None, end_date: str = None):\n    \"\"\"Collect future calendar(day)\n\n    Parameters","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/scripts/data_collector/future_calendar_collector.py#L61-L97","documentation":"Raised by CollectorFutureCalendarCN.collector (scripts/data_collector/future_calendar_collector.py:79) when bs.query_trade_dates(start_date, end_date) returns a non-'0' error_code after a successful bs.login(). It signals the baostock API rejected or failed the trade-date query itself, commonly due to malformed/upper-bound date ranges or server-side errors.","triggerScenarios":"Calling collector() where _format_datetime(self.start_date)/end_date produce dates baostock rejects — e.g. end_date beyond baostock's published calendar (the class defaults end_date to latest calendar date + 365*2 days), or a stale session. Any rs.error_code != '0' from query_trade_dates triggers it.","commonSituations":"Using the default end_date (calendar tail + 2 years) when baostock only publishes dates nearer term; date format mismatches from a custom start_date; long-running processes whose baostock session expired between login and query.","solutions":["Pass an explicit, modest --end_date within baostock's published range instead of relying on the +2-year default.","Confirm start_date/end_date are valid yyyy-MM-dd strings after _format_datetime.","Wrap the run in a retry that re-executes bs.login() before query_trade_dates (session expiry)."],"exampleFix":"# before\ncal = CollectorFutureCalendarCN(qlib_dir, start_date=None, end_date=None)  # end = last + 730d\n\n# after\ncal = CollectorFutureCalendarCN(qlib_dir, start_date='2026-01-01', end_date='2026-12-31')","handlingStrategy":"retry","validationCode":"import baostock as bs\nrs = bs.query_trade_dates(start_date=start, end_date=end)\nif rs.error_code != '0':\n    raise SystemExit(f'query_trade_dates failed: {rs.error_msg}')","typeGuard":null,"tryCatchPattern":"try:\n    dates = CollectorFutureCalendarCN(qd, start_date=s, end_date=e).collector()\nexcept ValueError as e:\n    if 'query_trade_dates' in str(e):\n        # narrow range or re-login then retry once\n        raise","preventionTips":["Pass explicit start/end dates within baostock's published calendar instead of the +2-year default.","Re-login (bs.login()) before each query batch in long-running scripts."],"tags":["baostock","query","date-range","cn-calendar"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}