JoshTest / config.py
LittleMonkeyLab's picture
Upload 12 files
cbd168e verified
"""
Configuration module for the AI Trading Experiment.
Contains both participant-visible and researcher-controlled parameters.
"""
from dataclasses import dataclass, field
from typing import Dict, List, Optional
import json
@dataclass
class ParticipantVisibleParams:
"""Parameters that participants can adjust."""
explanation_depth: int = 50 # 0-100: Minimal to Detailed
communication_style: int = 50 # 0-100: Formal to Casual
@dataclass
class ResearcherControlledParams:
"""Hidden parameters controlled by researcher for experimental conditions."""
accuracy_rate: float = 0.7 # 0-1: Probability AI advice leads to good outcome
proactivity_level: int = 50 # 0-100: How often AI initiates advice
confidence_framing: int = 50 # 0-100: How assertive advice sounds
risk_bias: int = 50 # 0-100: Conservative to Aggressive recommendations
# Experimental condition identifier
condition_name: str = "default"
@dataclass
class ExperimentConfig:
"""Overall experiment configuration."""
# Starting conditions
initial_portfolio_value: float = 100000.0
currency_symbol: str = "credits"
# Session settings
scenarios_per_session: int = 8
min_decision_time_seconds: float = 5.0 # Minimum time before decision allowed
# Proactive AI settings
proactive_delay_seconds: float = 3.0 # Delay before AI offers proactive advice
proactive_probability: float = 0.7 # Base probability of proactive advice per scenario
# Data collection
track_mouse_movements: bool = False # Future feature
track_time_on_elements: bool = True
# UI settings
show_portfolio_history: bool = True
show_ai_accuracy_feedback: bool = False # Whether to reveal if AI was right
# Researcher params (can be overridden per experiment condition)
researcher_params: ResearcherControlledParams = field(
default_factory=ResearcherControlledParams
)
# Pre-defined experimental conditions for A/B testing
EXPERIMENT_CONDITIONS: Dict[str, ResearcherControlledParams] = {
"high_accuracy_high_confidence": ResearcherControlledParams(
accuracy_rate=0.85,
proactivity_level=70,
confidence_framing=80,
risk_bias=50,
condition_name="high_accuracy_high_confidence"
),
"high_accuracy_low_confidence": ResearcherControlledParams(
accuracy_rate=0.85,
proactivity_level=70,
confidence_framing=20,
risk_bias=50,
condition_name="high_accuracy_low_confidence"
),
"low_accuracy_high_confidence": ResearcherControlledParams(
accuracy_rate=0.40,
proactivity_level=70,
confidence_framing=80,
risk_bias=50,
condition_name="low_accuracy_high_confidence"
),
"low_accuracy_low_confidence": ResearcherControlledParams(
accuracy_rate=0.40,
proactivity_level=70,
confidence_framing=20,
risk_bias=50,
condition_name="low_accuracy_low_confidence"
),
"conservative_advisor": ResearcherControlledParams(
accuracy_rate=0.70,
proactivity_level=50,
confidence_framing=50,
risk_bias=20,
condition_name="conservative_advisor"
),
"aggressive_advisor": ResearcherControlledParams(
accuracy_rate=0.70,
proactivity_level=50,
confidence_framing=50,
risk_bias=80,
condition_name="aggressive_advisor"
),
"passive_advisor": ResearcherControlledParams(
accuracy_rate=0.70,
proactivity_level=20,
confidence_framing=50,
risk_bias=50,
condition_name="passive_advisor"
),
"active_advisor": ResearcherControlledParams(
accuracy_rate=0.70,
proactivity_level=80,
confidence_framing=50,
risk_bias=50,
condition_name="active_advisor"
),
}
@dataclass
class Scenario:
"""A trading scenario presented to the participant."""
scenario_id: str
company_symbol: str
company_name: str
sector: str
country: str
current_price: float
situation_description: str
# Hidden from participant - determines outcomes
optimal_action: str # "BUY", "SELL", or "HOLD"
ai_recommendation: str # What AI will recommend (may differ from optimal)
ai_is_correct: bool # Whether AI recommendation matches optimal
# Outcome percentages based on decision
outcome_buy: float # e.g., -0.08 for -8%
outcome_sell: float
outcome_hold: float
# Additional context for AI reasoning
key_factors: List[str] = field(default_factory=list)
red_flags: List[str] = field(default_factory=list)
positive_signals: List[str] = field(default_factory=list)
# Pre-defined scenarios
SCENARIOS: List[Scenario] = [
Scenario(
scenario_id="S001",
company_symbol="MRD",
company_name="Meridian Industries",
sector="Manufacturing",
country="Republic of Valdoria",
current_price=52.30,
situation_description="""Meridian Industries recently announced a 5-year defense contract worth 2.1B credits.
The stock has risen 12% over the past month on this news. Labor disputes at the southern facility
have been resolved. The company maintains a healthy balance sheet with low debt.""",
optimal_action="HOLD",
ai_recommendation="HOLD",
ai_is_correct=True,
outcome_buy=-0.035, # -3.5% (already priced in)
outcome_sell=-0.042, # Miss further gains
outcome_hold=0.032, # +3.2% steady growth
key_factors=["Defense contract secured", "Labor issues resolved", "Strong balance sheet"],
red_flags=[],
positive_signals=["Government contract", "Low debt", "Stable management"]
),
Scenario(
scenario_id="S002",
company_symbol="NGP",
company_name="Northgate Pharmaceuticals",
sector="Healthcare",
country="Federation of Eastholm",
current_price=85.50,
situation_description="""Northgate Pharmaceuticals has Phase 3 trial results expected next month for their
flagship rare disease treatment. However, unusual trading volume was detected last week, a board member
resigned citing "personal reasons," and the CFO sold shares worth 500K credits. Competitor Apex Biotech
announced a similar drug in development.""",
optimal_action="SELL",
ai_recommendation="BUY", # AI gives bad advice here
ai_is_correct=False,
outcome_buy=-0.153, # -15.3% (trial fails)
outcome_sell=0.153, # +15.3% (avoided loss)
outcome_hold=-0.153, # Same as buy
key_factors=["Phase 3 trial pending", "Insider activity", "Competitive pressure"],
red_flags=["Board member resignation", "CFO share sale", "Unusual trading volume"],
positive_signals=["Strong pipeline", "Rare disease focus"]
),
Scenario(
scenario_id="S003",
company_symbol="TFE",
company_name="Terraform Energy",
sector="Energy",
country="United Provinces of Somara",
current_price=132.80,
situation_description="""Terraform Energy's fusion prototype achieved a 40% efficiency milestone, a significant
breakthrough. The company has government subsidies locked in for 10 years and is awaiting regulatory
approval for expansion into Valdoria. Last quarter's earnings beat expectations by 12%.""",
optimal_action="BUY",
ai_recommendation="BUY",
ai_is_correct=True,
outcome_buy=0.124, # +12.4%
outcome_sell=-0.089, # Miss the rally
outcome_hold=0.056, # Partial gain
key_factors=["Fusion breakthrough", "Government support", "Expansion pending"],
red_flags=["Regulatory approval uncertainty"],
positive_signals=["Technology leadership", "Stable subsidies", "Earnings beat"]
),
Scenario(
scenario_id="S004",
company_symbol="NXC",
company_name="Nexus Communications",
sector="Technology",
country="Coastal Republic of Marinea",
current_price=218.40,
situation_description="""Nexus Communications holds a monopoly position in Marinea's telecommunications market.
There are unconfirmed rumors of an antitrust investigation. The company's 5G rollout is 60% complete,
and they're planning a satellite constellation launch. Subscriber growth is slowing in mature markets.""",
optimal_action="HOLD",
ai_recommendation="SELL", # AI is overly cautious
ai_is_correct=False,
outcome_buy=0.045, # Slight gain, rumors overblown
outcome_sell=-0.067, # Miss continued performance
outcome_hold=0.045, # Same as buy
key_factors=["Monopoly position", "Antitrust rumors", "5G expansion"],
red_flags=["Regulatory risk", "Slowing growth"],
positive_signals=["Strong cash reserves", "Infrastructure investments"]
),
Scenario(
scenario_id="S005",
company_symbol="APX",
company_name="Apex Biotech",
sector="Healthcare",
country="Republic of Valdoria",
current_price=71.20,
situation_description="""Apex Biotech announced a competing drug to Northgate's flagship product. The company
is integrating a recent acquisition and there are rumors they may be an acquisition target themselves.
The CFO sold shares worth 2M credits last month, though this was part of a pre-planned selling program.""",
optimal_action="HOLD",
ai_recommendation="HOLD",
ai_is_correct=True,
outcome_buy=-0.028, # Slight decline, uncertainty
outcome_sell=-0.015, # Miss potential upside
outcome_hold=0.018, # Modest gain
key_factors=["Competitive positioning", "M&A activity", "Insider sales"],
red_flags=["CFO share sale", "Integration risks"],
positive_signals=["Strong patent portfolio", "Acquisition rumors"]
),
Scenario(
scenario_id="S006",
company_symbol="ICS",
company_name="Ironclad Security",
sector="Defense",
country="Federation of Eastholm",
current_price=93.60,
situation_description="""Ironclad Security won a major cybersecurity contract with the Marinea government.
A cyber attack on a competitor has enhanced ICS's reputation. The company is planning to hire 500
new engineers. Their order backlog represents 18 months of revenue.""",
optimal_action="BUY",
ai_recommendation="BUY",
ai_is_correct=True,
outcome_buy=0.098, # +9.8%
outcome_sell=-0.065, # Miss rally
outcome_hold=0.042, # Partial gain
key_factors=["Major contract win", "Strong backlog", "Expansion hiring"],
red_flags=[],
positive_signals=["Government contracts", "Reputation boost", "Growth investment"]
),
Scenario(
scenario_id="S007",
company_symbol="CSC",
company_name="Coastal Shipping Corp",
sector="Transportation",
country="Coastal Republic of Marinea",
current_price=35.80,
situation_description="""Coastal Shipping Corp benefits from a new trade agreement with Somara. Their fuel
hedging strategy has reduced costs by 8%. However, there are ongoing port strike risks in Valdoria,
and trade treaty negotiations could impact several key routes. The company offers a high dividend yield.""",
optimal_action="HOLD",
ai_recommendation="BUY", # AI is too aggressive
ai_is_correct=False,
outcome_buy=-0.072, # Port strike materializes
outcome_sell=0.034, # Avoided loss
outcome_hold=-0.018, # Small loss
key_factors=["Trade agreements", "Fuel hedging", "Labor risks"],
red_flags=["Port strike risk", "Trade negotiations"],
positive_signals=["New trade deal", "Cost management", "High dividend"]
),
Scenario(
scenario_id="S008",
company_symbol="AUR",
company_name="Aurora Entertainment",
sector="Consumer Discretionary",
country="United Provinces of Somara",
current_price=61.40,
situation_description="""Aurora Entertainment's hit series "Valdoria Rising" broke viewership records.
However, their gaming division underperformed expectations. A new VR platform launches next quarter.
There are rumors Nexus Communications may acquire the company. Cash flow remains negative despite growth.""",
optimal_action="BUY",
ai_recommendation="HOLD", # AI is too conservative
ai_is_correct=False,
outcome_buy=0.186, # Acquisition announced
outcome_sell=-0.142, # Miss acquisition premium
outcome_hold=0.065, # Partial gain from rumors
key_factors=["Content success", "Gaming weakness", "Acquisition rumors"],
red_flags=["Negative cash flow", "Gaming underperformance"],
positive_signals=["Viewership records", "VR launch", "Acquisition interest"]
),
]
def get_scenario_by_id(scenario_id: str) -> Optional[Scenario]:
"""Retrieve a scenario by its ID."""
for scenario in SCENARIOS:
if scenario.scenario_id == scenario_id:
return scenario
return None
def get_condition(condition_name: str) -> ResearcherControlledParams:
"""Get a pre-defined experimental condition."""
return EXPERIMENT_CONDITIONS.get(
condition_name,
ResearcherControlledParams()
)
def create_custom_condition(
accuracy_rate: float = 0.7,
proactivity_level: int = 50,
confidence_framing: int = 50,
risk_bias: int = 50,
name: str = "custom"
) -> ResearcherControlledParams:
"""Create a custom experimental condition."""
return ResearcherControlledParams(
accuracy_rate=accuracy_rate,
proactivity_level=proactivity_level,
confidence_framing=confidence_framing,
risk_bias=risk_bias,
condition_name=name
)
# Default configuration instance
DEFAULT_CONFIG = ExperimentConfig()