Spaces:
Sleeping
Sleeping
| """ | |
| 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 | |
| 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 | |
| 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" | |
| 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" | |
| ), | |
| } | |
| 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() | |