File size: 7,670 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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
"""
All supported futures contracts β€” covers every symbol available via akshare (86 total).
Organized by exchange and category.
"""

from dataclasses import dataclass


@dataclass
class ContractInfo:
    symbol: str        # akshare query name
    exchange: str      # exchange code
    category: str      # category key
    name_cn: str       # display name


EXCHANGES = {
    "CFFEX": "δΈ­ε›½ι‡‘θžζœŸθ΄§δΊ€ζ˜“ζ‰€",
    "SHFE": "δΈŠζ΅·ζœŸθ΄§δΊ€ζ˜“ζ‰€",
    "INE": "δΈŠζ΅·ε›½ι™…θƒ½ζΊδΊ€ζ˜“δΈ­εΏƒ",
    "DCE": "ε€§θΏžε•†ε“δΊ€ζ˜“ζ‰€",
    "CZCE": "ιƒ‘ε·žε•†ε“δΊ€ζ˜“ζ‰€",
    "GFEX": "εΉΏε·žζœŸθ΄§δΊ€ζ˜“ζ‰€",
}

CATEGORIES = {
    "financial": "ι‡‘θžζœŸθ΄§",
    "precious_metal": "θ΄΅ι‡‘ε±ž",
    "base_metal": "ζœ‰θ‰²ι‡‘ε±ž",
    "ferrous": "黑色系",
    "energy": "θƒ½ζΊεŒ–ε·₯",
    "agriculture": "ε†œδΊ§ε“",
    "shipping": "θˆͺθΏζŒ‡ζ•°",
}

