update UI width parameter and add stock info fetching methods
This commit is contained in:
parent
c8d80ff6a7
commit
1099885804
@ -381,7 +381,7 @@ def render_backtest_review() -> None:
|
|||||||
title="风险事件分布",
|
title="风险事件分布",
|
||||||
)
|
)
|
||||||
agg_fig.update_layout(height=320, margin=dict(l=10, r=10, t=40, b=20))
|
agg_fig.update_layout(height=320, margin=dict(l=10, r=10, t=40, b=20))
|
||||||
st.plotly_chart(agg_fig, use_container_width=True)
|
st.plotly_chart(agg_fig, width="stretch")
|
||||||
except Exception: # noqa: BLE001
|
except Exception: # noqa: BLE001
|
||||||
LOGGER.debug("绘制风险事件分布失败", extra=LOG_EXTRA)
|
LOGGER.debug("绘制风险事件分布失败", extra=LOG_EXTRA)
|
||||||
except Exception: # noqa: BLE001
|
except Exception: # noqa: BLE001
|
||||||
|
|||||||
@ -274,7 +274,7 @@ def render_factor_calculation() -> None:
|
|||||||
|
|
||||||
if df_data:
|
if df_data:
|
||||||
df = pd.DataFrame(df_data)
|
df = pd.DataFrame(df_data)
|
||||||
st.dataframe(df.head(100), use_container_width=True) # 只显示前100条
|
st.dataframe(df.head(100), width="stretch") # 只显示前100条
|
||||||
st.info(f"共 {len(df_data)} 条因子记录(显示前100条)")
|
st.info(f"共 {len(df_data)} 条因子记录(显示前100条)")
|
||||||
else:
|
else:
|
||||||
st.info("没有找到因子计算结果")
|
st.info("没有找到因子计算结果")
|
||||||
|
|||||||
@ -194,10 +194,10 @@ def render_market_visualization() -> None:
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
fig.update_layout(title=f"{ts_code} K线图", xaxis_title="日期", yaxis_title="价格")
|
fig.update_layout(title=f"{ts_code} K线图", xaxis_title="日期", yaxis_title="价格")
|
||||||
st.plotly_chart(fig, use_container_width=True)
|
st.plotly_chart(fig, width="stretch")
|
||||||
|
|
||||||
fig_vol = px.bar(df, x="trade_date", y="vol", title="成交量")
|
fig_vol = px.bar(df, x="trade_date", y="vol", title="成交量")
|
||||||
st.plotly_chart(fig_vol, use_container_width=True)
|
st.plotly_chart(fig_vol, width="stretch")
|
||||||
|
|
||||||
df_ma = df.copy()
|
df_ma = df.copy()
|
||||||
df_ma["MA5"] = df_ma["close"].rolling(window=5).mean()
|
df_ma["MA5"] = df_ma["close"].rolling(window=5).mean()
|
||||||
@ -205,6 +205,6 @@ def render_market_visualization() -> None:
|
|||||||
df_ma["MA60"] = df_ma["close"].rolling(window=60).mean()
|
df_ma["MA60"] = df_ma["close"].rolling(window=60).mean()
|
||||||
|
|
||||||
fig_ma = px.line(df_ma, x="trade_date", y=["close", "MA5", "MA20", "MA60"], title="均线对比")
|
fig_ma = px.line(df_ma, x="trade_date", y=["close", "MA5", "MA20", "MA60"], title="均线对比")
|
||||||
st.plotly_chart(fig_ma, use_container_width=True)
|
st.plotly_chart(fig_ma, width="stretch")
|
||||||
|
|
||||||
st.dataframe(df, hide_index=True, width='stretch')
|
st.dataframe(df, hide_index=True, width='stretch')
|
||||||
|
|||||||
@ -208,7 +208,7 @@ def render_stock_evaluation() -> None:
|
|||||||
st.dataframe(
|
st.dataframe(
|
||||||
result_df,
|
result_df,
|
||||||
hide_index=True,
|
hide_index=True,
|
||||||
use_container_width=True
|
width="stretch"
|
||||||
)
|
)
|
||||||
|
|
||||||
# 绘制IC均值分布
|
# 绘制IC均值分布
|
||||||
@ -237,7 +237,7 @@ def render_stock_evaluation() -> None:
|
|||||||
st.dataframe(
|
st.dataframe(
|
||||||
score_df,
|
score_df,
|
||||||
hide_index=True,
|
hide_index=True,
|
||||||
use_container_width=True
|
width="stretch"
|
||||||
)
|
)
|
||||||
|
|
||||||
# 添加入池功能
|
# 添加入池功能
|
||||||
@ -260,7 +260,12 @@ def _calculate_stock_scores(
|
|||||||
|
|
||||||
# 标准化权重
|
# 标准化权重
|
||||||
weights = np.array(factor_weights)
|
weights = np.array(factor_weights)
|
||||||
weights = weights / np.sum(np.abs(weights))
|
abs_sum = np.sum(np.abs(weights))
|
||||||
|
if abs_sum > 0: # 避免除以零
|
||||||
|
weights = weights / abs_sum
|
||||||
|
else:
|
||||||
|
# 如果所有权重都是零,则使用均匀分布
|
||||||
|
weights = np.ones_like(weights) / len(weights)
|
||||||
|
|
||||||
# 获取所有股票的因子值
|
# 获取所有股票的因子值
|
||||||
stocks = universe or broker.get_all_stocks(eval_date.strftime("%Y%m%d"))
|
stocks = universe or broker.get_all_stocks(eval_date.strftime("%Y%m%d"))
|
||||||
|
|||||||
@ -1397,6 +1397,83 @@ class DataBroker:
|
|||||||
self._coverage_cache.clear()
|
self._coverage_cache.clear()
|
||||||
LOGGER.info("数据覆盖缓存已清除", extra=LOG_EXTRA)
|
LOGGER.info("数据覆盖缓存已清除", extra=LOG_EXTRA)
|
||||||
|
|
||||||
|
def get_stock_info(self, ts_code: str, trade_date: str = None) -> Optional[Dict[str, Any]]:
|
||||||
|
"""获取股票基本信息。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ts_code: 股票代码
|
||||||
|
trade_date: 交易日期,默认为最新日期
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Dict: 股票基本信息,包含名称、行业等
|
||||||
|
"""
|
||||||
|
if not trade_date:
|
||||||
|
# 如果没有提供交易日期,使用当前日期
|
||||||
|
trade_date = datetime.now().strftime("%Y%m%d")
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 获取股票基本信息
|
||||||
|
info = self.fetch_latest(
|
||||||
|
ts_code=ts_code,
|
||||||
|
trade_date=trade_date,
|
||||||
|
fields=["stock_basic.name", "stock_basic.industry"]
|
||||||
|
)
|
||||||
|
|
||||||
|
if not info:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 添加股票代码
|
||||||
|
result = {"ts_code": ts_code}
|
||||||
|
result.update(info)
|
||||||
|
|
||||||
|
return result
|
||||||
|
except Exception as exc:
|
||||||
|
LOGGER.debug(
|
||||||
|
"获取股票信息失败 ts_code=%s err=%s",
|
||||||
|
ts_code,
|
||||||
|
exc,
|
||||||
|
extra=LOG_EXTRA
|
||||||
|
)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def fetch_latest_factor(self, ts_code: str, factor: str, eval_date: date) -> Optional[float]:
|
||||||
|
"""获取指定股票的最新因子值。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ts_code: 股票代码
|
||||||
|
factor: 因子名称
|
||||||
|
eval_date: 评估日期
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
float: 因子值,如果获取失败则返回None
|
||||||
|
"""
|
||||||
|
trade_date = eval_date.strftime("%Y%m%d")
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 构建因子字段名称
|
||||||
|
factor_field = f"factors.{factor}"
|
||||||
|
|
||||||
|
# 获取因子值
|
||||||
|
result = self.fetch_latest(
|
||||||
|
ts_code=ts_code,
|
||||||
|
trade_date=trade_date,
|
||||||
|
fields=[factor_field]
|
||||||
|
)
|
||||||
|
|
||||||
|
if not result or factor_field not in result:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return result[factor_field]
|
||||||
|
except Exception as exc:
|
||||||
|
LOGGER.debug(
|
||||||
|
"获取因子值失败 ts_code=%s factor=%s err=%s",
|
||||||
|
ts_code,
|
||||||
|
factor,
|
||||||
|
exc,
|
||||||
|
extra=LOG_EXTRA
|
||||||
|
)
|
||||||
|
return None
|
||||||
|
|
||||||
def get_data_coverage(self, start_date: str, end_date: str) -> Dict:
|
def get_data_coverage(self, start_date: str, end_date: str) -> Dict:
|
||||||
"""获取指定日期范围内的数据覆盖情况。
|
"""获取指定日期范围内的数据覆盖情况。
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user