项目文件夹

文件
2026-07-13 12:36:27 +08:00

109 行
4.1 KiB
Python

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
from __future__ import annotations
import streamlit as st
from web.services.dashboard_llm import build_llm_config
from web.services.strategy_api_service import answer_lrs_question, get_lrs_doc_markdown
from web.pages.lrs.strategy_macro import render_tab_macro
from web.pages.lrs.strategy_base_signal import render_tab_base_signal
from web.pages.lrs.strategy_validation import render_tab_validation
from web.pages.lrs.strategy_execution import render_tab_execution
from web.pages.lrs.strategy_risk import render_tab_risk
from web.pages.backtesting import render_backtest_tab
from web.pages.wheel.strategy_wheel import render_wheel_page
def _llm_answer(prompt: str) -> str:
cfg = build_llm_config(st.session_state.get("last_params"))
return answer_lrs_question(prompt, cfg)
def _render_lrs_dashboard() -> None:
st.subheader("LRS TQQQ 策略仪表盘")
st.caption('基于“当日开仓决策”框架。当前采用子 Tab 架构,优先展示宏观层。')
k1, k2, k3, k4 = st.columns(4)
k1.metric("策略模式", "LRS")
k2.metric("标的", "TQQQ")
k3.metric("决策状态", "待运行")
k4.metric("建议仓位", "N/A")
st.markdown("---")
tab_macro, tab_base, tab_valid, tab_risk, tab_exec = st.tabs([
"1) 宏观经济分析(优先)",
"2) 基础信号",
"3) 入场模式判断",
"4) 风控层(资金分配)",
"5) 执行层(下单)",
])
with tab_macro:
render_tab_macro()
with tab_base:
render_tab_base_signal()
with tab_valid:
render_tab_validation()
with tab_risk:
render_tab_risk()
with tab_exec:
render_tab_execution()
def render_strategy() -> None:
st.header("策略")
sub_strategy = str(st.session_state.get("strategy_sub_menu", "LRS TQQQ策略"))
st.caption(f"当前子策略:{sub_strategy}")
if sub_strategy == "Wheel策略":
render_wheel_page()
return
if sub_strategy != "LRS TQQQ策略":
st.info("未找到该子策略。")
return
tab_doc, tab_dashboard, tab_backtest = st.tabs(["策略文档", "策略仪表盘", "策略回测"])
with tab_doc:
left, right = st.columns([1.45, 1], gap="large")
with left:
st.markdown(get_lrs_doc_markdown())
with right:
st.markdown("#### LRS 策略问答(LLM")
st.caption("可针对 LRS 思路、参数与风控方案进行讨论。")
chat_key = "lrs_chat_messages"
if chat_key not in st.session_state:
st.session_state[chat_key] = [{
"role": "assistant",
"content": "你好,我是 LRS 策略助手。你可以问我:如何定义入场条件、如何控制回撤、如何设计回测指标。",
}]
for msg in st.session_state[chat_key]:
with st.chat_message(msg["role"]):
st.markdown(msg["content"])
user_text = st.chat_input("输入你的策略问题...", key="lrs_chat_input")
if user_text:
st.session_state[chat_key].append({"role": "user", "content": user_text})
with st.chat_message("user"):
st.markdown(user_text)
with st.chat_message("assistant"):
with st.spinner("正在生成回答..."):
try:
answer = _llm_answer(
f"你是量化策略研究助手。请围绕 LRS TQQQ 策略回答问题,要求中文、结构化、可执行。\n\n用户问题:{user_text}"
).strip()
if not answer:
answer = "我暂时没有生成有效内容,请换个问法再试。"
except Exception as exc:
answer = f"LLM 调用失败:{exc}"
st.markdown(answer)
st.session_state[chat_key].append({"role": "assistant", "content": answer})
with tab_dashboard:
_render_lrs_dashboard()
with tab_backtest:
render_backtest_tab()