oilverse-api / config.py
孙家明
deploy: OilVerse for HuggingFace (Node.js 18 fix)
fab9847
"""
config.py — 全局常量、特征定义、路径、API Key
=================================================
所有模块共享的配置集中在此。
"""
import os
# ── 工作目录 ──
BASE_DIR = os.environ.get('OILVERSE_BASE_DIR', os.path.dirname(os.path.abspath(__file__)))
OUTPUT_DIR = os.path.join(BASE_DIR, 'output')
DATA_DIR = os.path.join(BASE_DIR, 'data', 'csv_raw')
# ── API Keys ──
FRED_API_KEY = 'fc02a6e6a359a4cc16f0f1752d258011'
EIA_API_KEY = '9Nv5PhLREMmmKeo0zJ2U3Zu21Bntf8DfhEKBpi55'
SILICONFLOW_API_KEY = 'sk-cgllfrsuchzzwerkxcegkhbroboqcnpuubhreyrfudfstqjv'
SILICONFLOW_BASE_URL = 'https://api.siliconflow.cn/v1'
SILICONFLOW_MODEL = 'Qwen/Qwen2.5-7B-Instruct'
# ── 价格列 ──
PRICE_COLS = {
'WTI': 'WTI_spot',
'Brent': 'Brent_spot',
}
PRICE_COL = 'WTI_spot' # backward compat
# ── 特征列表 (20个,含GPR + 新闻情绪) ──
FEATURES = [
'Brent_spot', 'natgas_spot_henry', 'iron_ore_spot', # Price
'rig_count_us_new', 'supply_saudi', 'us_oil_inventory_total', # Supply
'pmi_us_mfg', 'usd_index', 'nonfarm_us', 'ipi_us', # Demand
'vix_lag1', 'vix_lag2', 'geo_shock_count', 'geo_active_events', # Risk+Geo
'mom1m_lag1', 'hist_vol_12m', 'rsi12m', # Technical
'news_oil_sentiment', 'news_geo_tone', 'news_article_volume', # Alternative (GDELT)
]
# ── 因子分组 ──
FACTOR_GROUPS = {
'Price': ['Brent_spot', 'natgas_spot_henry', 'iron_ore_spot'],
'Supply': ['rig_count_us_new', 'supply_saudi', 'us_oil_inventory_total'],
'Demand': ['pmi_us_mfg', 'usd_index', 'nonfarm_us', 'ipi_us'],
'Risk_Geo': ['vix_lag1', 'vix_lag2', 'geo_shock_count', 'geo_active_events'],
'Technical': ['mom1m_lag1', 'hist_vol_12m', 'rsi12m'],
'Alternative': ['news_oil_sentiment', 'news_geo_tone', 'news_article_volume'],
}
# ── Walk-Forward 参数 ──
TRAIN_WINDOW = 120
MAX_FEATURES = 10
MIN_TRAIN_SAMPLES = 20
# ── Regime 签名 (历史时期特征向量) ──
REGIME_SIGNATURES = {
'2008 金融危机': {'supply_stress': 0.1, 'demand_stress': 0.6, 'geopolitical_stress': 0.1, 'price_momentum': 0.15, 'vol_level': 0.25},
'2014 页岩油冲击': {'supply_stress': 0.5, 'demand_stress': 0.2, 'geopolitical_stress': 0.05, 'price_momentum': 0.2, 'vol_level': 0.12},
'2020 COVID': {'supply_stress': 0.3, 'demand_stress': 0.5, 'geopolitical_stress': 0.05, 'price_momentum': 0.1, 'vol_level': 0.30},
'2022 俄乌冲突': {'supply_stress': 0.3, 'demand_stress': 0.1, 'geopolitical_stress': 0.5, 'price_momentum': 0.05, 'vol_level': 0.15},
'2023 OPEC减产': {'supply_stress': 0.5, 'demand_stress': 0.15, 'geopolitical_stress': 0.15, 'price_momentum': 0.1, 'vol_level': 0.08},
'常态/低波动': {'supply_stress': 0.15, 'demand_stress': 0.15, 'geopolitical_stress': 0.1, 'price_momentum': 0.1, 'vol_level': 0.04},
}
REGIME_TYPE_MAP = {
'2008 金融危机': 'demand_collapse',
'2014 页岩油冲击': 'supply_glut',
'2020 COVID': 'demand_collapse',
'2022 俄乌冲突': 'geopolitical',
'2023 OPEC减产': 'supply_cut',
'常态/低波动': 'normal',
}
# ── 行业映射 ──
INDUSTRIES = ['Aviation', 'Logistics', 'Chemicals', 'Manufacturing', 'Upstream_OG']
INDUSTRY_ZH = {
'Aviation': '航空', 'Logistics': '物流', 'Chemicals': '化工',
'Manufacturing': '制造', 'Upstream_OG': '上游油气',
}
# ── 输出文件路径 ──
OUTPUT_FILES = {
'results': os.path.join(OUTPUT_DIR, 'v2_championship_results.csv'),
'shap': os.path.join(OUTPUT_DIR, 'v2_shap_records.json'),
'nlg': os.path.join(OUTPUT_DIR, 'v2_nlg_reports.json'),
'scenarios': os.path.join(OUTPUT_DIR, 'v2_scenarios.json'),
'regime': os.path.join(OUTPUT_DIR, 'v2_regime_data.json'),
'ablation': os.path.join(OUTPUT_DIR, 'v2_ablation.json'),
'hedging': os.path.join(OUTPUT_DIR, 'v2_hedging.json'),
'backtest': os.path.join(OUTPUT_DIR, 'v2_hedge_backtest.json'),
'feat_sel': os.path.join(OUTPUT_DIR, 'v2_feature_selection.json'),
'dashboard': os.path.join(OUTPUT_DIR, 'risk_dashboard.html'),
'panel_live': os.path.join(OUTPUT_DIR, 'panel_monthly_live.csv'),
'lineage': os.path.join(OUTPUT_DIR, 'data_lineage.json'),
'quality': os.path.join(OUTPUT_DIR, 'data_quality.json'),
'causal': os.path.join(OUTPUT_DIR, 'causal_analysis.json'),
'events': os.path.join(OUTPUT_DIR, 'event_timeline.json'),
}