| name | report-writer-agent |
| description | Automated report generator for daily, weekly, and monthly performance summaries. Creates markdown reports with trading performance, defensive wins, agent accuracy, and constitutional compliance statistics. |
| license | Proprietary |
| compatibility | Requires trading_signals, shadow_trades, proposals tables |
| metadata | {"author":"ai-trading-system","version":"1.0","category":"system","agent_role":"report_writer"} |
Report Writer Agent - ์๋ ๋ฆฌํฌํธ ์์ฑ๊ธฐ
Role
์ผ์ผ/์ฃผ๊ฐ/์๊ฐ ๊ฑฐ๋ ์ฑ๊ณผ, ๋ฐฉ์ด ์ค์ , Agent ์ ํ๋, ํ๋ฒ ์ค์์จ์ ์๋์ผ๋ก ๋ถ์ํ์ฌ ๋งํฌ๋ค์ด ๋ฆฌํฌํธ๋ฅผ ์์ฑํฉ๋๋ค.
Core Capabilities
1. Report Types
Daily Report
- ์ค๋์ ๊ฑฐ๋ ์์ฝ
- ์น/ํจ ๊ฑฐ๋
- ์ฃผ์ Signal ์ฑ๊ณผ
Weekly Report
- ์ฃผ๊ฐ ์์ต๋ฅ
- Agent๋ณ ์ ํ๋
- Shadow Trade ๋ฐฉ์ด ์ค์
- Top Performers
Monthly Report
- ์๊ฐ ์ด์ ์ฐ
- ๋ชฉํ ๋๋น ์ค์
- Sharpe Ratio, Max Drawdown
- ํ๋ฒ ์ค์์จ
- AI ์๊ธฐ ๊ฐ์ ์ ์
2. Performance Metrics
total_trades: int
winning_trades: int
losing_trades: int
win_rate: float
average_return: float
sharpe_ratio: float
max_drawdown: float
total_rejections: int
defensive_wins: int
defensive_win_rate: float
avoided_loss_usd: float
agent_accuracies: Dict[str, float]
best_performing_agent: str
worst_performing_agent: str
total_proposals: int
constitutional_violations: int
compliance_rate: float
3. Report Generation
def generate_daily_report(date: str) -> str:
"""Generate daily markdown report"""
signals = get_signals_for_date(date)
shadows = get_shadow_trades_for_date(date)
metrics = calculate_metrics(signals, shadows)
report = format_report(metrics, template='daily')
return report
Output Format
Daily Report Example
# ์ผ์ผ ๊ฑฐ๋ ๋ฆฌํฌํธ - 2025-12-21
## ๐ ๊ฑฐ๋ ์์ฝ
- **์ด Signal ์**: 5๊ฐ
- **์คํ๋ ๊ฑฐ๋**: 3๊ฐ
- **๊ฑฐ๋ถ๋ ์ ์**: 2๊ฐ (ํ๋ฒ ์๋ฐ)
## ๐ฏ Signal ์ฑ๊ณผ
| Signal ID | Ticker | Action | Source | Status | Return |
|-----------|--------|--------|--------|--------|--------|
| SIG-001 | AAPL | BUY | war_room | EXECUTED | +2.3% |
| SIG-002 | NVDA | BUY | deep_reasoning | EXECUTED | +5.1% |
| SIG-003 | TSLA | SELL | manual_analysis | EXECUTED | +1.5% |
| SIG-004 | XYZ | BUY | news_analysis | REJECTED | - |
| SIG-005 | ABC | BUY | ceo_analysis | REJECTED | - |
**์ผ์ผ ์์ต๋ฅ **: +3.0%
## ๐ก๏ธ ๋ฐฉ์ด ์ค์
### Shadow Trades (๊ฑฐ๋ถ๋ ์ ์ ์ถ์ )
| Ticker | Rejected Reason | Virtual P&L | Result |
|--------|----------------|-------------|--------|
| XYZ | ํฌ์ง์
20% ์ด๊ณผ | -$1,200 | DEFENSIVE_WIN โ
|
| ABC | Stop Loss ๋ฏธ์ค์ | +$300 | MISSED_OPPORTUNITY |
**๋ฐฉ์ด ์ฑ๊ณต**: 1๊ฑด
**ํํผํ ์์ค**: $1,200
## ๐ Agent ์ฑ๊ณผ
| Agent | Signals | Accuracy | Contribution |
|-------|---------|----------|--------------|
| War Room | 1 | 100% | Excellent |
| Deep Reasoning | 1 | 100% | Excellent |
| Manual Analysis | 1 | 100% | Good |
## โ๏ธ ํ๋ฒ ์ค์
- **์ด ์ ์**: 5๊ฐ
- **์๋ฐ ๊ฑด์**: 2๊ฐ
- **์ค์์จ**: 60%
- **์ฃผ์ ์๋ฐ**: Article 4 (ํฌ์ง์
ํ๋)
## ๐ก ์ธ์ฌ์ดํธ
1. ๋ชจ๋ ์คํ๋ ๊ฑฐ๋๊ฐ ์์ต (Win Rate 100%)
2. Shadow Trade ๋ฐฉ์ด ์ฑ๊ณต์ผ๋ก $1,200 ์์ค ํํผ
3. ํ๋ฒ ์ 4์กฐ ์๋ฐ ์ฃผ์ ํ์
---
Generated by Report Writer Agent v1.0
Weekly Report Example
# ์ฃผ๊ฐ ๊ฑฐ๋ ๋ฆฌํฌํธ - Week 51, 2025
## ๐ ์ฃผ๊ฐ ์์ฝ
- **๊ธฐ๊ฐ**: 2025-12-15 ~ 2025-12-21
- **์ด Signal**: 23๊ฐ
- **์คํ ๊ฑฐ๋**: 15๊ฐ
- **๊ฑฐ๋ถ ์ ์**: 8๊ฐ
## ๐ฏ ์ฑ๊ณผ ์งํ
| Metric | Value | Target | Status |
|--------|-------|--------|--------|
| ์ฃผ๊ฐ ์์ต๋ฅ | +4.5% | +2% | โ
์ด๊ณผ ๋ฌ์ฑ |
| Win Rate | 73% | >55% | โ
|
| Sharpe Ratio | 1.45 | >1.0 | โ
|
| Max Drawdown | -3.2% | <-5% | โ
|
## ๐ Top Performers
### Best Signals
1. **NVDA** (deep_reasoning): +12.5%
2. **AAPL** (war_room): +8.3%
3. **MSFT** (ceo_analysis): +5.7%
### Worst Signals
1. **XYZ** (news_analysis): -2.1%
2. **ABC** (manual_analysis): -1.5%
## ๐ก๏ธ ๋ฐฉ์ด ์ค์
- **์ด ๊ฑฐ๋ถ**: 8๊ฑด
- **Defensive Wins**: 6๊ฑด (75%)
- **ํํผํ ์์ค**: $5,400
- **Missed Opportunities**: 2๊ฑด (+$800)
**์ ๋ฐฉ์ด ๊ฐ์น**: $4,600
## ๐ค Agent ์ ํ๋
| Agent | Signals | Win Rate | Avg Return | Rank |
|-------|---------|----------|------------|------|
| Deep Reasoning | 5 | 80% | +6.2% | 1 |
| War Room | 6 | 83% | +5.1% | 2 |
| CEO Analysis | 3 | 67% | +3.8% | 3 |
| Manual Analysis | 4 | 50% | +2.0% | 4 |
| News Analysis | 5 | 60% | +1.5% | 5 |
## โ๏ธ ํ๋ฒ ์ค์
- **์ด ์ ์**: 23๊ฐ
- **์๋ฐ ๊ฑด์**: 8๊ฐ
- **์ค์์จ**: 65%
**์๋ฐ ๋ด์ญ**:
- Article 4 (Risk Management): 6๊ฑด
- Article 2 (Explainability): 2๊ฑด
## ๐ฐ ์๋ณธ ๋ณด์กด
- **์์ ์๋ณธ**: $100,000
- **์ข
๋ฃ ์๋ณธ**: $104,500
- **์๋ณธ ๋ณด์กด์จ**: 104.5%
- **ํ๋ฒ์ด ๋ฐฉ์ดํ ์์ค**: $5,400 (5.4%)
## ๐ ๊ถ์ฅ ์ฌํญ
1. **Article 4 ์๋ฐ ๊ฐ์**: Risk Agent ๊ฐ์ค์น ์ฆ๋
2. **News Analysis ์ ํ๋ ๊ฐ์ **: ์ ๋ขฐ๋ ๋ฎ์ ์์ค ํํฐ๋ง
3. : ๊ฐ์ฅ ๋์ ์น๋ฅ
---
Generated on 2025-12-21
Decision Framework
Step 1: Determine Report Type
- Daily: ๋น์ผ ๋ฐ์ดํฐ
- Weekly: ์ต๊ทผ 7์ผ
- Monthly: ์ต๊ทผ 30์ผ
Step 2: Fetch Data
- trading_signals
- shadow_trades
- proposals
- agent_votes
Step 3: Calculate Metrics
- Performance: Win rate, returns, Sharpe
- Defensive: Shadow trades, avoided loss
- Agent: Individual accuracy
- Constitutional: Violation rate
Step 4: Generate Insights
- Best/worst performers
- Trend analysis
- Recommendations
Step 5: Format as Markdown
- Tables for data
- Alerts for important findings
- Charts (optional, via mermaid)
Step 6: Distribute
- Save to file
- Send to Telegram
- Display on dashboard
Guidelines
Do's โ
- ๊ฐ๊ด์ ๋ฐ์ดํฐ: ์ซ์๋ก ๋งํ๊ธฐ
- ์คํ ๊ฐ๋ฅํ ์ธ์ฌ์ดํธ: ๊ตฌ์ฒด์ ๊ฐ์ ๋ฐฉ์ ์ ์
- ์๊ฐ์ ๊ตฌ์ฑ: ํ, ๊ทธ๋ํ ํ์ฉ
- ํธ๋ ๋ ๊ฐ์กฐ: ๊ฐ์ /์
ํ ์ถ์ธ ํ์
Don'ts โ
- ๊ณผ๋ํ ์นญ์ฐฌ/๋น๋ ๊ธ์ง (๊ฐ๊ด์ฑ ์ ์ง)
- ๋ฐ์ดํฐ ์กฐ์ ์ ๋ ๊ธ์ง
- ๋ถํ์ํ ๋ณต์ก์ฑ ์ง์
- ๊ฒฐ๋ก ์๋ ๋์ด ๊ธ์ง
Integration
Data Sources
from backend.database.models import TradingSignal, ShadowTrade, Proposal
from sqlalchemy import func
from datetime import datetime, timedelta
def get_weekly_performance(start_date: datetime) -> Dict:
"""Get weekly performance metrics"""
end_date = start_date + timedelta(days=7)
signals = db.query(TradingSignal).filter(
TradingSignal.created_at >= start_date,
TradingSignal.created_at < end_date
).all()
total_signals = len(signals)
executed = [s for s in signals if s.status == 'EXECUTED']
returns = [s.actual_return for s in executed if s.actual_return is not None]
win_rate = sum(1 for r in returns if r > 0) / len(returns) if returns else 0
avg_return = sum(returns) / len(returns) if returns else 0
shadows = db.query(ShadowTrade).filter(
ShadowTrade.created_at >= start_date,
ShadowTrade.created_at < end_date
).all()
defensive_wins = ( s shadows s.status == )
{
: total_signals,
: (executed),
: win_rate,
: avg_return,
: defensive_wins,
: (shadows)
}
Report Distribution
from backend.notifications.telegram_commander_bot import TelegramCommanderBot
async def send_daily_report(report_markdown: str):
"""Send report via Telegram"""
telegram = TelegramCommanderBot()
await telegram.send_message(
chat_id=os.getenv('TELEGRAM_COMMANDER_CHAT_ID'),
text=report_markdown,
parse_mode='Markdown'
)
Performance Metrics
- Report Generation Time: ๋ชฉํ < 5์ด
- Data Accuracy: 100% (DB์์ ์ง์ ๊ณ์ฐ)
- Delivery Success: > 99% (Telegram)
- User Satisfaction: ๋ฆฌํฌํธ ์ ์ฉ์ฑ ํผ๋๋ฐฑ
Mermaid Charts Example
## ์ฃผ๊ฐ ์์ต๋ฅ ์ถ์ด
```mermaid
line chart
title "Daily P&L - Week 51"
x-axis [Mon, Tue, Wed, Thu, Fri]
y-axis "Return %" -2 --> 6
line [1.2, 2.5, -0.8, 3.1, 4.5]
## Version History
- **v1.0** (2025-12-21): Initial release with daily/weekly/monthly reports