Output Formats¶
The Systematic Investment Analysis Framework generates results in multiple formats. This guide explains each format and how to use them effectively.
Available Output Formats¶
1. Text Report (Default)¶
- File:
{config_name}_{timestamp}_report.txt
- Content: Human-readable comprehensive analysis
- Use Case: Executive summary and detailed stock analysis
2. CSV Export (--save-csv)¶
- File:
{config_name}_{timestamp}_results.csv
- Content: Structured data with all metrics
- Use Case: Spreadsheet analysis, data manipulation
3. JSON Export (--save-json)¶
- File:
{config_name}_{timestamp}_data.json
- Content: Complete raw data and metadata
- Use Case: API integration, custom analysis tools
Text Report Format¶
Executive Summary Section¶
EXECUTIVE SUMMARY
================
Analysis: sp500_full_screen
Date: 2024-08-18 12:32
Description: A screen of all S&P 500 companies.
RESULTS OVERVIEW
---------------
• Total Universe Screened: 503 stocks
• Passed Initial Screening: 45 stocks
• Final Recommendations: 25 stocks
• Success Rate: 5.0%
AVERAGE QUALITY METRICS
----------------------
• Quality Score: 78.2/100
• Value Score: 65.4/100
• Growth Score: 58.9/100
• Risk Score: 42.1/100
TOP RECOMMENDATIONS
------------------
1. GOOGL - Score: 98.9 (Communication Services)
2. MSFT - Score: 94.2 (Technology)
3. AAPL - Score: 87.6 (Technology)
4. JNJ - Score: 85.3 (Healthcare)
5. PG - Score: 82.9 (Consumer Defensive)
SECTOR BREAKDOWN
---------------
• Technology: 8 stocks
• Healthcare: 6 stocks
• Financial Services: 5 stocks
• Consumer Defensive: 4 stocks
• Communication Services: 2 stocks
KEY INSIGHTS
-----------
• Found 25 stocks meeting criteria
• Average composite score: 79.8
• Most represented sector: Technology
Detailed Stock Analysis¶
For each stock that passes filters:
DETAILED ANALYSIS: GOOGL
==================================================
COMPANY OVERVIEW
---------------
• Sector: Communication Services
• Industry: Internet Content & Information
• Market Cap: $2462.65B
• Current Price: $203.34
COMPOSITE SCORING
• Overall Score: 98.9/100
• Quality Score: 100.0/100
• Value Score: 100.0/100
• Growth Score: 100.0/100
• Risk Score: 7.2/100
QUALITY ASSESSMENT
-----------------
• Return on Equity: 34.8%
• Return on Invested Capital: 31.2%
• Current Ratio: 1.90
• Debt to Equity: 11.5%
• Quality Rating: EXCELLENT
VALUATION ANALYSIS
-----------------
• P/E Ratio: 21.7
• P/B Ratio: 6.80
• EV/EBITDA: 17.1
• Valuation Rating: ATTRACTIVE
GROWTH EVALUATION
----------------
• Revenue Growth: 13.8%
• Earnings Growth: 22.3%
• Growth Quality: STRONG
• Growth Sustainability: HIGH
RISK ASSESSMENT
--------------
• Risk Level: LOW
• Beta: 1.05 (estimated)
• Financial Risk: VERY LOW
• Business Risk: LOW
• Sector Risk: MODERATE
CSV Format Structure¶
Column Definitions¶
Ticker,Sector,Market_Cap_B,Current_Price,Passes_Filters,Composite_Score,Quality_Score,Value_Score,Growth_Score,Risk_Score,P_E,P_B,ROE,ROIC,Revenue_Growth,Debt_Equity
Data Types and Formats¶
Column | Data Type | Format | Example |
---|---|---|---|
Ticker |
String | Text | AAPL |
Sector |
String | Text | Technology |
Market_Cap_B |
Float | Billions USD | 3436.89 |
Current_Price |
Float | USD | 231.59 |
Passes_Filters |
String | Y/N | Y |
Composite_Score |
Float | 0-100 | 95.4 |
Quality_Score |
Float | 0-100 | 75.0 |
Value_Score |
Float | 0-100 | 0.0 |
Growth_Score |
Float | 0-100 | 100.0 |
Risk_Score |
Float | 0-100 | 30.6 |
P_E |
Float | Ratio | 35.1 |
P_B |
Float | Ratio | 52.27 |
ROE |
Float | Decimal (0.15 = 15%) | 1.498 |
ROIC |
Float | Decimal | 0.589 |
Revenue_Growth |
Float | Decimal | 0.096 |
Debt_Equity |
Float | Percentage | 154.5 |
Sample CSV Data¶
Ticker,Sector,Market_Cap_B,Current_Price,Passes_Filters,Composite_Score,Quality_Score,Value_Score,Growth_Score,Risk_Score,P_E,P_B,ROE,ROIC,Revenue_Growth,Debt_Equity
GOOGL,Communication Services,2471.45,203.90,Y,98.9,100.0,100.0,100.0,7.2,21.7,6.80,0.348,0.312,0.138,11.5
AAPL,Technology,3436.89,231.59,N,57.9,75.0,0.0,100.0,30.6,35.1,52.27,1.498,0.589,0.096,154.5
TSLA,Consumer Cyclical,1066.20,330.56,N,28.6,50.0,0.0,0.0,9.0,195.6,13.78,0.082,0.070,-0.118,16.8
JSON Format Structure¶
Complete Data Export¶
{
"config": {
"name": "sp500_full_screen",
"description": "A screen of all S&P 500 companies.",
"universe": {
"pre_screening_universe": "sp500",
"region": "US",
"min_market_cap": 100
},
"quality": {
"min_roic": 0.08,
"min_roe": 0.10,
"max_debt_equity": 2.0
}
},
"summary": {
"top_picks": [
{
"ticker": "GOOGL",
"composite_score": 98.9,
"sector": "Communication Services"
}
],
"average_scores": {
"quality": 78.2,
"value": 65.4,
"growth": 58.9,
"risk": 42.1
},
"sector_breakdown": {
"Technology": 8,
"Healthcare": 6,
"Financial Services": 5
},
"key_insights": [
"Found 25 stocks meeting criteria",
"Average composite score: 79.8",
"Most represented sector: Technology"
]
},
"stocks": [
{
"ticker": "GOOGL",
"basic_data": {
"ticker": "GOOGL",
"market_cap": 2471450000000,
"sector": "Communication Services",
"current_price": 203.90
},
"scores": {
"composite": 98.9,
"quality": 100.0,
"value": 100.0,
"growth": 100.0,
"risk": 7.2
},
"passes_filters": true,
"quality": {
"quality_score": 100.0,
"quality_metrics": {
"roe": 0.348,
"roic": 0.312,
"debt_to_equity": 11.5,
"current_ratio": 1.90
}
}
}
],
"total_universe": 503,
"passed_screening": 45,
"final_results": 25
}
Working with Output Files¶
Excel/Spreadsheet Analysis¶
Loading CSV Data¶
- Excel: File → Open → Select CSV file → Import with comma delimiter
- Google Sheets: File → Import → Upload file → Separator: Comma
- LibreOffice Calc: File → Open → Select CSV → Delimiter: Comma
Useful Excel Formulas¶
Filter for passing stocks only:
Calculate sector averages:
Rank stocks by composite score:
Python Data Analysis¶
Loading CSV with Pandas¶
import pandas as pd
# Load results
df = pd.read_csv('sp500_full_screen_20240818_123456_results.csv')
# Filter for passing stocks only
passing_stocks = df[df['Passes_Filters'] == 'Y']
# Top 10 by composite score
top_stocks = df.nlargest(10, 'Composite_Score')
# Sector analysis
sector_stats = df.groupby('Sector').agg({
'Composite_Score': ['mean', 'count'],
'Passes_Filters': lambda x: (x == 'Y').sum()
})
Loading JSON Data¶
import json
import pandas as pd
# Load complete results
with open('sp500_full_screen_20240818_123456_data.json', 'r') as f:
results = json.load(f)
# Extract stock data
stocks_df = pd.json_normalize(results['stocks'])
# Get configuration used
config = results['config']
R Data Analysis¶
library(readr)
library(dplyr)
# Load CSV data
results <- read_csv("sp500_full_screen_20240818_123456_results.csv")
# Filter and analyze
passing_stocks <- results %>%
filter(Passes_Filters == "Y") %>%
arrange(desc(Composite_Score))
# Sector breakdown
sector_analysis <- results %>%
group_by(Sector) %>%
summarize(
avg_score = mean(Composite_Score, na.rm = TRUE),
count = n(),
passing_count = sum(Passes_Filters == "Y")
)
Output File Management¶
File Naming Convention¶
Files follow this pattern:
Examples:
- sp500_full_screen_20240818_123456_report.txt
- sp500_full_screen_20240818_123456_results.csv
- sp500_full_screen_20240818_123456_data.json
Organizing Results¶
Recommended directory structure:
investment_analysis/
├── configs/
│ ├── my_strategy.yaml
│ └── backup_configs/
├── results/
│ ├── 2024-08/
│ │ ├── sp500_analysis/
│ │ ├── sector_analysis/
│ │ └── custom_screens/
│ └── archive/
└── analysis/
├── python_scripts/
├── excel_workbooks/
└── reports/
Batch Processing Results¶
# Create organized results structure
mkdir -p results/$(date +%Y-%m)/sp500_analysis
# Run analysis with organized output
poetry run python scripts/systematic_analysis.py \
configs/sp500_full.yaml \
--save-csv --save-json \
--output results/$(date +%Y-%m)/sp500_analysis/
Custom Output Processing¶
Creating Summary Reports¶
import pandas as pd
from datetime import datetime
def create_summary_report(csv_file):
"""Create custom summary from CSV results."""
df = pd.read_csv(csv_file)
summary = {
'analysis_date': datetime.now().strftime('%Y-%m-%d'),
'total_stocks': len(df),
'passing_stocks': len(df[df['Passes_Filters'] == 'Y']),
'top_5_stocks': df.nlargest(5, 'Composite_Score')[['Ticker', 'Composite_Score']].to_dict('records'),
'sector_breakdown': df['Sector'].value_counts().to_dict(),
'avg_scores': {
'composite': df['Composite_Score'].mean(),
'quality': df['Quality_Score'].mean(),
'value': df['Value_Score'].mean(),
'growth': df['Growth_Score'].mean(),
'risk': df['Risk_Score'].mean()
}
}
return summary
Automated Reporting¶
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def email_results_summary(results_file, recipient):
"""Email analysis results summary."""
summary = create_summary_report(results_file)
# Create email content
message = f"""
Investment Analysis Results - {summary['analysis_date']}
Total Stocks Analyzed: {summary['total_stocks']}
Stocks Passing Filters: {summary['passing_stocks']}
Success Rate: {summary['passing_stocks']/summary['total_stocks']*100:.1f}%
Top 5 Recommendations:
{chr(10).join([f"{i+1}. {stock['Ticker']} ({stock['Composite_Score']:.1f})" for i, stock in enumerate(summary['top_5_stocks'])])}
Average Scores:
Composite: {summary['avg_scores']['composite']:.1f}
Quality: {summary['avg_scores']['quality']:.1f}
Value: {summary['avg_scores']['value']:.1f}
Growth: {summary['avg_scores']['growth']:.1f}
Risk: {summary['avg_scores']['risk']:.1f}
"""
# Send email (configure SMTP settings)
# Implementation details depend on email provider
Integration with External Tools¶
Power BI Integration¶
- Data Source: Use CSV output as data source
- Refresh Schedule: Set up automatic data refresh
- Visualizations: Create dashboards for sector analysis, scoring trends
Tableau Integration¶
- Connect: File → Connect → Text file → Select CSV
- Data Prep: Clean and structure data as needed
- Visualizations: Build interactive analysis dashboards
Database Integration¶
-- Create table for results
CREATE TABLE investment_analysis (
analysis_date DATE,
ticker VARCHAR(10),
sector VARCHAR(50),
market_cap_b DECIMAL(10,2),
current_price DECIMAL(8,2),
passes_filters BOOLEAN,
composite_score DECIMAL(5,2),
quality_score DECIMAL(5,2),
value_score DECIMAL(5,2),
growth_score DECIMAL(5,2),
risk_score DECIMAL(5,2)
);
-- Load data from CSV
LOAD DATA INFILE 'results.csv'
INTO TABLE investment_analysis
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
Best Practices¶
File Management¶
- Consistent naming - Use descriptive configuration names
- Regular archiving - Move old results to archive folders
- Version control - Track configuration changes
- Backup strategy - Protect important analysis results
Data Analysis Workflow¶
- Start with CSV - Most versatile for initial analysis
- Use JSON for integration - API development and custom tools
- Text reports for presentation - Executive summaries and documentation
- Combine formats - Leverage strengths of each format
Quality Control¶
- Validate data completeness before analysis
- Check for obvious errors in results
- Compare results across different time periods
- Verify calculations with manual spot checks
Next Steps¶
- Running Analysis - Execute comprehensive analysis
- Understanding Results - Interpret analysis output
- Configuration Options - Customize parameters