parent
bf49c39d98
commit
b06e29a95c
@ -0,0 +1,18 @@
|
||||
---
|
||||
name: AlphaFutures
|
||||
description: A brief description of what this skill does
|
||||
---
|
||||
|
||||
# AlphaFutures
|
||||
|
||||
Instructions for the agent to follow when this skill is activated.
|
||||
|
||||
## When to use
|
||||
|
||||
Describe when this skill should be used.
|
||||
|
||||
## Instructions
|
||||
|
||||
1. First step
|
||||
2. Second step
|
||||
3. Additional steps as needed
|
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,12 @@
|
||||
# API适配器包初始化文件
|
||||
from qihuo_analyzer.data.api_adapters.base_adapter import BaseDataAdapter
|
||||
from qihuo_analyzer.data.api_adapters.tqsdk_adapter import TqSdkAdapter
|
||||
from qihuo_analyzer.data.api_adapters.rqdata_adapter import RqDataAdapter
|
||||
from qihuo_analyzer.data.api_adapters.adapter_factory import DataAdapterFactory
|
||||
|
||||
__all__ = [
|
||||
'BaseDataAdapter',
|
||||
'TqSdkAdapter',
|
||||
'RqDataAdapter',
|
||||
'DataAdapterFactory'
|
||||
]
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,122 @@
|
||||
#!/usr/bin/env python3
|
||||
# 测试通过配置文件切换数据源
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# 确保能导入项目模块
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
# 从配置文件加载配置
|
||||
from config import (
|
||||
DATA_ADAPTER_TYPE,
|
||||
TQSDK_USERNAME,
|
||||
TQSDK_PASSWORD,
|
||||
RQDATA_USERNAME,
|
||||
RQDATA_PASSWORD,
|
||||
DEBUG
|
||||
)
|
||||
|
||||
# 设置环境变量
|
||||
def setup_environment():
|
||||
"""根据配置文件设置环境变量"""
|
||||
print("=== 设置环境变量 ===")
|
||||
|
||||
# 设置数据源类型
|
||||
os.environ["DATA_ADAPTER_TYPE"] = DATA_ADAPTER_TYPE
|
||||
print(f"数据源类型: {DATA_ADAPTER_TYPE}")
|
||||
|
||||
# 设置TQSDK账号
|
||||
if TQSDK_USERNAME:
|
||||
os.environ["TQSDK_USERNAME"] = TQSDK_USERNAME
|
||||
os.environ["TQSDK_PASSWORD"] = TQSDK_PASSWORD
|
||||
print("TQSDK账号: 已配置")
|
||||
else:
|
||||
print("TQSDK账号: 未配置(将使用模拟数据)")
|
||||
|
||||
# 设置RQData账号
|
||||
if RQDATA_USERNAME:
|
||||
os.environ["RQDATA_USERNAME"] = RQDATA_USERNAME
|
||||
os.environ["RQDATA_PASSWORD"] = RQDATA_PASSWORD
|
||||
print("RQData账号: 已配置")
|
||||
else:
|
||||
print("RQData账号: 未配置(将使用模拟数据)")
|
||||
|
||||
# 设置调试模式
|
||||
if DEBUG:
|
||||
os.environ["DEBUG"] = "True"
|
||||
print("调试模式: 开启")
|
||||
else:
|
||||
print("调试模式: 关闭")
|
||||
|
||||
print("环境变量设置完成!\n")
|
||||
|
||||
# 测试数据源连接
|
||||
def test_data_source():
|
||||
"""测试数据源连接和基本功能"""
|
||||
print("=== 测试数据源功能 ===")
|
||||
|
||||
try:
|
||||
from qihuo_analyzer.data.data_fetcher import DataFetcher
|
||||
|
||||
# 创建数据获取器实例
|
||||
print("创建DataFetcher实例...")
|
||||
fetcher = DataFetcher()
|
||||
|
||||
# 查看使用的适配器
|
||||
adapter_name = fetcher.adapter.__class__.__name__
|
||||
print(f"当前使用的适配器: {adapter_name}")
|
||||
|
||||
# 测试获取品种列表
|
||||
print("\n测试获取品种列表...")
|
||||
symbols = fetcher.get_all_symbols()
|
||||
if symbols:
|
||||
print(f"成功获取 {len(symbols)} 个品种")
|
||||
print("前10个品种:", symbols[:10])
|
||||
else:
|
||||
print("获取品种列表失败")
|
||||
|
||||
# 测试获取K线数据
|
||||
print("\n测试获取K线数据...")
|
||||
test_symbol = symbols[0] if symbols else "CU2603"
|
||||
kline_data = fetcher.get_kline_data(
|
||||
symbol=test_symbol,
|
||||
duration="1h", # 1小时
|
||||
count=50
|
||||
)
|
||||
|
||||
if kline_data is not None:
|
||||
print(f"成功获取 {len(kline_data)} 条K线数据")
|
||||
print("数据示例:")
|
||||
print(kline_data.head())
|
||||
else:
|
||||
print("获取K线数据失败")
|
||||
|
||||
print("\n=== 测试完成 ===")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"测试失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
# 主函数
|
||||
def main():
|
||||
"""主测试函数"""
|
||||
print("开始测试通过配置文件切换数据源...\n")
|
||||
|
||||
# 1. 设置环境变量
|
||||
setup_environment()
|
||||
|
||||
# 2. 测试数据源
|
||||
success = test_data_source()
|
||||
|
||||
if success:
|
||||
print("\n✓ 数据源切换测试成功!")
|
||||
print(f"✓ 当前使用的数据源类型: {DATA_ADAPTER_TYPE}")
|
||||
else:
|
||||
print("\n✗ 数据源切换测试失败!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@ -0,0 +1,123 @@
|
||||
#!/usr/bin/env python3
|
||||
# 测试枚举合约数据
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# 确保能导入项目模块
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from qihuo_analyzer.data.data_fetcher import DataFetcher
|
||||
|
||||
def test_enum_symbols():
|
||||
"""测试枚举合约数据"""
|
||||
print("=== 测试枚举合约数据 ===")
|
||||
|
||||
# 创建DataFetcher实例
|
||||
fetcher = DataFetcher()
|
||||
|
||||
# 测试获取所有品种列表
|
||||
print("\n1. 测试获取所有品种列表:")
|
||||
symbols = fetcher.get_all_symbols()
|
||||
print(f"成功获取 {len(symbols)} 个品种")
|
||||
print("所有品种:", symbols)
|
||||
|
||||
# 测试获取按交易所划分的品种列表
|
||||
print("\n2. 测试获取按交易所划分的品种列表:")
|
||||
symbols_by_exchange = fetcher.get_all_symbols_by_exchange()
|
||||
for exchange, products in symbols_by_exchange.items():
|
||||
print(f"\n交易所: {exchange}")
|
||||
print(f"品种数量: {len(products)}")
|
||||
for product, contracts in products.items():
|
||||
print(f" {product}: {contracts[:3]}... (共{len(contracts)}个合约)")
|
||||
|
||||
# 测试用户指定的品种是否都存在
|
||||
print("\n3. 测试用户指定的品种是否都存在:")
|
||||
specified_products = [
|
||||
"金", "银", "铜", "镍", "锡", "玻璃", "烧碱", "纯碱", "焦煤",
|
||||
"螺纹钢", "氧化铝", "甲醇", "PVC", "燃油", "原油", "铝", "棕榈油",
|
||||
"碳酸锂", "工业硅", "橡胶", "合成橡胶", "锌", "20号胶", "多晶硅",
|
||||
"中证1000", "中证500", "低硫燃油", "上证50"
|
||||
]
|
||||
|
||||
# 品种中文名称映射
|
||||
product_name_map = {
|
||||
'AU': '金',
|
||||
'AG': '银',
|
||||
'CU': '铜',
|
||||
'NI': '镍',
|
||||
'SN': '锡',
|
||||
'FG': '玻璃',
|
||||
'LY': '烧碱',
|
||||
'SA': '纯碱',
|
||||
'JM': '焦煤',
|
||||
'RB': '螺纹钢',
|
||||
'ALO': '氧化铝',
|
||||
'MA': '甲醇',
|
||||
'V': 'PVC',
|
||||
'FU': '燃油',
|
||||
'SC': '原油',
|
||||
'AL': '铝',
|
||||
'P': '棕榈油',
|
||||
'LI': '碳酸锂',
|
||||
'SI': '工业硅',
|
||||
'RU': '橡胶',
|
||||
'BR': '合成橡胶',
|
||||
'ZN': '锌',
|
||||
'NR': '20号胶',
|
||||
'SP': '多晶硅',
|
||||
'IM': '中证1000',
|
||||
'IC': '中证500',
|
||||
'LU': '低硫燃油',
|
||||
'IH': '上证50'
|
||||
}
|
||||
|
||||
# 检查每个指定的品种
|
||||
found_products = []
|
||||
missing_products = []
|
||||
|
||||
for product_code, product_name in product_name_map.items():
|
||||
# 检查是否在模拟品种列表中
|
||||
mock_symbols = fetcher._get_mock_all_symbols()
|
||||
product_found = any(symbol.startswith(product_code) for symbol in mock_symbols)
|
||||
|
||||
# 检查是否在按交易所划分的列表中
|
||||
exchange_found = False
|
||||
for exchange, products in symbols_by_exchange.items():
|
||||
if product_code in products:
|
||||
exchange_found = True
|
||||
break
|
||||
|
||||
if product_found or exchange_found:
|
||||
found_products.append(product_name)
|
||||
print(f"✓ 找到: {product_name} ({product_code})")
|
||||
else:
|
||||
missing_products.append(product_name)
|
||||
print(f"✗ 缺失: {product_name} ({product_code})")
|
||||
|
||||
print(f"\n4. 检查结果:")
|
||||
print(f"找到的品种: {len(found_products)}/{len(specified_products)}")
|
||||
print(f"缺失的品种: {len(missing_products)}/{len(specified_products)}")
|
||||
|
||||
if missing_products:
|
||||
print(f"缺失的品种: {missing_products}")
|
||||
else:
|
||||
print("✓ 所有用户指定的品种都已找到!")
|
||||
|
||||
# 测试获取K线数据
|
||||
print("\n5. 测试获取K线数据:")
|
||||
test_symbols = ['AU2603', 'AG2603', 'CU2603', 'NI2603', 'SI2603']
|
||||
for symbol in test_symbols:
|
||||
try:
|
||||
data = fetcher.get_kline_data(symbol, "1h", 10)
|
||||
if data is not None:
|
||||
print(f"✓ 成功获取 {symbol} 的K线数据 ({len(data)}条)")
|
||||
else:
|
||||
print(f"✗ 无法获取 {symbol} 的K线数据")
|
||||
except Exception as e:
|
||||
print(f"✗ 获取 {symbol} 数据失败: {e}")
|
||||
|
||||
print("\n=== 测试完成 ===")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_enum_symbols()
|
||||
@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env python3
|
||||
# 测试铁矿石合约代码修复
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# 确保能导入项目模块
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from qihuo_analyzer.data.api_adapters.tqsdk_adapter import TqSdkAdapter
|
||||
from qihuo_analyzer.data.data_fetcher import DataFetcher
|
||||
|
||||
def test_iron_ore_contract():
|
||||
"""测试铁矿石合约代码处理"""
|
||||
print("=== 测试铁矿石合约代码修复 ===")
|
||||
|
||||
# 测试TQSDK适配器的合约代码转换
|
||||
print("\n1. 测试TQSDK适配器合约代码转换:")
|
||||
adapter = TqSdkAdapter()
|
||||
|
||||
test_symbols = [
|
||||
"I2603", # 铁矿石
|
||||
"J2603", # 焦炭
|
||||
"JM2603", # 焦煤
|
||||
"CU2603", # 铜
|
||||
"AL2603", # 铝
|
||||
"AU2603", # 黄金
|
||||
"AG2603", # 白银
|
||||
"RB2603", # 螺纹钢
|
||||
"P2603", # 棕榈油
|
||||
"V2603", # PVC
|
||||
"MA2603", # 甲醇
|
||||
"FG2603", # 玻璃
|
||||
"SA2603", # 纯碱
|
||||
"LY2603", # 烧碱
|
||||
"LI2603", # 碳酸锂
|
||||
"SI2603", # 工业硅
|
||||
"SP2603", # 多晶硅
|
||||
"RU2603", # 橡胶
|
||||
"NR2603", # 20号胶
|
||||
"FU2603", # 燃油
|
||||
"SC2603", # 原油
|
||||
"LU2603", # 低硫燃油
|
||||
"ALO2603",# 氧化铝
|
||||
"BR2603", # 合成橡胶
|
||||
]
|
||||
|
||||
for symbol in test_symbols:
|
||||
try:
|
||||
tq_symbol = adapter._convert_symbol(symbol)
|
||||
print(f"✓ {symbol} → {tq_symbol}")
|
||||
except Exception as e:
|
||||
print(f"✗ {symbol} → 转换失败: {e}")
|
||||
|
||||
# 测试DataFetcher获取铁矿石数据
|
||||
print("\n2. 测试DataFetcher获取铁矿石数据:")
|
||||
fetcher = DataFetcher()
|
||||
|
||||
try:
|
||||
# 测试获取铁矿石K线数据
|
||||
print("测试获取 I2603 的K线数据...")
|
||||
kline_data = fetcher.get_kline_data("I2603", "1h", 10)
|
||||
if kline_data is not None:
|
||||
print(f"✓ 成功获取 {len(kline_data)} 条铁矿石K线数据")
|
||||
print("数据示例:")
|
||||
print(kline_data.head())
|
||||
else:
|
||||
print("✗ 无法获取铁矿石K线数据")
|
||||
except Exception as e:
|
||||
print(f"✗ 获取铁矿石数据失败: {e}")
|
||||
|
||||
# 测试其他单字符品种
|
||||
print("\n3. 测试其他单字符品种:")
|
||||
single_char_symbols = ["I2603", "J2603", "P2603", "C2603", "L2603"]
|
||||
|
||||
for symbol in single_char_symbols:
|
||||
try:
|
||||
print(f"测试获取 {symbol} 的K线数据...")
|
||||
kline_data = fetcher.get_kline_data(symbol, "1h", 5)
|
||||
if kline_data is not None:
|
||||
print(f"✓ 成功获取 {symbol} 的K线数据")
|
||||
else:
|
||||
print(f"✗ 无法获取 {symbol} 的K线数据")
|
||||
except Exception as e:
|
||||
print(f"✗ 获取 {symbol} 数据失败: {e}")
|
||||
|
||||
print("\n=== 测试完成 ===")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_iron_ore_contract()
|
||||
@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
# 测试TQSDK适配器的_get_mock_all_symbols方法
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# 确保能导入项目模块
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from qihuo_analyzer.data.api_adapters.tqsdk_adapter import TqSdkAdapter
|
||||
|
||||
def test_mock_all_symbols():
|
||||
"""测试_get_mock_all_symbols方法是否返回exchange_map中映射的所有品种"""
|
||||
print("=== 测试TQSDK适配器_get_mock_all_symbols方法 ===")
|
||||
|
||||
# 创建TQSDK适配器实例
|
||||
adapter = TqSdkAdapter()
|
||||
|
||||
# 获取模拟品种列表
|
||||
mock_symbols = adapter._get_mock_all_symbols()
|
||||
|
||||
print(f"\n1. 测试结果:")
|
||||
print(f"模拟品种列表长度: {len(mock_symbols)}")
|
||||
print(f"exchange_map长度: {len(adapter.exchange_map)}")
|
||||
print(f"两者长度是否一致: {len(mock_symbols) == len(adapter.exchange_map)}")
|
||||
|
||||
print("\n2. 模拟品种列表:")
|
||||
print(sorted(mock_symbols))
|
||||
|
||||
print("\n3. exchange_map中的品种:")
|
||||
print(sorted(adapter.exchange_map.keys()))
|
||||
|
||||
# 验证所有exchange_map中的品种都在模拟列表中
|
||||
print("\n4. 验证所有exchange_map中的品种都在模拟列表中:")
|
||||
missing_symbols = []
|
||||
for product_code in adapter.exchange_map:
|
||||
expected_symbol = f"{product_code}2603"
|
||||
if expected_symbol not in mock_symbols:
|
||||
missing_symbols.append(expected_symbol)
|
||||
|
||||
if missing_symbols:
|
||||
print(f"✗ 缺失的品种: {missing_symbols}")
|
||||
else:
|
||||
print("✓ 所有exchange_map中的品种都在模拟列表中")
|
||||
|
||||
# 验证模拟列表中的品种都在exchange_map中
|
||||
print("\n5. 验证模拟列表中的品种都在exchange_map中:")
|
||||
invalid_symbols = []
|
||||
for symbol in mock_symbols:
|
||||
# 提取品种代码
|
||||
if len(symbol) == 5:
|
||||
# 3字符品种代码
|
||||
product_code = symbol[:3]
|
||||
elif len(symbol) == 4:
|
||||
# 2字符或1字符品种代码
|
||||
# 先尝试2字符
|
||||
product_code = symbol[:2]
|
||||
if product_code not in adapter.exchange_map:
|
||||
# 尝试1字符
|
||||
product_code = symbol[:1]
|
||||
else:
|
||||
product_code = symbol[:2]
|
||||
|
||||
if product_code not in adapter.exchange_map:
|
||||
invalid_symbols.append(symbol)
|
||||
|
||||
if invalid_symbols:
|
||||
print(f"✗ 无效的品种: {invalid_symbols}")
|
||||
else:
|
||||
print("✓ 模拟列表中的所有品种都在exchange_map中")
|
||||
|
||||
# 测试get_all_symbols方法
|
||||
print("\n6. 测试get_all_symbols方法:")
|
||||
all_symbols = adapter.get_all_symbols()
|
||||
print(f"get_all_symbols返回长度: {len(all_symbols)}")
|
||||
print(f"与模拟列表长度是否一致: {len(all_symbols) == len(mock_symbols)}")
|
||||
|
||||
print("\n=== 测试完成 ===")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_mock_all_symbols()
|
||||
@ -0,0 +1,102 @@
|
||||
#!/usr/bin/env python3
|
||||
# 测试TQSDK合约代码格式修复
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# 确保能导入项目模块
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from qihuo_analyzer.data.api_adapters.tqsdk_adapter import TqSdkAdapter
|
||||
from qihuo_analyzer.data.data_fetcher import DataFetcher
|
||||
|
||||
def test_tq_symbol_format():
|
||||
"""测试TQSDK合约代码格式"""
|
||||
print("=== 测试TQSDK合约代码格式修复 ===")
|
||||
|
||||
# 测试TQSDK适配器的合约代码转换
|
||||
print("\n1. 测试TQSDK适配器合约代码转换:")
|
||||
adapter = TqSdkAdapter()
|
||||
|
||||
test_symbols = [
|
||||
"TA2603", # PTA
|
||||
"CF2603", # 棉花
|
||||
"SR2603", # 白糖
|
||||
"MA2603", # 甲醇
|
||||
"ZC2603", # 动力煤
|
||||
"FG2603", # 玻璃
|
||||
"RM2603", # 菜籽粕
|
||||
"OI2603", # 菜籽油
|
||||
"SA2603", # 纯碱
|
||||
"LY2603", # 烧碱
|
||||
"CU2603", # 铜
|
||||
"AL2603", # 铝
|
||||
"ZN2603", # 锌
|
||||
"PB2603", # 铅
|
||||
"NI2603", # 镍
|
||||
"SN2603", # 锡
|
||||
"AU2603", # 黄金
|
||||
"AG2603", # 白银
|
||||
"RB2603", # 螺纹钢
|
||||
"HC2603", # 热轧卷板
|
||||
"BU2603", # 沥青
|
||||
"RU2603", # 橡胶
|
||||
"FU2603", # 燃油
|
||||
"I2603", # 铁矿石
|
||||
"J2603", # 焦炭
|
||||
"JM2603", # 焦煤
|
||||
"A2603", # 大豆
|
||||
"B2603", # 豆粕
|
||||
"M2603", # 豆粕
|
||||
"Y2603", # 豆油
|
||||
"P2603", # 棕榈油
|
||||
"C2603", # 玉米
|
||||
"CS2603", # 玉米淀粉
|
||||
"L2603", # 聚乙烯
|
||||
"V2603", # 聚氯乙烯
|
||||
"PP2603", # 聚丙烯
|
||||
]
|
||||
|
||||
for symbol in test_symbols:
|
||||
try:
|
||||
tq_symbol = adapter._convert_symbol(symbol)
|
||||
print(f"✓ {symbol} → {tq_symbol}")
|
||||
except Exception as e:
|
||||
print(f"✗ {symbol} → 转换失败: {e}")
|
||||
|
||||
# 测试DataFetcher获取PTA数据
|
||||
print("\n2. 测试DataFetcher获取PTA数据:")
|
||||
fetcher = DataFetcher()
|
||||
|
||||
try:
|
||||
# 测试获取PTA K线数据
|
||||
print("测试获取 TA2603 的K线数据...")
|
||||
kline_data = fetcher.get_kline_data("TA2603", "1h", 10)
|
||||
if kline_data is not None:
|
||||
print(f"✓ 成功获取 {len(kline_data)} 条PTA K线数据")
|
||||
print("数据示例:")
|
||||
print(kline_data.head())
|
||||
else:
|
||||
print("✗ 无法获取PTA K线数据")
|
||||
except Exception as e:
|
||||
print(f"✗ 获取PTA数据失败: {e}")
|
||||
|
||||
# 测试获取其他郑州商品交易所数据
|
||||
print("\n3. 测试获取其他郑州商品交易所数据:")
|
||||
czce_symbols = ["CF2603", "SR2603", "MA2603", "FG2603"]
|
||||
|
||||
for symbol in czce_symbols:
|
||||
try:
|
||||
print(f"测试获取 {symbol} 的K线数据...")
|
||||
kline_data = fetcher.get_kline_data(symbol, "1h", 5)
|
||||
if kline_data is not None:
|
||||
print(f"✓ 成功获取 {symbol} 的K线数据")
|
||||
else:
|
||||
print(f"✗ 无法获取 {symbol} 的K线数据")
|
||||
except Exception as e:
|
||||
print(f"✗ 获取 {symbol} 数据失败: {e}")
|
||||
|
||||
print("\n=== 测试完成 ===")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_tq_symbol_format()
|
||||
Binary file not shown.
@ -0,0 +1,49 @@
|
||||
self.exchange_map = {
|
||||
'AU': 'SHFE', # 黄金 - 上海期货交易所
|
||||
'AG': 'SHFE', # 白银 - 上海期货交易所
|
||||
'CU': 'SHFE', # 铜 - 上海期货交易所
|
||||
'NI': 'SHFE', # 镍 - 上海期货交易所
|
||||
'SN': 'SHFE', # 锡 - 上海期货交易所
|
||||
'FG': 'CZCE', # 玻璃 - 郑州商品交易所
|
||||
'LY': 'CZCE', # 烧碱 - 郑州商品交易所
|
||||
'SA': 'CZCE', # 纯碱 - 郑州商品交易所
|
||||
'JM': 'DCE', # 焦煤 - 大连商品交易所
|
||||
'RB': 'SHFE', # 螺纹钢 - 上海期货交易所
|
||||
'ALO': 'SHFE', # 氧化铝 - 上海期货交易所
|
||||
'MA': 'CZCE', # 甲醇 - 郑州商品交易所
|
||||
'V': 'DCE', # PVC - 大连商品交易所
|
||||
'FU': 'SHFE', # 燃油 - 上海期货交易所
|
||||
'SC': 'INE', # 原油 - 上海国际能源交易中心
|
||||
'AL': 'SHFE', # 铝 - 上海期货交易所
|
||||
'P': 'DCE', # 棕榈油 - 大连商品交易所
|
||||
'LI': 'SHFE', # 碳酸锂 - 上海期货交易所
|
||||
'SI': 'GEM', # 工业硅 - 广州期货交易所
|
||||
'RU': 'SHFE', # 橡胶 - 上海期货交易所
|
||||
'BR': 'DCE', # 合成橡胶 - 大连商品交易所
|
||||
'ZN': 'SHFE', # 锌 - 上海期货交易所
|
||||
'NR': 'SHFE', # 20号胶 - 上海期货交易所
|
||||
'SP': 'GEM', # 多晶硅 - 广州期货交易所
|
||||
'IM': 'CFFEX', # 中证1000 - 中国金融期货交易所
|
||||
'IC': 'CFFEX', # 中证500 - 中国金融期货交易所
|
||||
'LU': 'INE', # 低硫燃油 - 上海国际能源交易中心
|
||||
'IH': 'CFFEX', # 上证50 - 中国金融期货交易所
|
||||
'HC': 'SHFE', # 热轧卷板 - 上海期货交易所
|
||||
'BU': 'SHFE', # 沥青 - 上海期货交易所
|
||||
'PB': 'SHFE', # 铅 - 上海期货交易所
|
||||
'I': 'DCE', # 铁矿石 - 大连商品交易所
|
||||
'J': 'DCE', # 焦炭 - 大连商品交易所
|
||||
'A': 'DCE', # 大豆 - 大连商品交易所
|
||||
'B': 'DCE', # 豆粕 - 大连商品交易所
|
||||
'M': 'DCE', # 豆粕 - 大连商品交易所
|
||||
'Y': 'DCE', # 豆油 - 大连商品交易所
|
||||
'C': 'DCE', # 玉米 - 大连商品交易所
|
||||
'CS': 'DCE', # 玉米淀粉 - 大连商品交易所
|
||||
'L': 'DCE', # 聚乙烯 - 大连商品交易所
|
||||
'PP': 'DCE', # 聚丙烯 - 大连商品交易所
|
||||
'TA': 'CZCE', # PTA - 郑州商品交易所
|
||||
'CF': 'CZCE', # 棉花 - 郑州商品交易所
|
||||
'SR': 'CZCE', # 白糖 - 郑州商品交易所
|
||||
'ZC': 'CZCE', # 动力煤 - 郑州商品交易所
|
||||
'RM': 'CZCE', # 菜籽粕 - 郑州商品交易所
|
||||
'OI': 'CZCE', # 菜籽油 - 郑州商品交易所
|
||||
}
|
||||
Loading…
Reference in new issue