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