CONTRACTS: list[ContractInfo] = [
    # ── ι‡‘θžζœŸθ΄§ (CFFEX) ─────────────────────────────────
    ContractInfo("ζ²ͺζ·±300ζŒ‡ζ•°ζœŸθ΄§", "CFFEX", "financial", "ζ²ͺζ·±300"),
    ContractInfo("上证50ζŒ‡ζ•°ζœŸθ΄§", "CFFEX", "financial", "上证50"),
    ContractInfo("中证500ζŒ‡ζ•°ζœŸθ΄§", "CFFEX", "financial", "中证500"),
    ContractInfo("中证1000θ‚‘ζŒ‡ζœŸθ΄§", "CFFEX", "financial", "中证1000"),
    ContractInfo("2εΉ΄ζœŸε›½ε€ΊζœŸθ΄§", "CFFEX", "financial", "2εΉ΄ε›½ε€Ί"),
    ContractInfo("5εΉ΄ζœŸε›½ε€ΊζœŸθ΄§", "CFFEX", "financial", "5εΉ΄ε›½ε€Ί"),
    ContractInfo("10εΉ΄ζœŸε›½ε€ΊζœŸθ΄§", "CFFEX", "financial", "10εΉ΄ε›½ε€Ί"),

    # ── θ΄΅ι‡‘ε±ž (SHFE / GFEX) ────────────────────────────
    ContractInfo("黄金", "SHFE", "precious_metal", "黄金"),
    ContractInfo("η™½ι“Ά", "SHFE", "precious_metal", "η™½ι“Ά"),
    ContractInfo("ι“‚", "GFEX", "precious_metal", "ι“‚"),
    ContractInfo("ι’―", "GFEX", "precious_metal", "ι’―"),

    # ── ζœ‰θ‰²ι‡‘ε±ž (SHFE) ──────────────────────────────────
    ContractInfo("ζ²ͺι“œ", "SHFE", "base_metal", "ζ²ͺι“œ"),
    ContractInfo("ζ²ͺ铝", "SHFE", "base_metal", "ζ²ͺ铝"),
    ContractInfo("ζ²ͺι”Œ", "SHFE", "base_metal", "ζ²ͺι”Œ"),
    ContractInfo("ζ²ͺι“…", "SHFE", "base_metal", "ζ²ͺι“…"),
    ContractInfo("ζ²ͺ镍", "SHFE", "base_metal", "ζ²ͺ镍"),
    ContractInfo("ζ²ͺι”‘", "SHFE", "base_metal", "ζ²ͺι”‘"),
    ContractInfo("δΈι”ˆι’’", "SHFE", "base_metal", "δΈι”ˆι’’"),
    ContractInfo("ε›½ι™…ι“œ", "SHFE", "base_metal", "ε›½ι™…ι“œ"),
    ContractInfo("ζ°§εŒ–ι“", "SHFE", "base_metal", "ζ°§εŒ–ι“"),
    ContractInfo("ι“Έι€ ι“εˆι‡‘ζœŸθ΄§", "SHFE", "base_metal", "ι“Έι€ ι“εˆι‡‘"),
    ContractInfo("ε·₯δΈšη‘…", "GFEX", "base_metal", "ε·₯δΈšη‘…"),
    ContractInfo("η’³ι…Έι”‚", "GFEX", "base_metal", "η’³ι…Έι”‚"),
    ContractInfo("ε€šζ™Άη‘…", "GFEX", "base_metal", "ε€šζ™Άη‘…"),

    # ── 黑色系 (SHFE / DCE / CZCE) ──────────────────────
    ContractInfo("θžΊηΊΉι’’", "SHFE", "ferrous", "θžΊηΊΉι’’"),
    ContractInfo("热轧卷板", "SHFE", "ferrous", "热卷"),
    ContractInfo("线材", "SHFE", "ferrous", "线材"),
    ContractInfo("ι“ηŸΏηŸ³", "DCE", "ferrous", "ι“ηŸΏηŸ³"),
    ContractInfo("焦煀", "DCE", "ferrous", "焦煀"),
    ContractInfo("焦炭", "DCE", "ferrous", "焦炭"),
    ContractInfo("ι”°η‘…", "CZCE", "ferrous", "ι”°η‘…"),
    ContractInfo("瑅铁", "CZCE", "ferrous", "瑅铁"),
    ContractInfo("εŠ¨εŠ›η…€", "CZCE", "ferrous", "εŠ¨εŠ›η…€"),

    # ── θƒ½ζΊεŒ–ε·₯ (SHFE / INE / DCE / CZCE) ──────────────
    ContractInfo("原油", "INE", "energy", "原油"),
    ContractInfo("燃油", "SHFE", "energy", "燃油"),
    ContractInfo("ζ²₯青", "SHFE", "energy", "ζ²₯青"),
    ContractInfo("ζ©‘θƒΆ", "SHFE", "energy", "ζ©‘θƒΆ"),
    ContractInfo("20号胢", "SHFE", "energy", "20号胢"),
    ContractInfo("δΈδΊŒηƒ―ζ©‘θƒΆ", "SHFE", "energy", "δΈδΊŒηƒ―ζ©‘θƒΆ"),
    ContractInfo("纸框", "SHFE", "energy", "纸框"),
    ContractInfo("θƒΆη‰ˆε°εˆ·ηΊΈζœŸθ΄§", "SHFE", "energy", "θƒΆη‰ˆε°εˆ·ηΊΈ"),
    ContractInfo("δ½Žη‘«η‡ƒζ–™ζ²Ή", "SHFE", "energy", "δ½Žη‘«η‡ƒζ²Ή"),
    ContractInfo("PTA", "CZCE", "energy", "PTA"),
    ContractInfo("郑醇", "CZCE", "energy", "甲醇"),
    ContractInfo("δΉ™δΊŒι†‡", "DCE", "energy", "δΉ™δΊŒι†‡"),
    ContractInfo("ε°Ώη΄ ", "CZCE", "energy", "ε°Ώη΄ "),
    ContractInfo("ηΊ―η’±", "CZCE", "energy", "ηΊ―η’±"),
    ContractInfo("ηŽ»η’ƒ", "CZCE", "energy", "ηŽ»η’ƒ"),
    ContractInfo("ε‘‘ζ–™", "DCE", "energy", "ε‘‘ζ–™(LLDPE)"),
    ContractInfo("PP", "DCE", "energy", "θšδΈ™ηƒ―(PP)"),
    ContractInfo("PVC", "DCE", "energy", "θšζ°―δΉ™ηƒ―(PVC)"),
    ContractInfo("θ‹―δΉ™ηƒ―", "DCE", "energy", "θ‹―δΉ™ηƒ―"),
    ContractInfo("短纀", "CZCE", "energy", "短纀"),
    ContractInfo("ζΆ²εŒ–ηŸ³ζ²Ήζ°”", "DCE", "energy", "ζΆ²εŒ–ζ°”(LPG)"),
    ContractInfo("ηΊ―θ‹―", "DCE", "energy", "ηΊ―θ‹―"),
    ContractInfo("烧璱", "CZCE", "energy", "烧璱"),
    ContractInfo("δΊŒη”²θ‹―", "CZCE", "energy", "δΊŒη”²θ‹―(PX)"),
    ContractInfo("η“ΆηΊ§θšι…―εˆ‡η‰‡", "CZCE", "energy", "瓢片(PET)"),
    ContractInfo("δΈ™ηƒ―", "CZCE", "energy", "δΈ™ηƒ―"),

    # ── ε†œδΊ§ε“ (DCE / CZCE) ──────────────────────────────
    ContractInfo("豆一", "DCE", "agriculture", "豆一"),
    ContractInfo("θ±†δΊŒ", "DCE", "agriculture", "θ±†δΊŒ"),
    ContractInfo("豆粕", "DCE", "agriculture", "豆粕"),
    ContractInfo("豆油", "DCE", "agriculture", "豆油"),
    ContractInfo("ζ£•ζ¦ˆ", "DCE", "agriculture", "ζ£•ζ¦ˆζ²Ή"),
    ContractInfo("菜油", "CZCE", "agriculture", "菜籽油"),
    ContractInfo("菜籽", "CZCE", "agriculture", "菜籽"),
    ContractInfo("θœη²•", "CZCE", "agriculture", "θœη²•"),
    ContractInfo("θŠ±η”Ÿ", "CZCE", "agriculture", "θŠ±η”Ÿ"),
    ContractInfo("ζ£‰θŠ±", "CZCE", "agriculture", "ζ£‰θŠ±"),
    ContractInfo("棉纱", "CZCE", "agriculture", "棉纱"),
    ContractInfo("η™½η³–", "CZCE", "agriculture", "η™½η³–"),
    ContractInfo("ι²œθ‹Ήζžœ", "CZCE", "agriculture", "θ‹Ήζžœ"),
    ContractInfo("纒枣", "CZCE", "agriculture", "纒枣"),
    ContractInfo("ηŽ‰η±³", "DCE", "agriculture", "ηŽ‰η±³"),
    ContractInfo("ηŽ‰η±³ζ·€η²‰", "DCE", "agriculture", "ηŽ‰η±³ζ·€η²‰"),
    ContractInfo("ιΈ‘θ›‹", "DCE", "agriculture", "ιΈ‘θ›‹"),
    ContractInfo("η”ŸηŒͺ", "DCE", "agriculture", "η”ŸηŒͺ"),
    ContractInfo("η²³η±³", "DCE", "agriculture", "η²³η±³"),
    ContractInfo("粳稻", "CZCE", "agriculture", "粳稻"),
    ContractInfo("εΌΊιΊ¦", "CZCE", "agriculture", "εΌΊιΊ¦"),
    ContractInfo("早籼稻", "CZCE", "agriculture", "早籼稻"),
    ContractInfo("ζ™šη±Όη¨»", "CZCE", "agriculture", "ζ™šη±Όη¨»"),
    ContractInfo("纀维板", "DCE", "agriculture", "纀维板"),
    ContractInfo("θƒΆεˆζΏ", "DCE", "agriculture", "θƒΆεˆζΏ"),
    ContractInfo("原木", "DCE", "agriculture", "原木"),

    # ── θˆͺθΏζŒ‡ζ•° (SHFE) ─────────────────────────────────
    ContractInfo("ι›†θΏζŒ‡ζ•°(欧线)期货", "SHFE", "shipping", "ι›†θΏζŒ‡ζ•°(欧线)"),
]

SYMBOL_LOOKUP: dict[str, ContractInfo] = {c.symbol: c for c in CONTRACTS}


def get_contracts_by_category(category: str | None = None) -> list[ContractInfo]:
    if category is None:
        return CONTRACTS
    return [c for c in CONTRACTS if c.category == category]


def get_contracts_by_exchange(exchange: str | None = None) -> list[ContractInfo]:
    if exchange is None:
        return CONTRACTS
    return [c for c in CONTRACTS if c.exchange == exchange]