microsoft/qlib · error · ValueError

login respond error_msg: {lg.error_msg}

Error message

login respond error_msg: {lg.error_msg}

What it means

Raised by CollectorFutureCalendarCN.collector (scripts/data_collector/future_calendar_collector.py:74) when baostock's bs.login() returns a non-'0' error_code. Baostock is the free CN market-data API used to fetch trade dates; login failures mean the session to the baostock service could not be established before query_trade_dates is attempted.

Source

Thrown at scripts/data_collector/future_calendar_collector.py:74

        calendars_list = [self._format_datetime(x) for x in sorted(set(self.calendar_list + calendar))]
        np.savetxt(self.future_path, calendars_list, fmt="%s", encoding="utf-8")

    @abc.abstractmethod
    def collector(self) -> Iterable[pd.Timestamp]:
        """

        Returns
        -------

        """
        raise NotImplementedError(f"Please implement the `collector` method")


class CollectorFutureCalendarCN(CollectorFutureCalendar):
    def collector(self) -> Iterable[pd.Timestamp]:
        lg = bs.login()
        if lg.error_code != "0":
            raise ValueError(f"login respond error_msg: {lg.error_msg}")
        rs = bs.query_trade_dates(
            start_date=self._format_datetime(self.start_date), end_date=self._format_datetime(self.end_date)
        )
        if rs.error_code != "0":
            raise ValueError(f"query_trade_dates respond error_msg: {rs.error_msg}")
        data_list = []
        while (rs.error_code == "0") & rs.next():
            data_list.append(rs.get_row_data())
        calendar = pd.DataFrame(data_list, columns=rs.fields)
        calendar["is_trading_day"] = calendar["is_trading_day"].astype(int)
        return pd.to_datetime(calendar[calendar["is_trading_day"] == 1]["calendar_date"]).to_list()


class CollectorFutureCalendarUS(CollectorFutureCalendar):
    def collector(self) -> Iterable[pd.Timestamp]:
        # TODO: US future calendar
        raise ValueError("Us calendar is not supported")

View on GitHub (pinned to 79633dd950)

Solutions

  1. Test connectivity/login in isolation: `python -c "import baostock as bs; print(bs.login().error_code)"` — if non-zero, fix network/egress first.
  2. Upgrade/reinstall the baostock package (pip install -U baostock) to rule out protocol drift.
  3. Retry the collection later if baostock is under maintenance (check baostock status pages/forums).

Example fix

# before
lg = bs.login()
if lg.error_code != '0':
    raise ValueError(f"login respond error_msg: {lg.error_msg}")

# after (caller-side guard with retry)
import baostock as bs, time
for attempt in range(3):
    lg = bs.login()
    if lg.error_code == '0':
        break
    time.sleep(5 * (attempt + 1))
else:
    raise RuntimeError(f"baostock login failed: {lg.error_msg}")
Defensive patterns

Strategy: retry

Validate before calling

import baostock as bs
lg = bs.login()
if lg.error_code != '0':
    raise SystemExit(f'baostock unreachable: {lg.error_msg}')

Try / catch

for attempt in range(3):
    try:
        calendar = collector.collector()
        break
    except ValueError as e:
        if 'login respond' in str(e) and attempt < 2:
            time.sleep(30); bs.logout(); continue
        raise

Prevention

When it happens

Trigger: Calling CollectorFutureCalendarCN(...).collector() when bs.login() fails: network outage/blocking of baostock servers, baostock service maintenance, or an incompatible/old baostock package version whose login handshake fails.

Common situations: Corporate networks or Docker containers without outbound access to baostock; baostock weekend maintenance windows; pip-installed baostock version drift after upgrading the environment.

Related errors


AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15). Data as JSON: /api/errors/e3b85f0b6da239d0. Report an issue: GitHub.