Auditability makes an AI-generated financial signal traceable: the system retains the source text and reasoning so people can ask why the model reached its conclusion. section 11.1.3
For financial LLM analysis, make outputs inspectable by:
- Preserving the source material behind each signal. section 11.1.3
- Requiring a reasoning field and normalized JSON output, then validating the response. section 11.4.2
Uranium-sector news signals
A signal for the URA ETF can draw on policy and supply news. Keeping the underlying articles and the model’s reasoning makes the assessment traceable. section 11.1.3
Listing 11.11 Building the two-step context and structured prompt
# Step 1: Build trend context from 30-day headlines
trend_headlines = []
for i in range(min(30, len(results_trend['ids'][0]))):
meta = results_trend['metadatas'][0][i]
trend_headlines.append(f"- {meta['published_dt'][:10]}: {meta['title']}")
trend_context = "\n".join(trend_headlines)
# Step 2: Build detailed context from 3-day content-rich articles
detail_docs = []
for i in range(len(results_recent['ids'][0])):
meta = results_recent['metadatas'][0][i]
doc = results_recent['documents'][0][i]
detail_docs.append(f"[{meta['published_dt'][:10]} | {meta['source']}]\n{doc}\n")
detail_context = "\n".join(detail_docs)
# Structured prompt with both contexts
prompt = f"""You are a quantitative analyst analyzing uranium sector news.
Based ONLY on the context below, provide a structured assessment.
TREND CONTEXT (30-day headlines for momentum):
{trend_context}
DETAILED ANALYSIS (last 3 days with full content):
{detail_context}
First, review the 30-day headlines to understand the dominant narrative trends.
Then, analyze the detailed recent articles to extract specific signals.
OUTPUT (JSON only):
{{
"sentiment_score": <-100 to +100, overall market sentiment>,
"supply_risk": <0 to 10, likelihood of supply disruption>,
"policy_tone": <-10 to +10, regulatory environment>,
"conviction": <0 to 10, signal strength>,
"key_events": ["event1", "event2"],
"reasoning": "brief explanation"
}}
"""
# Call LLM
response = client.chat.completions.create(
model="gpt-5-mini",
messages=[{"role": "user", "content": prompt}]
)
print("="*80)
print("LLM SIGNAL EXTRACTION")
print("="*80)
print(response.choices[0].message.content)
The prompt-building listing shows how 30-day headlines and recent articles are assembled into context for a structured assessment. section 11.4.2





