Record news signals forward for a no-trade edge test

The trader labels crypto news published after 2026-10-16 15:00 with
the configured model (category and BTC direction) and, four hours
later, backfills BTC/ETH 1m opens at publish, +5m, +1h and +4h from
the klines table. A drawer on the trading page shows the cumulative
returns of trading the labelled direction, after fees. Nothing is
traded; this only collects an out-of-sample record.
This commit is contained in:
eezd committed 2026-10-16 14:47:06 +08:00
1 parent 0397e30870
commit 23a9a5175e
11 files changed
+537 -7

No files matched your search

+2 -1
View File
@@ -2,7 +2,7 @@ from alphapulse.core.db import Base
from alphapulse.models.ai import AiProvider, ChatMessage, ChatSession, ContextVersion, SkillNode, SkillVersion
from alphapulse.models.market import Kline, KlineSyncState, MarketSymbol
from alphapulse.models.news import CrawlLog, CrawlRun, NewsItem, NewsRevision, RawBody, RawResponse, Source
from alphapulse.models.trading import TradingAccount, TradingAnalysis, TradingEvent, TradingFill, TradingOrder, TradingSymbol
from alphapulse.models.trading import NewsSignal, TradingAccount, TradingAnalysis, TradingEvent, TradingFill, TradingOrder, TradingSymbol
__all__ = [
"AiProvider",
@@ -16,6 +16,7 @@ __all__ = [
"KlineSyncState",
"MarketSymbol",
"NewsItem",
"NewsSignal",
"NewsRevision",
"RawBody",
"RawResponse",
+16
View File
@@ -145,3 +145,19 @@ class TradingFill(Base):
commission: Mapped[Decimal] = mapped_column(Numeric)
commission_asset: Mapped[str] = mapped_column(String(16))
time: Mapped[datetime] = mapped_column(DateTime(timezone=True))
class NewsSignal(Base):
"""新闻信号前向记录:加密相关新闻的模型标注,以及发布后 BTC/ETH 的价格,检验按标注方向交易是否有优势。只记录,不下单"""
__tablename__ = "news_signals"
news_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("news_items.id"), primary_key=True)
# price_report(行情播报)/ event(事件)/ irrelevant(与币价无关)
category: Mapped[str] = mapped_column(String(16))
# 对 BTC 短期(几小时)的影响:bullish / bearish / neutral
direction: Mapped[str] = mapped_column(String(8))
model: Mapped[str] = mapped_column(String(64))
labeled_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
# 发布 4 小时后回填的 1m 开盘价:{symbol: {"open": 发布所在分钟, "entry": +5 分钟, "1h": +65 分钟, "4h": +245 分钟}};为空表示尚未回填
prices: Mapped[dict | None] = mapped_column(JSONB)