File size: 1,630 Bytes
590a501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
"""Initialize qlib and load project configuration."""

from __future__ import annotations

from pathlib import Path
from typing import Any

import yaml
import qlib
from qlib.constant import REG_CN, REG_US

PROJECT_ROOT = Path(__file__).resolve().parents[1]
DEFAULT_CONFIG = PROJECT_ROOT / "config" / "base.yaml"

_REGION_MAP = {
    "cn": REG_CN,
    "us": REG_US,
}


def load_config(config_path: str | Path | None = None) -> dict[str, Any]:
    path = Path(config_path) if config_path else DEFAULT_CONFIG
    with open(path, encoding="utf-8") as f:
        cfg = yaml.safe_load(f)

    provider_uri = cfg["qlib"]["provider_uri"]
    provider_path = Path(provider_uri)
    if not provider_path.is_absolute():
        provider_path = PROJECT_ROOT / provider_path
    cfg["qlib"]["provider_uri_resolved"] = str(provider_path)
    return cfg


def init_qlib(config_path: str | Path | None = None, exp_manager: dict | None = None) -> dict[str, Any]:
    """Initialize qlib with project config and return the loaded config dict."""
    cfg = load_config(config_path)
    region = _REGION_MAP.get(cfg["qlib"].get("region", "cn"), REG_CN)

    freq = cfg.get("data", {}).get("freq", "day")
    provider_uri = cfg["qlib"]["provider_uri_resolved"]
    # Non-day data (e.g. 30min) must be keyed by freq so qlib resolves the right calendar.
    if freq != "day":
        provider_uri = {freq: provider_uri}

    init_kwargs: dict[str, Any] = {
        "provider_uri": provider_uri,
        "region": region,
    }
    if exp_manager is not None:
        init_kwargs["exp_manager"] = exp_manager

    qlib.init(**init_kwargs)
    return cfg