""" 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()