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
- Test connectivity/login in isolation: `python -c "import baostock as bs; print(bs.login().error_code)"` — if non-zero, fix network/egress first.
- Upgrade/reinstall the baostock package (pip install -U baostock) to rule out protocol drift.
- 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
- Pre-flight bs.login() in scripts that need baostock before starting long jobs.
- Run collection from networks with outbound access to baostock servers.
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
- query_trade_dates respond error_msg: {rs.error_msg}
- Unable to fetch instruments from remote server!
- response status: {_status}, url={url}
- request error
- request error
AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15).
Data as JSON: /api/errors/e3b85f0b6da239d0.
Report an issue: GitHub.