mirror of
https://github.com/ZhuLinsen/daily_stock_analysis
synced 2026-09-20 10:53:33 +08:00
* feat: add Futu OpenD as an optional HK realtime and fundamental data source Add FutuFetcher and FutuFundamentalAdapter behind FUTU_OPEND_HOST/PORT, register the settings in Config and config_registry so the Web settings page can expose host, port and HK realtime priority, and route HK realtime quotes through a configurable futu/longbridge/akshare/yfinance order while keeping A-share priority untouched. Include offline tests for the adapter, config schema and HK routing/fallback, plus docs and CHANGELOG entries. * fix: wire Futu fundamentals into HK pipeline and restore quote supplementation - _fetch_offshore_fundamental_bundle() prefers the Futu fundamental adapter for HK when FUTU_OPEND_HOST is configured, and falls back to yfinance when Futu is absent or returns no usable content. - HK realtime priority loop now supplements missing quote fields (volume_ratio / turnover_rate / pe/pb / market cap) from later configured sources instead of returning after the first non-empty quote, matching the US path's _supplement_quote behavior. - capital_flow / boards blocks are filled from the Futu bundle for HK instead of being hard-coded not_supported; status and missing_fields aggregation updated accordingly. - Add regression tests for partial-quote supplementation and Futu fundamental bundle routing/fallback. * test: expect boards block ok when bundle provides belong_boards The Futu integration made the offshore boards block data-driven instead of hard-coded not_supported; update the existing US/HK fundamental context test to match (belong_boards from the bundle now surface as an ok boards block). * fix: preserve HK fallback_from metadata and normalize Futu quote timestamps - HK realtime priority loop now records the failed preferred source token and passes it as fallback_from when a later source takes over, so the pipeline and analysis context can mark the quote as degraded. - Futu snapshot update_time is a naive Beijing-time (UTC+8) string; attach the +08:00 offset before storing provider_timestamp so stale_seconds / is_stale / provider_timestamp freshness semantics are correct instead of being parsed as UTC. - Add regression tests for fallback_from propagation and timestamp normalization. * fix: normalize Futu belong_boards to name/type/code contract OpenD owner_plate returns plate_code / plate_name / plate_type, but DSA downstream consumers (notification, extract_board_detail_fields, market structure) only read name/type/code. Map the fields in FutuFundamentalAdapter._boards so HK Futu boards are actually consumed instead of silently dropped, and add regression tests including an end-to-end check through extract_board_detail_fields. * fix: merge yfinance bundle when Futu fundamental returns partial blocks Futu partial success (e.g. statements failed but static info worked) used to short-circuit the whole bundle, silently dropping the growth/earnings that the existing yfinance path could still provide. Now, when Futu returns content but is missing growth or earnings, fetch the yfinance bundle within the remaining budget and merge the missing blocks (growth/earnings/institution/capital_flow/belong_boards), keeping Futu-preferred values where both exist. Add regression test for the partial-success merge path. * fix: use field-level checks when deciding Futu-vs-yfinance growth/earnings The previous merge condition only checked dict truthiness, so a truthy growth/earnings shell (all-None core values or metadata-only keys such as report_date/period/currency) would skip the yfinance supplement and silently downgrade existing HK fundamentals. Add _earnings_block_has_values (a core numeric field or a populated dividend is required) and reuse the existing _has_meaningful_payload for growth; both the missing_core check and the merge loop now use these. Add regression test for the all-None-shell scenario. * fix: fill HK fundamental field gaps from yfinance instead of block-level checks Block-level meaningful checks still skipped the yfinance supplement when Futu hit only part of the growth/earnings fields (e.g. revenue_yoy but None net_profit_yoy, or earnings with only basic_eps), silently dropping fields the main branch used to provide. Replace the missing_core decision with a per-field gap list (growth: revenue_yoy/net_profit_yoy/gross_margin; earnings.financial_report: revenue/net_profit_parent/basic_eps/gross_profit) and make the merge field-level: keep Futu values, fill each missing field from yfinance. Add regression tests for partial-hit and all-None shells. * fix: normalize Futu dividends to the repo contract and treat dividend gaps as supplement triggers Futu OpenD dividend_list carries raw fields (statement/ex_date/record_date) which the notification/data_processing market-structure consumers do not read; the repo contract is ttm_cash_dividend_per_share, ttm_dividend_yield_pct and events[].cash_dividend_per_share / ex_dividend_date / event_date. Normalize events in FutuFundamentalAdapter._dividends_and_splits, compute TTM count/cash and yield from the latest quote, and teach _field_gaps/_merge_bundles to treat a dividend block that does not satisfy the contract as a gap so yfinance supplements it. Also dedupe FUTU_OPEND_HOST/PORT in full-guide_EN. * fix: read dividend yield price from UnifiedRealtimeQuote objects FutuFetcher.get_realtime_quote returns a UnifiedRealtimeQuote dataclass, not a dict, so the yield branch in _dividends_and_splits that guarded on isinstance(quote, dict) never ran on the live Futu path, silently dropping ttm_dividend_yield_pct while the contract check considered the dividend block complete. Read price via getattr(quote, 'price', None) and keep the dict fallback for other fetchers; add a regression test driving the real UnifiedRealtimeQuote shape. * fix: treat dividend blocks with TTM cash but no yield as supplement gaps The repo contract consumes ttm_cash_dividend_per_share and ttm_dividend_yield_pct together. When the Futu dividend path has events and TTM cash but the extra realtime price snapshot failed (quote None / no price), ttm_dividend_yield_pct cannot be computed and the block was previously treated as complete, so yfinance was never consulted and the notification rendered the yield as N/A. _dividend_contract_has_values() now requires the paired yield whenever TTM cash is present, so _field_gaps() triggers the yfinance supplement and _merge_bundles() replaces the incomplete dividend block. Add regression tests for the adapter-level gap shape (quote unavailable leaves no yield) and the manager-level supplement path (Futu cash without yield pulls yfinance and fills the yield). * fix: skip unconfigured Futu in HK realtime routing When FUTU_OPEND_HOST is not configured, the HK realtime priority loop used to still attempt the futu source, record it as the failed primary, and attach fallback_from='futu' to a successful quote from the next enabled source (longbridge/akshare/yfinance). Consumers then wrongly treated an enabled source's first success as degraded fallback data, contradicting the documented contract that Futu only participates when OpenD is configured. The HK loop now checks FutuFetcher.has_configured_endpoint() once and skips the futu token entirely when it is disabled, so no fallback_from is written. Existing configured-Futu routing tests explicitly patch the endpoint check; a new regression test asserts an unconfigured Futu is never called and the enriched quote carries fallback_from=None. * fix: release cached HK Futu fundamental fetcher in DataFetcherManager.close() The HK Futu fundamental path lazily creates and caches its own FutuFetcher (an OpenQuoteContext-backed OpenD connection) on _futu_fundamental_fetcher, but close() only released the TickFlow fetcher and the default fetchers snapshot. Explicit close / reload paths therefore left the OpenD connection hanging. close() now takes the cached _futu_fundamental_fetcher, clears the reference and calls its close() best-effort. A regression test injects an observable fetcher into _futu_fundamental_fetcher and asserts close() invokes it and clears the attribute. --------- Co-authored-by: BayMax local review <baymax-local@invalid>
975 lines
51 KiB
Plaintext
975 lines
51 KiB
Plaintext
# ===================================
|
||
# A股自选股智能分析系统 - 环境变量配置模板
|
||
# 复制此文件为 .env 并填入真实配置
|
||
# ===================================
|
||
|
||
# 自选股列表(逗号分隔,支持沪深两市代码)
|
||
# 沪市:600xxx, 601xxx, 603xxx
|
||
# 深市:000xxx, 002xxx, 300xxx
|
||
STOCK_LIST=600519,300750,002594
|
||
|
||
# Futu OpenD(持仓导入)
|
||
# --portfolio futu 只读取 ACTIVE REAL NORMAL / MASTER 账户中的沪深 A 股、港股、美股 LONG 正股持仓。
|
||
# futu-api 10.8 仅支持 IPv4;Docker 连接宿主机 OpenD 时请勿使用容器内的 127.0.0.1,详见 docs/full-guide.md。
|
||
# FUTU_OPEND_HOST=127.0.0.1
|
||
# FUTU_OPEND_PORT=11111
|
||
# FUTU_HK_REALTIME_SOURCE_PRIORITY=futu,longbridge,akshare,yfinance
|
||
# FUTU_SECURITY_FIRM=NONE # 可选;默认由 OpenD 自动识别,也可显式指定券商
|
||
# FUTU_ACC_ID= # 可选;正整数,指定后只读取该真实账户
|
||
|
||
# Anspire Open API Keys(支持多个,逗号分隔)
|
||
# 获取: https://open.anspire.cn/?share_code=QFBC0FYC
|
||
# 在未配置更高优先级 OpenAI-compatible 来源时,满足条件可复用该 key 给 Anspire 大模型网关与新闻搜索。
|
||
# 下列网关与模型为当前项目示例配置;是否可用请以 Anspire 控制台与官方文档为准:
|
||
# 示例网关: https://open-gateway.anspire.cn/v6
|
||
# 示例模型:Doubao-Seed-2.0-lite(可覆盖为 ANSPIRE_LLM_MODEL=Doubao-Seed-2.0-pro)
|
||
# 若网关有区域/版本差异,可覆盖为 ANSPIRE_LLM_BASE_URL=https://open-gateway.anspire.ai/v6
|
||
ANSPIRE_API_KEYS=
|
||
# ANSPIRE_LLM_MODEL=Doubao-Seed-2.0-lite
|
||
# ANSPIRE_LLM_BASE_URL=https://open-gateway.anspire.cn/v6
|
||
# ANSPIRE_LLM_ENABLED=true
|
||
# 数据源配置
|
||
# Tushare Pro Token(可选,从 https://tushare.pro/weborder/#/login?reg=834638 获取)
|
||
TUSHARE_TOKEN=
|
||
# Tushare Pro 自定义接入地址(可选,默认 http://api.tushare.pro)
|
||
# 适用场景:网络无法直达官方接口时指向自建网关或第三方兼容镜像
|
||
# 注意:使用非官方接入地址时,Token 与全部请求内容会经过该第三方服务器,请自行评估数据安全风险
|
||
# 必须以 http:// 或 https:// 开头;留空则保持官方默认地址不变
|
||
# TUSHARE_HTTP_URL=http://api.tushare.pro
|
||
# TickFlow API Key(可选;用于 A 股日 K、实时行情、股票列表/名称与大盘复盘增强,权限不足自动回退)
|
||
# TICKFLOW_API_KEY=
|
||
# TICKFLOW_KLINE_ADJUST=none # none/forward/backward/forward_additive/backward_additive
|
||
# TICKFLOW_BATCH_DAILY_ENABLED=true # 有权限时通过 TickFlow 批量预取日 K
|
||
# TICKFLOW_BATCH_SIZE=100 # TickFlow 单次批量请求的最大标的数
|
||
|
||
# 选股(参考 AlphaSift 实现,默认关闭;通常由 Web“基础设置”中的选股开关维护)
|
||
SCREENING_ENABLED=false
|
||
# 全市场快照源优先级;未配置时 DSA 会按是否配置 TUSHARE_TOKEN 自动注入:
|
||
# - 有 TUSHARE_TOKEN:tushare,sina,efinance,akshare_em,em_datacenter
|
||
# - 无 TUSHARE_TOKEN:sina,efinance,akshare_em,em_datacenter
|
||
# SNAPSHOT_SOURCE_PRIORITY=tushare,sina,efinance,akshare_em,em_datacenter
|
||
# (若希望保持与运行时自动注入一致,建议仅留空,不在该文件中固定值)
|
||
# 选股第三方数据源调用超时护栏。
|
||
# - SCREENING_SOURCE_CALL_TIMEOUT_SEC 为全局兜底;设为 0/off/disabled 可关闭 caller-side timeout。
|
||
# - Hotspot/SNAPSHOT/Daily 专项值优先于全局值;默认分别为 8s / 60s / 20s。
|
||
# - 热点默认 provider 会把正数值作为单次板块/成分股/详情 fallback 调用预算,并将剩余时间传入可终止的
|
||
# AkShare 子进程和 HTTP socket;0/off 只关闭整次调用预算,单源硬超时仍保留。
|
||
# SCREENING_SOURCE_CALL_TIMEOUT_SEC=
|
||
# SCREENING_HOTSPOT_CALL_TIMEOUT_SEC=8
|
||
# 用户主动搜索热点消息时的端到端等待上限,覆盖缓存 owner 等待和 provider 执行。
|
||
# 该路径必须有可终止子进程硬截止,0/off 会回退到安全默认值 12 秒。
|
||
# SCREENING_HOTSPOT_SEARCH_TIMEOUT_SEC=12
|
||
# SCREENING_SNAPSHOT_CALL_TIMEOUT_SEC=60
|
||
# SCREENING_DAILY_CALL_TIMEOUT_SEC=20
|
||
# 选股的东财直连请求限速与随机抖动。
|
||
# SCREENING_EASTMONEY_MIN_INTERVAL_SEC=1.0
|
||
# SCREENING_EASTMONEY_JITTER_SEC=0.3
|
||
# 选股支持 last-good 快照、日线历史和行业/概念 provider 缓存,默认目录为 data/screening。
|
||
# 如需自定义,可覆盖以下路径;留空不会改写既有 DSA 配置。
|
||
# SCREENING_DATA_DIR=data/screening
|
||
# SCREENING_FALLBACK_SNAPSHOT_PATH=data/screening/snapshot.last_good.json
|
||
# 5 分钟内重复选股默认复用最近一次成功的全市场快照;设为 0 可关闭。
|
||
# SCREENING_SNAPSHOT_CACHE_TTL_SEC=300
|
||
# SCREENING_DAILY_HISTORY_CACHE_DIR=data/screening/daily_history
|
||
# SCREENING_INDUSTRY_PROVIDER_CACHE_DIR=data/screening/industry_provider_cache
|
||
# 选股的行业/概念 provider 默认关闭;开启 akshare 后可为 theme_heat、行业热度和 LLM 上下文提供更多板块信息。
|
||
# INDUSTRY_PROVIDER=none
|
||
# INDUSTRY_PROVIDER_MAX_BOARDS=80
|
||
# 单次 LLM 请求超时秒数;选股会复用该配置,超时后降级返回非 LLM 排序结果。
|
||
# LLM_TIMEOUT_SEC=60
|
||
# 选股 LLM 重排请求输出上限,默认 2048。
|
||
# LLM_MAX_TOKENS=2048
|
||
|
||
# Finnhub(可选,美股数据源,免费 tier 60 calls/min)
|
||
# 获取: https://finnhub.io/register
|
||
# FINNHUB_API_KEY=
|
||
|
||
# AlphaVantage(可选,美股数据源,免费 tier 25 calls/day)
|
||
# 获取: https://www.alphavantage.co/support/#api-key
|
||
# ALPHAVANTAGE_API_KEY=
|
||
|
||
# Longbridge OpenAPI(可选,美股/港股量比、换手率、PE 等字段兜底)
|
||
# 从 https://open.longbridge.com/ 获取
|
||
# OAuth 2.0(推荐):先运行 scripts/generate_longbridge_oauth_token.py 生成本机 SDK token 缓存
|
||
# client_id 优先取 LONGBRIDGE_OAUTH_CLIENT_ID;留空且没有 Legacy Access Token 时兼容使用 LONGBRIDGE_APP_KEY
|
||
# GitHub Actions / Docker 可把 token 缓存文件 base64 后填入 LONGBRIDGE_OAUTH_TOKEN_CACHE_B64
|
||
# LONGBRIDGE_OAUTH_CLIENT_ID=
|
||
# LONGBRIDGE_OAUTH_TOKEN_CACHE_B64=
|
||
# Legacy API Key(兼容旧账号;Access Token 不是 OAuth access token)
|
||
# LONGBRIDGE_APP_KEY=
|
||
# LONGBRIDGE_APP_SECRET=
|
||
# LONGBRIDGE_ACCESS_TOKEN=
|
||
# static_info 进程内缓存秒数,默认 86400;0=每次请求拉取
|
||
# LONGBRIDGE_STATIC_INFO_TTL_SECONDS=86400
|
||
# 连接关闭类异常后的冷却秒数,默认 15;冷却期内会临时跳过 Longbridge,避免请求级频繁重连
|
||
# LONGBRIDGE_CONNECTION_COOLDOWN_SECONDS=15
|
||
# Longbridge SDK 语言与 REPORT_LANGUAGE(zh/en)一致;SDK 日志写入 LOG_DIR/longbridge_sdk.log
|
||
# 接入点(与 REPORT_LANGUAGE 无关;留空则用下列默认值):
|
||
# LONGBRIDGE_HTTP_URL=https://openapi.longbridge.com
|
||
# LONGBRIDGE_QUOTE_WS_URL=wss://openapi-quote.longbridge.com/v2
|
||
# LONGBRIDGE_TRADE_WS_URL=wss://openapi-trade.longbridge.com/v2
|
||
# LONGBRIDGE_REGION=hk
|
||
# 覆盖接入点;SDK 内部用 LONGPORT_REGION(不带 BRIDGE)自动选择,
|
||
# 代码会自动同步 LONGBRIDGE_REGION → LONGPORT_REGION。
|
||
# hk → *.longbridge.com | cn → *.longbridge.cn
|
||
# 其余见:https://open.longbridge.com/zh-CN/docs/getting-started#环境变量
|
||
# 夜盘行情 true/false,默认 false
|
||
# LONGBRIDGE_ENABLE_OVERNIGHT=false
|
||
# K 线推送 realtime 或 confirmed,默认 realtime
|
||
# LONGBRIDGE_PUSH_CANDLESTICK_MODE=realtime
|
||
# 连接时是否打印行情包(与 README / full-guide 一致:未设置时应用侧默认为关闭,等同 false)
|
||
# 设为 1 / true / yes 开启 SDK 详细行情包日志(调试长桥连接时使用)
|
||
# LONGBRIDGE_PRINT_QUOTE_PACKAGES=false
|
||
|
||
# 股票自动补全索引远程更新(默认开启;GitHub 不可访问时自动降级到本地内置索引)
|
||
STOCK_INDEX_REMOTE_UPDATE_ENABLED=true
|
||
|
||
# ===================================
|
||
# AI 模型配置
|
||
# ===================================
|
||
# 完整说明:docs/LLM_CONFIG_GUIDE.md
|
||
#
|
||
# 【快速上手】填一个 API Key 即可运行,系统自动识别模型。
|
||
# Anspire Open(一站式模型+搜索)→ 填 ANSPIRE_API_KEYS
|
||
# Gemini(免费额度)→ 填 GEMINI_API_KEY
|
||
# DeepSeek(性价比高)→ 填 DEEPSEEK_API_KEY
|
||
# AIHubmix(聚合平台)→ 填 AIHUBMIX_KEY
|
||
#
|
||
# 【进阶】需要多模型 / 多平台 fallback → 配置下方「多渠道」或在 Web 设置页可视化管理。
|
||
# 每个渠道可通过 LLM_<CHANNEL>_API_SURFACE 显式选择 chat_completions(默认)或 responses。
|
||
# responses 要求 PROTOCOL=openai,且 MODELS 中不能使用 anthropic/、gemini/、xai/ 等 LiteLLM 直连 provider 前缀;
|
||
# 网关自有的带斜杠模型 ID(如 deepseek-ai/DeepSeek-V3)会作为 OpenAI-compatible 模型 ID 路由。
|
||
# 同一个规范化模型别名不能同时出现在 chat_completions 和 responses 渠道;需要两种 Surface 时请使用不同别名。
|
||
# 同一渠道中的模型必须使用同一种 API Surface;不要依赖失败后自动切换 endpoint。
|
||
# 若 Anspire `/models` 与连接测试确认目标模型走 Responses(例如当前观测到的 GPT-5.6 sol/terra/luna),使用渠道模式并设置 LLM_ANSPIRE_API_SURFACE=responses。
|
||
# ===================================
|
||
|
||
# 生成后端:默认 litellm;codex_cli / claude_code_cli / opencode_cli 为显式 opt-in 的本地 CLI backend(experimental/limited)。
|
||
# OpenCode CLI 使用本机 OpenCode 的默认模型;OPENCODE_CLI_MODEL 只是可选 --model 覆盖。
|
||
# 本地 CLI Backend 不等于离线模型,CLI 背后的服务可能处理股票代码、新闻、持仓上下文、分析 prompt 和报告草稿。
|
||
# Docker / CI / remote server 不天然拥有桌面 CLI 登录态;DSA 不读取 Claude/OpenCode credential 文件。
|
||
# DSA 会用最小 env allowlist + provider credential denylist 降低 API keys / webhook tokens 泄漏风险。
|
||
# Web 设置页的快速检查只读配置和可执行文件可见性;JSON 测试才会发起真实 generation backend smoke 请求。
|
||
GENERATION_BACKEND=litellm
|
||
# OPENCODE_CLI_MODEL=provider/model
|
||
# 后端级 fallback;本地 .env 空值禁用 backend-level fallback,litellm -> litellm 会被解析为 no-op。
|
||
# 默认 GitHub Actions workflow 未配置该变量时会显式使用 litellm;Actions 中要禁用 fallback 时可设为 primary backend 实现 self no-op。
|
||
GENERATION_FALLBACK_BACKEND=litellm
|
||
# 本地 CLI backend 执行上限;timeout 最大 3600,输出最大 33554432 bytes,并发最大分别为 16 / 4。
|
||
GENERATION_BACKEND_TIMEOUT_SECONDS=300
|
||
GENERATION_BACKEND_MAX_OUTPUT_BYTES=1048576
|
||
GENERATION_BACKEND_MAX_CONCURRENCY=1
|
||
LOCAL_CLI_BACKEND_MAX_CONCURRENCY=1
|
||
# 问股 Chat 运行方式;auto(推荐)和 litellm 保持当前默认模型路径,codex_app_server 调用运行 DSA 后端设备上的 Codex(实验,仅 macOS/Linux/完整 WSL 后端的 single-agent Chat;暂不支持原生 Windows)。设置页只检查能否尝试,首次真实问题才验证登录、模型和工具执行。
|
||
AGENT_BACKEND=auto
|
||
# 旧的 Agent 模型路由兼容项;普通用户请在 Web 设置页使用 AGENT_BACKEND。
|
||
AGENT_GENERATION_BACKEND=auto
|
||
|
||
# --- API Key(填一个即可)---
|
||
|
||
# Gemini(https://aistudio.google.com)
|
||
GEMINI_API_KEY=
|
||
# 多 Key 负载均衡:GEMINI_API_KEYS=key1,key2,key3
|
||
|
||
# DeepSeek(https://platform.deepseek.com)
|
||
# 兼容默认:仅填 DEEPSEEK_API_KEY 时仍使用 deepseek-chat,并在日志提示迁移到 deepseek-v4-flash
|
||
# DEEPSEEK_API_KEY=
|
||
|
||
# AIHubmix 聚合(https://inferera.com/?aff=CfMq)
|
||
# 一个 Key 用 GPT/Claude/Gemini/GLM/Qwen 等模型,无需科学上网
|
||
# AIHUBMIX_KEY=
|
||
|
||
# Anthropic Claude(https://console.anthropic.com)
|
||
# ANTHROPIC_API_KEY=
|
||
|
||
# OpenAI / 兼容 API
|
||
# OPENAI_API_KEY=
|
||
# OPENAI_BASE_URL= # 第三方 API 地址(中转站/代理),留空用官方
|
||
|
||
# Ollama 本地模型(无需 API Key,推荐)
|
||
# OLLAMA_API_BASE=http://localhost:11434
|
||
# LITELLM_MODEL=ollama/qwen3:8b
|
||
#
|
||
# 或使用渠道模式:
|
||
# LLM_CHANNELS=ollama
|
||
# LLM_OLLAMA_BASE_URL=http://localhost:11434
|
||
# LLM_OLLAMA_MODELS=qwen3:8b
|
||
|
||
# 采样温度(0.0-2.0,默认 0.7;0 确定性最高,2 随机性最高)
|
||
# 严格 temperature 兼容来源:
|
||
# - Moonshot API / 模型文档:https://platform.kimi.ai/docs/guide/kimi-k2-6-quickstart
|
||
# - Moonshot 官方模型卡(评测默认 temperature = 1.0):https://huggingface.co/moonshotai/Kimi-K2.6
|
||
# - OpenAI Chat Completions 规范:https://platform.openai.com/docs/api-reference/chat/create
|
||
# - LiteLLM OpenAI-Compatible 规范:https://docs.litellm.ai/docs/providers/openai_compatible
|
||
# 当前仓库运行时依赖约束:litellm>=1.80.10,!=1.82.7,!=1.82.8,<2.0.0(显式排除 PyPI 事故版本,见 requirements.txt)。
|
||
# 因此 kimi-k2.6 会自动改用 1.0/0.6;GPT-5 / o 系列等默认温度模型会省略 temperature,避免 API 拒绝请求。
|
||
# 若兼容平台返回明确的参数不支持错误,运行时会在当前请求内修正参数并重试一次;成功策略只做进程内缓存。
|
||
# top_p、presence_penalty、frequency_penalty、seed 若返回“不支持参数”,同样会触发本次请求级别的修正与重试(不改写 LLM_TEMPERATURE)。
|
||
# 其他模型和 fallback 仍使用你配置的 LLM_TEMPERATURE。
|
||
# Web 设置页 / 桌面端导入不会静默清空或改写 LLM_TEMPERATURE;只在真正发请求前临时适配模型参数。
|
||
# 如果主模型切回普通模型,原本配置的温度会自动恢复;最小回滚方式是回退本次 LLM 参数适配改动。
|
||
# LLM_TEMPERATURE=0.7
|
||
|
||
# LLM 用量遥测 message HMAC 配置(可选)
|
||
# 默认留空时,系统会在数据目录生成 .llm_usage_hmac_secret,本地部署内可稳定比较。
|
||
# 只有需要跨部署比较 usage message HMAC 时才显式配置同一个随机密钥;轮换时同步更新版本标签。
|
||
# 显式配置时请使用高熵随机值(例如 openssl rand -hex 32),不要把真实密钥提交到版本控制。
|
||
# LLM_USAGE_HMAC_SECRET=
|
||
# LLM_USAGE_HMAC_KEY_VERSION=local-v1
|
||
|
||
# Provider prompt cache 配置(可选)
|
||
# TELEMETRY 只控制 provider cache usage / diagnostics 记录;不控制 provider implicit cache。
|
||
# HINTS 控制是否主动发送 prompt_cache_key、cache_control、user_id 等已验证 provider-specific hint;默认关闭。
|
||
# DIAGNOSTICS_LEVEL 可选 off/basic/debug;debug 也只输出脱敏诊断,不记录 raw prompt 或 request body。
|
||
# LLM_PROMPT_CACHE_TELEMETRY_ENABLED=true
|
||
# LLM_PROMPT_CACHE_HINTS_ENABLED=false
|
||
# LLM_PROMPT_CACHE_DIAGNOSTICS_LEVEL=off
|
||
|
||
# --- 多渠道配置(可选,也可在 Web 设置页配置)---
|
||
# 每个渠道独立配置 base_url / api_key / models,支持多 Key 轮询与自动 fallback。
|
||
#
|
||
# 示例:DeepSeek + Gemini 双渠道
|
||
# LLM_CHANNELS=deepseek,gemini
|
||
# LLM_DEEPSEEK_API_KEY=sk-xxx
|
||
# LLM_DEEPSEEK_BASE_URL=https://api.deepseek.com
|
||
# LLM_DEEPSEEK_MODELS=deepseek-v4-flash,deepseek-v4-pro
|
||
# LLM_GEMINI_API_KEYS=key1,key2
|
||
# LLM_GEMINI_MODELS=gemini-3.1-pro-preview
|
||
#
|
||
# 示例:自定义 API 端点(第三方代理 / 聚合平台 / 转发站)
|
||
# LLM_CHANNELS=my_proxy
|
||
# LLM_MY_PROXY_BASE_URL=https://your-proxy.example.com/v1
|
||
# LLM_MY_PROXY_API_KEY=sk-xxx
|
||
# LLM_MY_PROXY_MODELS=gpt-5.5,claude-sonnet-4-6
|
||
# LLM_MY_PROXY_PROTOCOL=openai
|
||
#
|
||
# 示例:Ollama 本地模型(无需 API Key)
|
||
# LLM_CHANNELS=ollama
|
||
# LLM_OLLAMA_BASE_URL=http://localhost:11434
|
||
# LLM_OLLAMA_MODELS=qwen3:8b,llama3.2
|
||
#
|
||
# 示例:Hermes 本地 HTTP generation(Phase 3,仅普通分析/JSON;不支持 Agent tools、Stream、Vision)
|
||
# LLM_CHANNELS=hermes
|
||
# LLM_HERMES_PROTOCOL=openai
|
||
# LLM_HERMES_BASE_URL=http://127.0.0.1:8642/v1
|
||
# LLM_HERMES_API_KEY=sk-local-hermes
|
||
# LLM_HERMES_MODELS=hermes-agent
|
||
# LITELLM_MODEL=openai/hermes-agent
|
||
#
|
||
# 常用厂商模板(任选其一复制到 .env;完整说明见 docs/llm-providers.md)
|
||
#
|
||
# Anspire Open(共享搜索与 LLM Key,OpenAI Compatible)
|
||
# LLM_CHANNELS=anspire
|
||
# LLM_ANSPIRE_PROTOCOL=openai
|
||
# LLM_ANSPIRE_BASE_URL=https://open-gateway.anspire.cn/v6(示例)
|
||
# LLM_ANSPIRE_API_KEY=sk-xxx
|
||
# LLM_ANSPIRE_MODELS=Doubao-Seed-2.0-lite,Doubao-Seed-2.0-pro(示例模型)
|
||
# LITELLM_MODEL=openai/Doubao-Seed-2.0-lite(示例)
|
||
#
|
||
# AIHubmix 聚合平台(OpenAI Compatible)
|
||
# LLM_CHANNELS=aihubmix
|
||
# LLM_AIHUBMIX_PROTOCOL=openai
|
||
# LLM_AIHUBMIX_BASE_URL=https://aihubmix.com/v1
|
||
# LLM_AIHUBMIX_API_KEY=sk-xxx
|
||
# LLM_AIHUBMIX_MODELS=gpt-5.5,claude-sonnet-4-6,gemini-3.1-pro-preview
|
||
# LITELLM_MODEL=openai/gpt-5.5
|
||
#
|
||
# OpenAI 官方
|
||
# LLM_CHANNELS=openai
|
||
# LLM_OPENAI_PROTOCOL=openai
|
||
# LLM_OPENAI_BASE_URL=https://api.openai.com/v1
|
||
# LLM_OPENAI_API_KEY=sk-xxx
|
||
# LLM_OPENAI_MODELS=gpt-5.5,gpt-5.4-mini
|
||
# LITELLM_MODEL=openai/gpt-5.5
|
||
#
|
||
# DeepSeek 官方
|
||
# LLM_CHANNELS=deepseek
|
||
# LLM_DEEPSEEK_PROTOCOL=deepseek
|
||
# LLM_DEEPSEEK_BASE_URL=https://api.deepseek.com
|
||
# LLM_DEEPSEEK_API_KEY=sk-xxx
|
||
# LLM_DEEPSEEK_MODELS=deepseek-v4-flash,deepseek-v4-pro
|
||
# LITELLM_MODEL=deepseek/deepseek-v4-flash
|
||
#
|
||
# Gemini 官方(官方协议,Base URL 留空)
|
||
# LLM_CHANNELS=gemini
|
||
# LLM_GEMINI_PROTOCOL=gemini
|
||
# LLM_GEMINI_API_KEY=xxx
|
||
# LLM_GEMINI_MODELS=gemini-3.1-pro-preview,gemini-3-flash-preview
|
||
# LITELLM_MODEL=gemini/gemini-3.1-pro-preview
|
||
#
|
||
# Anthropic Claude 官方(官方协议,Base URL 留空)
|
||
# LLM_CHANNELS=anthropic
|
||
# LLM_ANTHROPIC_PROTOCOL=anthropic
|
||
# LLM_ANTHROPIC_API_KEY=sk-ant-xxx
|
||
# LLM_ANTHROPIC_MODELS=claude-sonnet-4-6,claude-opus-4-7
|
||
# LITELLM_MODEL=anthropic/claude-sonnet-4-6
|
||
#
|
||
# Kimi / Moonshot(OpenAI Compatible)
|
||
# LLM_CHANNELS=moonshot
|
||
# LLM_MOONSHOT_PROTOCOL=openai
|
||
# LLM_MOONSHOT_BASE_URL=https://api.moonshot.cn/v1
|
||
# LLM_MOONSHOT_API_KEY=sk-xxx
|
||
# LLM_MOONSHOT_MODELS=kimi-k2.6,kimi-k2.5
|
||
# LITELLM_MODEL=openai/kimi-k2.6
|
||
#
|
||
# 通义千问 DashScope(OpenAI Compatible)
|
||
# LLM_CHANNELS=dashscope
|
||
# LLM_DASHSCOPE_PROTOCOL=openai
|
||
# LLM_DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
|
||
# LLM_DASHSCOPE_API_KEY=sk-xxx
|
||
# LLM_DASHSCOPE_MODELS=qwen3.6-plus,qwen3.6-flash
|
||
# LITELLM_MODEL=openai/qwen3.6-plus
|
||
#
|
||
# 智谱 GLM(OpenAI Compatible)
|
||
# LLM_CHANNELS=zhipu
|
||
# LLM_ZHIPU_PROTOCOL=openai
|
||
# LLM_ZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4
|
||
# LLM_ZHIPU_API_KEY=xxx
|
||
# LLM_ZHIPU_MODELS=glm-5.1,glm-4.7-flash
|
||
# LITELLM_MODEL=openai/glm-5.1
|
||
#
|
||
# MiniMax(OpenAI Compatible)
|
||
# 来源:官方 OpenAI API 兼容文档 https://platform.minimax.io/docs/api-reference/text-chat
|
||
# LiteLLM 通过 openai/<model> 路由到兼容 Chat Completions 的 Base URL。
|
||
# LLM_CHANNELS=minimax
|
||
# LLM_MINIMAX_PROTOCOL=openai
|
||
# LLM_MINIMAX_BASE_URL=https://api.minimax.io/v1
|
||
# LLM_MINIMAX_API_KEY=xxx
|
||
# LLM_MINIMAX_MODELS=MiniMax-M2.7,MiniMax-M2.7-highspeed
|
||
# LITELLM_MODEL=openai/MiniMax-M2.7
|
||
#
|
||
# 小米 MiMo(OpenAI Compatible)
|
||
# Base URL 与模型名请以 MiMo 官方文档/控制台为准。
|
||
# LLM_CHANNELS=mimo
|
||
# LLM_MIMO_PROTOCOL=openai
|
||
# LLM_MIMO_BASE_URL=
|
||
# LLM_MIMO_API_KEY=sk-xxx
|
||
# LLM_MIMO_MODELS=mimo-xxx
|
||
# LITELLM_MODEL=openai/mimo-xxx
|
||
# 注:仓库默认 daily_analysis workflow 未显式透传 LLM_MIMO_*,该示例默认适用于本地 .env、Docker 或自托管脚本;Actions 使用请同步补齐 workflow 映射。
|
||
#
|
||
# 火山方舟 / 豆包(OpenAI Compatible,按实际开通地域调整 endpoint)
|
||
# 来源:火山方舟在线推理 / Responses API 文档 https://www.volcengine.com/docs/82379/2121998
|
||
# LiteLLM 通过 openai/<model> 路由到兼容 Chat Completions 的 Base URL。
|
||
# LLM_CHANNELS=volcengine
|
||
# LLM_VOLCENGINE_PROTOCOL=openai
|
||
# LLM_VOLCENGINE_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
|
||
# LLM_VOLCENGINE_API_KEY=xxx
|
||
# LLM_VOLCENGINE_MODELS=doubao-seed-1-6-251015,doubao-seed-1-6-thinking-251015
|
||
# LITELLM_MODEL=openai/doubao-seed-1-6-251015
|
||
#
|
||
# 硅基流动 SiliconFlow(OpenAI Compatible)
|
||
# 来源:官方模型列表 https://docs.siliconflow.cn/quickstart/models
|
||
# LLM_CHANNELS=siliconflow
|
||
# LLM_SILICONFLOW_PROTOCOL=openai
|
||
# LLM_SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1
|
||
# LLM_SILICONFLOW_API_KEY=sk-xxx
|
||
# LLM_SILICONFLOW_MODELS=deepseek-ai/DeepSeek-V3.2,Qwen/Qwen3-235B-A22B-Thinking-2507
|
||
# LITELLM_MODEL=openai/deepseek-ai/DeepSeek-V3.2
|
||
#
|
||
# OpenRouter(OpenAI Compatible)
|
||
# 来源:官方 Models API https://openrouter.ai/docs/api/api-reference/models/get-models
|
||
# LLM_CHANNELS=openrouter
|
||
# LLM_OPENROUTER_PROTOCOL=openai
|
||
# LLM_OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
|
||
# LLM_OPENROUTER_API_KEY=sk-or-xxx
|
||
# LLM_OPENROUTER_MODELS=~anthropic/claude-sonnet-latest,~openai/gpt-latest
|
||
# LITELLM_MODEL=openai/~anthropic/claude-sonnet-latest
|
||
|
||
# 高级:模型路由 YAML 配置(可选,参考 docs/examples/litellm_config.example.yaml)
|
||
# LITELLM_CONFIG=./litellm_config.yaml
|
||
|
||
# ===================================
|
||
# 搜索引擎配置(用于获取股票新闻)
|
||
# ===================================
|
||
# Bocha API Keys(中文搜索优化,支持AI摘要,支持多个,逗号分隔)
|
||
# 获取: https://open.bocha.cn/
|
||
# BOCHA_API_KEYS=your_bocha_key_here
|
||
# MiniMax API Key(Coding Plan Web Search,支持多个,逗号分隔)
|
||
# 获取: https://platform.minimax.io/
|
||
# MINIMAX_API_KEYS=your_minimax_key_here
|
||
# Tavily API Keys(支持多个,逗号分隔)
|
||
TAVILY_API_KEYS=
|
||
# SerpAPI Keys(支持多个,逗号分隔)
|
||
SERPAPI_API_KEYS=
|
||
# Brave Search API Keys(支持多个,逗号分隔)
|
||
# 获取: https://brave.com/search/api/
|
||
BRAVE_API_KEYS=
|
||
# SearXNG 实例地址(逗号分隔,私有部署无配额,需在 settings.yml 启用 format: json)
|
||
# GitHub Actions 每日分析工作流支持同名 Variables 优先、Secrets 回退;公网地址可配置为 Variable。
|
||
# 留空且下方开关为 true 时,会自动从 searx.space 拉取公共实例。公共实例普遍存在限流(429)、
|
||
# 下线(503)或未开启 JSON 输出的情况,逐个重试会让每次分析多耗 30~60 秒且新闻面最终为空,
|
||
# 因此默认关闭。推荐配置自建实例地址(SEARXNG_BASE_URLS),或使用上方任一带 key 的搜索渠道。
|
||
SEARXNG_BASE_URLS=
|
||
SEARXNG_PUBLIC_INSTANCES_ENABLED=false
|
||
|
||
# ===================================
|
||
# Social Sentiment Intelligence (US stocks only)
|
||
# ===================================
|
||
# Reddit / X (Twitter) / Polymarket sentiment data from api.adanos.org
|
||
# Only activates for US stock tickers (AAPL, TSLA, etc.), ignored for A-shares/HK stocks
|
||
# Free tier: 250 requests/month | Register: https://api.adanos.org
|
||
# SOCIAL_SENTIMENT_API_KEY=sk_live_your_key_here
|
||
# SOCIAL_SENTIMENT_API_URL=https://api.adanos.org
|
||
|
||
# ===================================
|
||
# 新闻时效与分析筛选配置
|
||
# ===================================
|
||
# 新闻策略窗口档位:ultra_short(1天) / short(3天) / medium(7天) / long(30天)
|
||
# 实际窗口 = min(策略窗口, NEWS_MAX_AGE_DAYS)
|
||
# NEWS_STRATEGY_PROFILE=short
|
||
# 新闻最大时效(天),搜索时限制结果在近期内,避免使用过时信息
|
||
# NEWS_MAX_AGE_DAYS=3
|
||
# 本地资讯/情报池保留天数;只清理资讯池 intelligence_items,不影响历史报告
|
||
# NEWS_INTEL_RETENTION_DAYS=30
|
||
# 单个 RSS/Atom 资讯源拉取超时(秒)
|
||
# NEWS_INTEL_FETCH_TIMEOUT_SEC=8
|
||
# 单次每个资讯源最多采集条数
|
||
# NEWS_INTEL_MAX_ITEMS_PER_SOURCE=50
|
||
# 开启后在个股分析、Agent 分析和大盘复盘读取本地资讯池前,自动初始化内置资讯源并拉取启用源;
|
||
# 默认关闭,避免未确认的外部请求和分析输入变化
|
||
# 注:仓库默认 daily_analysis workflow 未显式透传该变量,Actions 使用请同步补齐 workflow 映射
|
||
# NEWS_INTEL_AUTO_FETCH_ENABLED=false
|
||
# NewsNow HTTP API 基地址 —— 外部依赖配置
|
||
# - 官方项目及部署指南:https://github.com/qqhann/newsnow
|
||
# - 当前默认值 https://newsnow.busiyi.world 是公开示例实例,存在以下风险:
|
||
# * 可能因官方维护或限流而不可用
|
||
# * 不保证稳定性或数据可靠性,仅用于演示和测试
|
||
# - 生产环境强烈建议改为自建 NewsNow 实例,确保可控和稳定性
|
||
# - 部署前建议验证 API 契约兼容性(参见 docs/intelligence-sources.md):
|
||
# curl -sS "https://newsnow.busiyi.world/api/s?id=cls-hot" | python -c "import sys, json; data=json.load(sys.stdin); assert isinstance(data.get('items'), list)"
|
||
# - 本配置仅控制资讯源采集与清理行为,不会改变 LLM / provider / base URL / 兼容回退语义
|
||
# NEWSNOW_BASE_URL=https://newsnow.busiyi.world
|
||
# 乖离率阈值(%),偏离 MA5 超过此值提示不追高;强势趋势股自动放宽到 1.5 倍
|
||
# BIAS_THRESHOLD=5.0
|
||
|
||
# ===================================
|
||
# Agent 策略对话配置(Web 对话页)
|
||
# ===================================
|
||
# 启用 Agent 策略对话(默认 false,内部统一命名为 skill)
|
||
# AGENT_MODE=true
|
||
# 默认模型问股的主模型(可选):留空时继承主模型;无 provider 前缀会按 openai/<model> 解析;Codex 不使用此项
|
||
# AGENT_LITELLM_MODEL=
|
||
# Agent 资源上限:默认模型用作推理步数上限(默认 10 时各子 Agent 按自身预设运行);Codex 用作单次问股的工具调用次数上限
|
||
# AGENT_MAX_STEPS=10
|
||
# 默认启用策略(逗号分隔),不配置时使用以下内置默认值
|
||
#
|
||
# 内置策略技能列表(可任意组合):
|
||
# bull_trend — 多头趋势(MA5>MA10>MA20 排列 + 低乖离率)
|
||
# ma_golden_cross — 均线金叉(MA5 上穿 MA10/MA20)
|
||
# volume_breakout — 放量突破(价格突破近期高点 + 成交量放大)
|
||
# hot_theme — 热点题材(政策/产业热点、板块扩散与个股相关性)
|
||
# event_driven — 事件驱动(业绩、政策、订单、并购等催化事件)
|
||
# growth_quality — 成长质量(收入利润、ROE、现金流与成长持续性)
|
||
# expectation_repricing — 预期重估(业绩/政策/估值预期差修复或落空)
|
||
# shrink_pullback — 缩量回踩(回踩均线 + 量能萎缩,低吸点)
|
||
# bottom_volume — 底部放量(地量见地价,底部反转信号)
|
||
# dragon_head — 龙头策略(强势龙头,趋势延续追涨)
|
||
# one_yang_three_yin — 一阳夹三阴(主力洗盘后强势反包形态)
|
||
# box_oscillation — 箱体震荡(区间高抛低吸)
|
||
# chan_theory — 缠论(缠中说禅理论:笔/线段/中枢)
|
||
# wave_theory — 波浪理论(艾略特波浪计数)
|
||
# emotion_cycle — 情绪周期(市场情绪高低点轮动)
|
||
#
|
||
# 留空时,系统会使用 metadata 里声明的主默认策略 skill(内置默认是 bull_trend)
|
||
# AGENT_SKILLS=
|
||
#
|
||
# 也可以手动指定一组策略:
|
||
# AGENT_SKILLS=bull_trend,ma_golden_cross,shrink_pullback
|
||
#
|
||
# 完整启用所有内置策略(两种写法等效):
|
||
# AGENT_SKILLS=all
|
||
# AGENT_SKILLS=bull_trend,ma_golden_cross,volume_breakout,hot_theme,event_driven,growth_quality,expectation_repricing,shrink_pullback,bottom_volume,dragon_head,one_yang_three_yin,box_oscillation,chan_theory,wave_theory,emotion_cycle
|
||
#
|
||
AGENT_SKILLS=
|
||
# 自定义策略目录(可选,放置自定义 YAML 策略文件;环境变量名沿用内部 skill 命名)
|
||
# AGENT_SKILL_DIR=./strategies
|
||
|
||
# Agent 架构模式(默认 single;multi 为多 Agent 编排模式)
|
||
# AGENT_ARCH=single
|
||
|
||
# Multi-Agent 编排模式(仅 AGENT_ARCH=multi 时有效)
|
||
# quick: 技术分析→决策(最快,约 2 次 LLM 调用)
|
||
# standard: 技术→情报→决策(默认)
|
||
# full: 技术→情报→风控→决策
|
||
# specialist: 技术→情报→风控→策略专家评估→决策
|
||
# AGENT_ORCHESTRATOR_MODE=standard
|
||
|
||
# Agent 执行超时预算(秒;默认 LiteLLM 路径可用 0 关闭;Codex 必须大于 0,确保每次问股都会结束;默认 600)
|
||
# AGENT_ORCHESTRATOR_TIMEOUT_S=600
|
||
|
||
# 子 Agent 独立超时上限(秒,0=关闭;设为正值如 180 可为该 Agent 启用独立硬上限)
|
||
# 生效规则:
|
||
# - Pipeline 总预算关闭(AGENT_ORCHESTRATOR_TIMEOUT_S=0)时:子 Agent 上限独立生效,作为该 Agent 的绝对超时
|
||
# - Pipeline 总预算开启时:实际上限 = min(Pipeline 剩余预算, 子 Agent 上限),取两者中较小值
|
||
# - 未配置(默认 0)时:无独立上限,仅受 Pipeline 剩余预算约束
|
||
# AGENT_TECHNICAL_AGENT_TIMEOUT_S=0
|
||
# AGENT_INTEL_AGENT_TIMEOUT_S=0
|
||
# AGENT_RISK_AGENT_TIMEOUT_S=0
|
||
# AGENT_DECISION_AGENT_TIMEOUT_S=0
|
||
# AGENT_PORTFOLIO_AGENT_TIMEOUT_S=0
|
||
# AGENT_SKILL_AGENT_TIMEOUT_S=0
|
||
|
||
# Agent 工具按类别默认超时(秒,0=关闭;未配置时回退到全局 tool_call_timeout_seconds 预算)
|
||
# 有效超时按 first-wins 解析:显式 per-run tool_call_timeout_seconds > 单工具显式 timeout_seconds > 类别默认值 > 无限制;
|
||
# 剩余 wall-clock 预算仅作不可突破的外层 cap;inf/nan/负数视为无限制。
|
||
# market 类工具(get_market_indices / get_sector_rankings 等网络数据调用)复用 AGENT_DATA_TOOL_TIMEOUT_S,无独立开关。
|
||
# AGENT_DATA_TOOL_TIMEOUT_S=0
|
||
# AGENT_SEARCH_TOOL_TIMEOUT_S=0
|
||
# AGENT_ANALYSIS_TOOL_TIMEOUT_S=0
|
||
# AGENT_ACTION_TOOL_TIMEOUT_S=0
|
||
|
||
# 策略专家并发数(仅 specialist 模式生效;范围 1-4,默认 3)
|
||
# AGENT_SKILL_CONCURRENCY=3
|
||
|
||
# 风控 Agent 是否可以否决买入信号(默认开启)
|
||
# AGENT_RISK_OVERRIDE=true
|
||
|
||
# 记忆与校准系统(追踪历史准确率,自动调节置信度)
|
||
# AGENT_MEMORY_ENABLED=false
|
||
|
||
# 基于样本充足的真实 Skill Outcome 保守加权策略意见
|
||
# AGENT_SKILL_AUTOWEIGHT=true
|
||
|
||
# 策略路由模式(auto=根据市场状态自动选择 / manual=使用 AGENT_SKILLS 列表)
|
||
# AGENT_SKILL_ROUTING=auto
|
||
|
||
# 问股可见对话上下文压缩(默认关闭)。开启后仅压缩用户可见的 user/assistant 历史,不影响同轮 tool/thinking 透传。
|
||
# AGENT_CONTEXT_COMPRESSION_ENABLED=false
|
||
# 压缩策略:cost=更省 token / balanced=均衡 / long_context_raw_first=优先保留更多原文
|
||
# AGENT_CONTEXT_COMPRESSION_PROFILE=balanced
|
||
# 触发压缩的历史 token 阈值;留空则跟随当前 profile preset
|
||
# AGENT_CONTEXT_COMPRESSION_TRIGGER_TOKENS=
|
||
# 压缩时最近 N 个用户轮次及其后的回复保持原文;留空则跟随当前 profile preset
|
||
# AGENT_CONTEXT_PROTECTED_TURNS=
|
||
|
||
# 事件告警监控(schedule 模式后台轮询;触发后复用已配置通知渠道)
|
||
# 兼容性说明:本节仅新增告警规则配置,不会修改模型名、provider、Base URL、LiteLLM 或 LLM 配置语义;回退只需关闭/移除事件监控配置。
|
||
# legacy JSON 仅支持三类 single-symbol 基础规则;技术指标、自选股、持仓/账户、大盘红绿灯规则请使用 Web/API 告警中心配置。
|
||
# legacy JSON 支持规则:
|
||
# price_cross — 价格突破阈值,direction: above / below,字段: price
|
||
# price_change_percent — 涨跌幅阈值,direction: up / down,字段: change_pct(单位:%)
|
||
# volume_spike — 成交量放大,字段: multiplier(相对近 20 日均量倍数)
|
||
# AGENT_EVENT_MONITOR_ENABLED=false
|
||
# AGENT_EVENT_MONITOR_INTERVAL_MINUTES=5
|
||
# AGENT_EVENT_ALERT_RULES_JSON=[{"stock_code":"600519","alert_type":"price_cross","direction":"above","price":1800},{"stock_code":"300750","alert_type":"price_change_percent","direction":"down","change_pct":3.0},{"stock_code":"000858","alert_type":"volume_spike","multiplier":2.5}]
|
||
# ====== 钉钉机器人 (DingTalk) ======
|
||
# 钉钉群机器人的 Webhook URL
|
||
DINGTALK_WEBHOOK_URL=
|
||
# 钉钉机器人的加签密钥 (SEC 开头的字符串),如果未开启加签可为空
|
||
DINGTALK_SECRET=
|
||
# ===================================
|
||
# 通知渠道配置(可同时配置多个,全部推送)
|
||
# ===================================
|
||
#
|
||
# 【方式一】企业微信机器人
|
||
# 在企业微信群 -> 设置 -> 群机器人 -> 添加 -> 复制 Webhook 地址
|
||
#
|
||
# WECHAT_WEBHOOK_URL=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key_here
|
||
#
|
||
# 【方式二】飞书机器人(二选一)
|
||
#
|
||
# 方式 2a — 群自定义机器人 Webhook
|
||
# 在飞书群 -> 设置 -> 群机器人 -> 添加机器人 -> 自定义机器人 -> 复制 Webhook 地址
|
||
#
|
||
# FEISHU_WEBHOOK_URL=https://open.feishu.cn/open-apis/bot/v2/hook/your_key_here
|
||
# 如果机器人安全设置开启了“签名校验”,需同步填写 secret
|
||
# FEISHU_WEBHOOK_SECRET=your_feishu_webhook_secret
|
||
# 如果机器人安全设置开启了“关键词”,需填写同一个关键词;系统会自动在每条消息前补上
|
||
# FEISHU_WEBHOOK_KEYWORD=股票日报
|
||
#
|
||
# 方式 2b — 飞书应用机器人(App Bot)推送
|
||
# 在飞书开放平台创建应用,开启 im:message 权限并发布。
|
||
#
|
||
# 群聊模式(推荐):将机器人拉入目标群,从群设置中获取 chat_id
|
||
# FEISHU_APP_ID=cli_xxxxxxxxxxxxx
|
||
# FEISHU_APP_SECRET=your_app_secret
|
||
# FEISHU_CHAT_ID=oc_xxxxxxxxxxxxx
|
||
# FEISHU_RECEIVE_ID_TYPE=chat_id
|
||
#
|
||
# 私聊模式:直接给指定用户发私信。用户的 open_id 从机器人事件或联系人 API 获取。
|
||
# FEISHU_APP_ID=cli_xxxxxxxxxxxxx
|
||
# FEISHU_APP_SECRET=your_app_secret
|
||
# FEISHU_CHAT_ID=ou_xxxxxxxxxxxxx
|
||
# FEISHU_RECEIVE_ID_TYPE=open_id
|
||
# FEISHU_DOMAIN=feishu # 域名: feishu(飞书国内) / lark(国际版 larksuite.com)
|
||
#
|
||
# 【方式三】Telegram 机器人(需同时配置两项)
|
||
# 1. 在 Telegram 找 @BotFather -> /newbot -> 获取 Bot Token
|
||
# 2. 获取 Chat ID:发消息给 @userinfobot 或访问 https://api.telegram.org/bot<token>/getUpdates
|
||
#
|
||
# TELEGRAM_BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz
|
||
# TELEGRAM_CHAT_ID=123456789
|
||
# TELEGRAM_MESSAGE_THREAD_ID=2780
|
||
#
|
||
# 【方式四】邮件推送(只需 2 项配置,SMTP 自动识别)
|
||
# 支持 QQ邮箱、163邮箱、Gmail 等支持 SMTP 授权码/基础认证的邮箱
|
||
# Outlook / Exchange 若租户强制 OAuth2,当前版本暂不支持
|
||
# 1. 获取授权码(以QQ邮箱为例):设置 -> 账户 -> POP3/SMTP服务 -> 开启 -> 获取授权码
|
||
# 2. 填写下面两项即可:
|
||
#
|
||
# EMAIL_SENDER=
|
||
# EMAIL_PASSWORD=
|
||
# EMAIL_RECEIVERS=receiver@example.com # 可选,留空则发给自己
|
||
#
|
||
# 【方式四扩展】股票分组发往不同邮箱(Issue #268,可选)
|
||
# STOCK_LIST 决定实际分析范围;STOCK_GROUP_N 仅决定邮件发给谁,建议始终写成 STOCK_LIST 的子集
|
||
# Telegram / 企业微信 / Webhook 等其他渠道仍会按完整 STOCK_LIST 推送,不会因为分组而拆分
|
||
# 当前仓库默认 GitHub Actions daily_analysis workflow 不会自动注入任意编号的 STOCK_GROUP_N / EMAIL_GROUP_N
|
||
# 因此该能力适用于本地 .env、Docker,或其他已显式注入这些变量的运行环境
|
||
# STOCK_GROUP_1=600519,300750
|
||
# EMAIL_GROUP_1=user1@example.com
|
||
# STOCK_GROUP_2=002594,AAPL
|
||
# EMAIL_GROUP_2=user2@example.com
|
||
#
|
||
# 【方式五】自定义 Webhook(支持多个,逗号分隔)
|
||
# 适用于:钉钉、Discord、Slack、Bark、自建服务等任意支持 POST JSON 的 Webhook
|
||
# 系统会自动识别常见服务并使用对应格式
|
||
#
|
||
# CUSTOM_WEBHOOK_URLS=https://oapi.dingtalk.com/robot/send?access_token=xxx,https://hooks.slack.com/services/xxx
|
||
# CUSTOM_WEBHOOK_BEARER_TOKEN= # 可选,用于需要认证的 Webhook (Header Authorization: Bearer <token>)
|
||
# CUSTOM_WEBHOOK_BODY_TEMPLATE= # 可选,全局 JSON body 模板,会覆盖 Bark/Slack/Discord 等自动 payload;推荐 $content_json/$title_json
|
||
# Docker Compose 手写 .env 时请写成 $$content_json/$$title_json;Web 设置页会自动转义,运行时仍还原为单个 $
|
||
# WEBHOOK_VERIFY_SSL=true # 默认校验;影响读取该配置的 webhook-style HTTPS 通知请求。设为 false 可支持自签名证书。警告:禁用后存在 MITM 劫持风险,仅限可信内网
|
||
#
|
||
# 【方式六】Pushover 配置
|
||
# 注册Pushover账号,并创建应用Token https://pushover.net/apps/build
|
||
# PUSHOVER_USER_KEY=
|
||
# PUSHOVER_API_TOKEN=
|
||
#
|
||
# 【方式六扩展】ntfy 配置
|
||
# NTFY_URL 必须包含 topic path,例如 https://ntfy.sh/my-topic 或 https://self-hosted:port/my-topic
|
||
# 系统会解析 topic,并使用 ntfy JSON publish API 发送 Markdown 文本。
|
||
# NTFY_URL=
|
||
# NTFY_TOKEN= # 可选,用于需要 Bearer Token 的 topic 或自建 ntfy server
|
||
#
|
||
# 【方式六扩展】Gotify 配置
|
||
# GOTIFY_URL 是 Gotify server base URL,不包含 /message;系统会拼接 /message 并用 X-Gotify-Key Header 发送 token。
|
||
# GOTIFY_URL=
|
||
# GOTIFY_TOKEN= # Gotify application token
|
||
#
|
||
# 【方式七】PushPlus 配置(国内推送服务,推荐)
|
||
# 注册PushPlus账号并获取Token https://www.pushplus.plus
|
||
# PUSHPLUS_TOKEN=
|
||
# 群组推送:填写群组编码后,消息推送给群组所有订阅用户(一对多)
|
||
# PUSHPLUS_TOPIC=
|
||
#
|
||
# 【方式八】Discord 配置
|
||
# 支持两种方式:Webhook(推荐,配置简单)和 Bot API(权限高)
|
||
#
|
||
# 方式1:Discord Webhook(推荐,无需 Bot 账号)
|
||
# 在 Discord 频道设置 -> 集成 -> Webhook -> 新建 Webhook -> 复制 URL
|
||
# DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/your_webhook_id/your_webhook_token
|
||
#
|
||
# 方式2:Discord Bot API(需要 Bot 账号和频道 ID)
|
||
# 1. 创建 Bot:https://discord.com/developers/applications -> 新建应用 -> Bot -> 创建 Bot
|
||
# 2. 获取 Bot Token:Bot 页面 -> 重置 Token
|
||
# 3. 获取频道 ID:Discord 开启开发者模式 -> 右键频道 -> 复制 ID
|
||
# DISCORD_BOT_TOKEN=
|
||
# DISCORD_MAIN_CHANNEL_ID=
|
||
# DISCORD_CHANNEL_ID= # 兼容旧变量名,推荐改用 DISCORD_MAIN_CHANNEL_ID
|
||
# DISCORD_MAX_WORDS=2000 # Discord 单条 content 上限为 2000;运行时会自动截到不超过 2000 并分片发送长报告
|
||
# 如果你要接收 Discord Interaction / Webhook 回调,必须配置公钥用于验签
|
||
# 获取方式:Discord Developer Portal -> General Information -> Public Key
|
||
# DISCORD_INTERACTIONS_PUBLIC_KEY=
|
||
#
|
||
# 【方式九】Slack 配置
|
||
# 支持两种方式:Bot API(推荐)和 Incoming Webhook
|
||
# 同时配置时优先使用 Bot API,确保文本与图片发送到同一频道。
|
||
#
|
||
# 方式1:Slack Bot API(推荐,支持图片上传)
|
||
# 1. 创建 Slack App:https://api.slack.com/apps -> Create New App
|
||
# 2. 添加 Bot Token Scopes:chat:write, files:write
|
||
# 3. 安装到工作区并获取 Bot Token (xoxb-...)
|
||
# 4. 获取频道 ID:频道详情 -> 底部复制频道 ID
|
||
# SLACK_BOT_TOKEN=xoxb-...
|
||
# SLACK_CHANNEL_ID=C01234567
|
||
#
|
||
# 方式2:Slack Incoming Webhook(配置简单,不支持图片上传)
|
||
# 在 Slack App 管理页面创建 Incoming Webhook -> 复制 URL
|
||
# SLACK_WEBHOOK_URL=https://hooks.slack.com/services/T.../B.../xxx
|
||
#
|
||
# 【方式十】Server酱3 配置(国内推送服务,支持微信推送)
|
||
# 注册Server酱3账号并获取SendKey https://sc3.ft07.com/
|
||
# SERVERCHAN3_SENDKEY=
|
||
#
|
||
# 【方式十一】AstrBot 配置
|
||
# ASTRBOT_URL=
|
||
# ASTRBOT_TOKEN= # 可选,用于需要 Bearer Token 的 AstrBot Webhook
|
||
#
|
||
# 【高级配置】消息长度限制(字节)
|
||
# 超过限制会自动分批发送,一般无需修改
|
||
# FEISHU_MAX_BYTES=20000 # 飞书限制约 20KB,默认 20000 字节
|
||
# FEISHU_SEND_AS_FILE=false # 设为 true 时,飞书以文件形式发送报告(App Bot 模式),默认文字消息
|
||
# WECHAT_MAX_BYTES=4000 # 企业微信限制 4096 字节,默认 4000 字节
|
||
#
|
||
# 【Markdown 转图片】(Issue #455)
|
||
# 对不支持 Markdown 的渠道,将报告转为图片发送,提升可读性
|
||
# 单股推送 + 图片:需同时配置 MARKDOWN_TO_IMAGE_CHANNELS 且安装转图工具
|
||
# MARKDOWN_TO_IMAGE_CHANNELS=telegram,wechat,custom,email,slack # 逗号分隔
|
||
# MARKDOWN_TO_IMAGE_MAX_CHARS=15000 # 超过此长度不转换,避免超大图片
|
||
# MD2IMG_ENGINE=wkhtmltoimage # wkhtmltoimage(默认) | markdown-to-file | playwright(需 Web 依赖和 npx playwright install chromium)
|
||
# 分享图默认展示仓库内置小红书二维码和昵称 @霸天土小豆;以下配置可整体替换品牌信息
|
||
# SHARE_IMAGE_XIAOHONGSHU_URL=
|
||
# SHARE_IMAGE_XIAOHONGSHU_HANDLE=@霸天土小豆 # 全部配置留空时显示内置昵称
|
||
# SHARE_IMAGE_XIAOHONGSHU_QR_PATH=assets/my-xiaohongshu-qr.png # 全部配置留空时使用内置二维码
|
||
# 转图工具:wkhtmltopdf (apt install wkhtmltopdf / brew install wkhtmltopdf),或 markdown-to-file
|
||
#
|
||
# 【通知路由策略】(Issue #1200 P3)
|
||
# 默认留空:该类型通知发送到所有已配置渠道。填写后仅发送到列出的已配置渠道。
|
||
# 允许值:wechat,dingtalk,feishu,telegram,email,pushover,ntfy,gotify,pushplus,serverchan3,custom,discord,slack,astrbot
|
||
# NOTIFICATION_REPORT_CHANNELS=
|
||
# NOTIFICATION_ALERT_CHANNELS=
|
||
# NOTIFICATION_SYSTEM_ERROR_CHANNELS=
|
||
#
|
||
# 【通知降噪机制】(Issue #1200 P4)
|
||
# 默认全部关闭;仅影响静态通知渠道,不影响机器人触发会话回执。
|
||
# NOTIFICATION_DEDUP_TTL_SECONDS=0 # 同一稳定去重 key 在 TTL 内只发送一次;0 关闭
|
||
# NOTIFICATION_COOLDOWN_SECONDS=0 # 同一冷却 key 在窗口内限频;0 关闭
|
||
# NOTIFICATION_QUIET_HOURS= # 静默时段,格式 HH:MM-HH:MM,支持跨午夜
|
||
# NOTIFICATION_TIMEZONE= # 静默时段时区,如 Asia/Shanghai;留空跟随 TZ/系统本地时区
|
||
# NOTIFICATION_MIN_SEVERITY= # info,warning,error,critical;留空保持现状
|
||
# NOTIFICATION_DAILY_DIGEST_ENABLED=false # 预留配置;当前不会发送每日摘要
|
||
#
|
||
# 【实时行情预取】(Issue #455)
|
||
# PREFETCH_REALTIME_QUOTES=true # 设为 false 可禁用,避免 efinance/akshare_em 全市场拉取;tushare 为单股接口,预取仅拉首股
|
||
|
||
# ===================================
|
||
# 单股推送配置(可选)
|
||
# ===================================
|
||
# 单股推送模式:每分析完一只股票立即推送,而不是汇总后推送
|
||
# SINGLE_STOCK_NOTIFY=false
|
||
#
|
||
# 报告类型:simple(精简)、full(完整)、brief(3-5句概括)
|
||
# Docker环境下如果推送内容不完整,可以设置为 full
|
||
# REPORT_TYPE=simple
|
||
# 报告输出语言:zh(中文,默认) / en(英文) / ko(韩文)
|
||
# REPORT_LANGUAGE=zh
|
||
# 仅分析结果摘要:设为 true 时只推送汇总,不含个股详情
|
||
# REPORT_SUMMARY_ONLY=false
|
||
# 通知报告底部显示本次分析使用的 LLM 模型名称;设为 false 可隐藏
|
||
# REPORT_SHOW_LLM_MODEL=true
|
||
#
|
||
# Report Engine P0 (Jinja2 / 完整性校验 / 历史对比)
|
||
# REPORT_TEMPLATES_DIR=templates
|
||
# REPORT_RENDERER_ENABLED=false
|
||
# REPORT_INTEGRITY_ENABLED=true
|
||
# REPORT_INTEGRITY_RETRY=1
|
||
# REPORT_HISTORY_COMPARE_N=0
|
||
|
||
# 个股分析与大盘复盘合并推送(默认 false),减少邮件数量、降低垃圾邮件风险
|
||
# MERGE_EMAIL_NOTIFICATION=false
|
||
|
||
# ===================================
|
||
# 分析间隔配置(可选)
|
||
# ===================================
|
||
# 个股分析和大盘分析之间的延迟时间(秒)
|
||
# 用于避免触发 Gemini 等 AI API 的限流
|
||
# ANALYSIS_DELAY=0
|
||
|
||
# 应用 AppKey(与 Webhook 模式共用)
|
||
DINGTALK_APP_KEY=xxxx
|
||
# 应用 AppSecret(与 Webhook 模式共用)
|
||
DINGTALK_APP_SECRET=xxxx
|
||
# 启用 Stream 模式
|
||
DINGTALK_STREAM_ENABLED=false
|
||
|
||
# 飞书应用配置(用于 App Bot 主动推送 / Stream Bot / 云文档;不会直接开启群 Webhook 推送)
|
||
FEISHU_APP_ID=xxxx
|
||
FEISHU_APP_SECRET=xxxx # App Bot 主动推送还需 FEISHU_CHAT_ID;简单群推送优先使用 FEISHU_WEBHOOK_URL
|
||
# App Bot 主动推送目标;Stream Bot 或云文档不需要此项
|
||
# FEISHU_CHAT_ID=oc_xxxxxxxxxxxxx
|
||
# FEISHU_RECEIVE_ID_TYPE=chat_id
|
||
# 启用长连接模式
|
||
FEISHU_STREAM_ENABLED=false
|
||
# 飞书群机器人 Webhook 安全配置(仅 Webhook 推送模式使用)
|
||
# FEISHU_WEBHOOK_SECRET=your_feishu_webhook_secret
|
||
# FEISHU_WEBHOOK_KEYWORD=股票日报
|
||
|
||
# 数据库路径
|
||
DATABASE_PATH=./data/stock_analysis.db
|
||
# SQLite 写入优化:文件库默认启用 WAL,降低批量写入和并发回写时的锁竞争
|
||
SQLITE_WAL_ENABLED=true
|
||
# SQLite 等锁超时(毫秒)
|
||
SQLITE_BUSY_TIMEOUT_MS=5000
|
||
# SQLite 遇到 database is locked / database table is locked 时的最大重试次数
|
||
SQLITE_WRITE_RETRY_MAX=3
|
||
# SQLite 写入重试基础退避时间(秒,按指数退避递增)
|
||
SQLITE_WRITE_RETRY_BASE_DELAY=0.1
|
||
|
||
# 分析历史快照:设为 false 时不持久化整份 context_snapshot
|
||
# 包括 enhanced_context、market_phase_summary、AnalysisContextPack overview、diagnostics 和 raw snapshot 字段
|
||
SAVE_CONTEXT_SNAPSHOT=true
|
||
|
||
# ===================================
|
||
# 回测配置(可选)
|
||
# ===================================
|
||
# 是否启用回测(true/false)
|
||
BACKTEST_ENABLED=true
|
||
# 回测评估窗口(交易日数)
|
||
BACKTEST_EVAL_WINDOW_DAYS=10
|
||
# 仅回测 N 天前的分析记录(避免当天/最近数据不完整)
|
||
BACKTEST_MIN_AGE_DAYS=14
|
||
# 回测引擎版本(当回测逻辑升级时用于区分结果)
|
||
BACKTEST_ENGINE_VERSION=v1
|
||
# 中性区间阈值(%),例如 2 表示 -2%~+2% 视为震荡
|
||
BACKTEST_NEUTRAL_BAND_PCT=2.0
|
||
|
||
# === 定时任务配置 ===
|
||
# 是否启用定时任务(true/false)
|
||
SCHEDULE_ENABLED=false
|
||
# 每日执行时间(HH:MM 格式,24小时制)
|
||
SCHEDULE_TIME=18:00
|
||
# 多时间执行列表(逗号分隔,留空时使用 SCHEDULE_TIME)
|
||
SCHEDULE_TIMES=
|
||
# Web/API runtime scheduler 单次分析硬超时(秒,最小 60 秒)
|
||
DSA_RUNTIME_SCHEDULER_TIMEOUT_SECONDS=2700
|
||
# 定时模式启动时是否立即执行一次分析(true/false)
|
||
# 若未显式设置,定时模式会沿用 RUN_IMMEDIATELY 的运行时覆盖语义以兼容旧配置
|
||
SCHEDULE_RUN_IMMEDIATELY=true
|
||
# 非定时模式启动时是否立即执行一次分析(true/false)
|
||
RUN_IMMEDIATELY=true
|
||
# 是否启用大盘复盘(true/false)
|
||
MARKET_REVIEW_ENABLED=true
|
||
# 是否将大盘环境摘要注入个股分析 Prompt 并启用保守护栏(true/false,默认开启)
|
||
DAILY_MARKET_CONTEXT_ENABLED=true
|
||
# 大盘复盘市场区域:cn(A股)、hk(港股)、us(美股)、jp(日股)、kr(韩股)、both(全部市场);
|
||
# 支持逗号子集(如 cn,us,kr);非法值/空值会回退为 cn。cn/hk/us/jp/kr 适合仅关注对应单区域的用户
|
||
# MARKET_REVIEW_REGION=cn
|
||
# 大盘复盘指数涨跌颜色:green_up=绿涨红跌(默认),red_up=红涨绿跌
|
||
# MARKET_REVIEW_COLOR_SCHEME=green_up
|
||
|
||
# ===================================
|
||
# 代理配置(可选)
|
||
# ===================================
|
||
# 是否启用代理(true/false,默认 false)
|
||
# 仅在本地开发环境生效,GitHub Actions 环境自动跳过
|
||
USE_PROXY=false
|
||
# 代理服务器地址(默认 127.0.0.1)
|
||
PROXY_HOST=127.0.0.1
|
||
# 代理服务器端口(默认 10809)
|
||
PROXY_PORT=10809
|
||
|
||
# 系统配置
|
||
# 日志目录
|
||
LOG_DIR=./logs
|
||
# 日志级别(DEBUG/INFO/WARNING/ERROR)
|
||
LOG_LEVEL=INFO
|
||
# LiteLLM 内部日志级别(DEBUG/INFO/WARNING/ERROR/CRITICAL;默认 WARNING;排查内部流式/路由细节时可临时设为 DEBUG)
|
||
# LITELLM_LOG_LEVEL=WARNING
|
||
# 最大并发线程数(建议保持低并发防封禁)
|
||
MAX_WORKERS=3
|
||
# 是否启用调试日志
|
||
DEBUG=false
|
||
|
||
# ===================================
|
||
# WebUI 配置(可选)
|
||
# ===================================
|
||
# 是否默认启动 WebUI(true/false,默认 false)
|
||
WEBUI_ENABLED=false
|
||
# WebUI 监听地址(默认 127.0.0.1;Docker/云服务器需设为 0.0.0.0 才能外网访问,详见 docs/deploy-webui-cloud.md)
|
||
WEBUI_HOST=127.0.0.1
|
||
# WebUI 监听端口(默认 8000)
|
||
WEBUI_PORT=8000
|
||
# 启动 Web 服务前是否自动构建前端(npm install && npm run build,默认 true)
|
||
WEBUI_AUTO_BUILD=true
|
||
# 单层可信反向代理(如 Nginx → App)下信任 X-Forwarded-For 获取真实 IP,取最右值用于登录限流;多级代理/CDN 场景限流 key 可能退化为边缘代理 IP,需额外评估;直连公网时保持 false 防伪造
|
||
# TRUST_X_FORWARDED_FOR=false
|
||
|
||
# ===================================
|
||
# Web 登录认证(可选)
|
||
# ===================================
|
||
# 设为 true 启用密码保护;首次访问时在网页设置初始密码,可在「系统设置 > 修改密码」中修改
|
||
# 忘记密码可在服务器执行: python -m src.auth reset_password
|
||
ADMIN_AUTH_ENABLED=false
|
||
# ADMIN_SESSION_MAX_AGE_HOURS=24 # Session 有效期(小时)
|
||
|
||
# ===========================================
|
||
# 图片识别股票代码(设置页「从图片添加」)
|
||
# ===========================================
|
||
# 单次请求超时 60 秒;图片最大 5MB
|
||
# 需配置 GEMINI_API_KEY、ANTHROPIC_API_KEY 或 OPENAI_API_KEY 中至少一个(Vision 能力模型)
|
||
|
||
# ===========================================
|
||
# Data Fetcher Priority Configuration
|
||
# ===========================================
|
||
# Lower number = higher priority (tried first)
|
||
# Default priorities: efinance(0) > akshare(1) > tushare/pytdx(2) > baostock(3) > yfinance(4) > tencent(5)
|
||
# 上述优先级仅控制普通 A 股日 K 通用链路。
|
||
# IndexRegistry 已登记的沪深指数(当前为 sh000016、sh000688、sz399001、sz399006、sh000300)
|
||
# 固定按 Tencent > AkShare > TickFlow > YFinance 尝试,不读取这些 *_PRIORITY 配置;未配置或不可用的来源会跳过。
|
||
# 只有显式市场输入(如 sh000016 或 000016.SH)会触发指数链;裸 000016 仍按股票处理。
|
||
# For US stocks, set YFINANCE_PRIORITY=0 to use Yahoo Finance first
|
||
|
||
# EFINANCE_PRIORITY=0 # EastMoney (China) - default: 0
|
||
# EFINANCE_CALL_TIMEOUT=30 # Timeout (seconds) for efinance API calls; prevents indefinite hangs
|
||
# # when eastmoney hosts are unreachable. Default: 30
|
||
# AKSHARE_PRIORITY=1 # AkShare (China) - default: 1
|
||
# TUSHARE_PRIORITY=2 # Tushare Pro (China) - default: 2
|
||
# TICKFLOW_PRIORITY=2 # TickFlow(普通 A 股日 K)- 默认:2;可选,需配置 TICKFLOW_API_KEY
|
||
# PYTDX_PRIORITY=2 # Tongdaxin (China) - default: 2
|
||
#
|
||
# Pytdx custom server (for intranet/deploy): use custom host instead of built-in public servers
|
||
# PYTDX_HOST=192.168.1.100
|
||
# PYTDX_PORT=7709
|
||
# Or multiple servers: PYTDX_SERVERS=ip1:port1,ip2:port2
|
||
# BAOSTOCK_PRIORITY=3 # Baostock (China) - default: 3
|
||
# YFINANCE_PRIORITY=4 # Yahoo Finance (Global) - default: 4
|
||
# TENCENT_PRIORITY=5 # Tencent direct daily K-line - ordinary A-share last-resort
|
||
# # fallback. Registered indices ignore this value. Default: 5
|
||
|
||
# Example: Prioritize Yahoo Finance for US stocks
|
||
# YFINANCE_PRIORITY=0
|
||
# EFINANCE_PRIORITY=99
|
||
|
||
# ===========================================
|
||
# 实时行情数据源优先级配置
|
||
# ===========================================
|
||
# 用于获取量比、换手率、市盈率等实时数据
|
||
# 可选数据源(逗号分隔,按顺序尝试):
|
||
# - tencent: 腾讯财经,有量比/换手率/PE/PB,单股查询稳定(推荐首选)
|
||
# - akshare_sina: 新浪财经,基本行情,无量比,但非常稳定
|
||
# - efinance: 东财(efinance库),有量比,全量拉取易被封
|
||
# - akshare_em: 东财(akshare库),数据最全,全量拉取易被封
|
||
# - tickflow: TickFlow,可选;排在优先级前两位时支持按当前标的批量预取
|
||
# - tushare: Tushare Pro,需要2000积分,数据全面(付费用户推荐)
|
||
#
|
||
# 默认优先级:tencent > akshare_sina > efinance > akshare_em
|
||
# 如果有 Tushare Pro 高积分账号,可将 tushare 放在首位:
|
||
# REALTIME_SOURCE_PRIORITY=tickflow,tencent,akshare_sina,efinance,akshare_em
|
||
# REALTIME_SOURCE_PRIORITY=tushare,tencent,akshare_sina,efinance,akshare_em
|
||
# REALTIME_SOURCE_PRIORITY=tencent,akshare_sina,efinance,akshare_em
|
||
|
||
# 是否启用实时行情(关闭后使用历史收盘价分析)
|
||
# ENABLE_REALTIME_QUOTE=true
|
||
|
||
# 盘中实时技术面:启用时用实时价计算 MA/多头排列(Issue #234);关闭则用昨日收盘
|
||
# ENABLE_REALTIME_TECHNICAL_INDICATORS=true
|
||
|
||
# 是否启用筹码分布(该接口不稳定,云端部署建议关闭)
|
||
# ENABLE_CHIP_DISTRIBUTION=true
|
||
|
||
# 是否启用基本面聚合(新增 P0 能力)
|
||
# ENABLE_FUNDAMENTAL_PIPELINE=true
|
||
|
||
# 基本面聚合性能与稳定性参数(单位:秒)
|
||
# FUNDAMENTAL_STAGE_TIMEOUT_SECONDS=8.0
|
||
# FUNDAMENTAL_FETCH_TIMEOUT_SECONDS=8.0
|
||
# FUNDAMENTAL_RETRY_MAX=1
|
||
# FUNDAMENTAL_CACHE_TTL_SECONDS=120
|
||
# FUNDAMENTAL_CACHE_MAX_ENTRIES=256
|
||
|
||
# ===========================================
|
||
# Portfolio P0: 导入 / 风险 / 汇率降级配置
|
||
# ===========================================
|
||
# PORTFOLIO_RISK_CONCENTRATION_ALERT_PCT=35.0
|
||
# PORTFOLIO_RISK_DRAWDOWN_ALERT_PCT=15.0
|
||
# PORTFOLIO_RISK_STOP_LOSS_ALERT_PCT=10.0
|
||
# PORTFOLIO_RISK_STOP_LOSS_NEAR_RATIO=0.8
|
||
# PORTFOLIO_RISK_LOOKBACK_DAYS=180
|
||
# PORTFOLIO_FX_UPDATE_ENABLED=true
|
||
|
||
# 东财接口补丁:东财/Efinance/Akshare 东方财富接口频繁失败(RemoteDisconnected、连接被关闭)时建议开启
|
||
# 开启后会注入 NID 令牌与随机 User-Agent,降低被东财限流概率
|
||
# ENABLE_EASTMONEY_PATCH=false
|