- 21 AI agents with detailed personas (ARK, Tom Lee, shorts, retail, quants) - 25 toggleable market stimuli with adjustable intensity - LLM-driven swarm reasoning (Anthropic, OpenAI, Gemini, OpenRouter, Ollama) - Live BMNR data from bitminetracker.io - Real flywheel mechanics (ATM issuance, ETH/share accretion, breakeven mNAV) - Bear/Base/Bull scenario comparison - Wedge day-mode UI design system - Formula fallback engine for instant results without API key Built on MiroFish swarm intelligence engine (github.com/666ghj/MiroFish) |
||
|---|---|---|
| .. | ||
| src | ||
| .env.example | ||
| .gitignore | ||
| CONTRIBUTING.md | ||
| LICENSE | ||
| README.md | ||
| index.html | ||
| package.json | ||
| vite.config.js | ||
README.md
MiroFish × BMNR Simulator
Agent-based stock simulator for BitMine (BMNR) powered by LLM swarm intelligence.
A fork of MiroFish adapted for financial market simulation. Instead of predicting outcomes with formulas, 21 AI agents with distinct personas reason collectively about BMNR's future — and predictions emerge from their interactions.
Not financial advice. This is an educational simulation tool. Not affiliated with BitMine Immersion Technologies, Tom Lee, ARK Invest, or any entity mentioned. Agent personas are fictional archetypes.
What It Does
| Feature | Description |
|---|---|
| Live Market Data | Fetches BMNR price, ETH price, mNAV, holdings from bitminetracker.io on every load |
| 21 AI Agents | ARK/Cathie, Tom Lee, short sellers, Reddit bulls, WSB degens, arb bots — each with detailed personas |
| LLM Reasoning | Each quarter, agents reason via LLM about the market state — not programmed formulas |
| 25 Market Stimuli | Toggle events (ETH rally, SEC crackdown, MAVAN launch) with adjustable intensity |
| Flywheel Math | Real ATM issuance mechanics: NAV calc → breakeven check → share issuance → ETH/share accretion |
| 3 Scenarios | Bear / Base / Bull with overlaid comparison charts |
| Multi-LLM | Pluggable providers: Anthropic, OpenAI, Google Gemini, OpenRouter, Ollama (local), or custom |
| Formula Fallback | Instant results via network-propagation math when LLM is unavailable |
Quick Start
Option 1: Claude.ai Artifact (zero setup)
Copy the contents of src/App.jsx into a Claude.ai artifact. It runs immediately — the Anthropic API is available inside artifacts with no API key.
Option 2: Self-Host
git clone https://github.com/mikema-rgb/BMNR-Mirofish.git
cd BMNR-Mirofish
cp .env.example .env # Edit with your API key
npm install
npm run dev # Opens at http://localhost:3000
Option 3: Any LLM
Edit .env to use your preferred provider:
# OpenAI
VITE_LLM_PROVIDER=openai
VITE_OPENAI_API_KEY=sk-...
# Google Gemini
VITE_LLM_PROVIDER=gemini
VITE_GEMINI_API_KEY=AIza...
# Ollama (local, free, no key)
VITE_LLM_PROVIDER=ollama
VITE_OLLAMA_BASE_URL=http://localhost:11434
# OpenRouter (100+ models)
VITE_LLM_PROVIDER=openrouter
VITE_OPENROUTER_API_KEY=sk-or-...
# Any OpenAI-compatible endpoint
VITE_LLM_PROVIDER=custom
VITE_CUSTOM_BASE_URL=https://your-endpoint.com
VITE_CUSTOM_API_KEY=your-key
Architecture
BMNR-Mirofish/
├── src/
│ ├── App.jsx # Main component (monolith — runs standalone)
│ ├── main.jsx # React entry point
│ ├── config/
│ │ └── index.js # Simulation config, scenario metadata, fallback data
│ ├── data/
│ │ ├── agents.js # 21 agent personas (the core of MiroFish)
│ │ └── stimuli.js # 25 market event definitions
│ ├── engine/
│ │ └── prompts.js # LLM prompt builder (fork this for other stocks)
│ └── providers/
│ └── index.js # LLM provider abstraction (Anthropic, OpenAI, etc.)
├── .env.example # Environment config template
├── package.json
├── vite.config.js
└── README.md
How MiroFish Works (vs. Traditional Models)
| Traditional Monte Carlo | Formula Agent Model | MiroFish LLM Agents | |
|---|---|---|---|
| How price moves | price × exp(drift + vol × dW) |
Sentiment formulas drive returns | LLM reasons about what agents would do |
| Agent behavior | None — just noise terms | Programmed bias + susceptibility | Natural language persona → LLM reasoning |
| Emergent effects | None | Limited network propagation | Herding, contrarianism, cascade failures |
| Stimulus response | Hardcoded impact numbers | Type-weighted sensitivity | LLM interprets event for each persona |
| Surprise factor | None — deterministic given seed | Low — formulas are predictable | High — LLM reasoning can produce unexpected cascades |
The Simulation Loop
Each quarter:
- Agent Selection — 8 core agents + 3 rotating guests are selected
- Prompt Construction — Market state, stimuli, prior quarter narrative, and agent personas are assembled into a prompt
- LLM Call — The prompt is sent to the configured LLM provider
- Response Parsing — JSON output is extracted with markdown fence stripping and brace-counting fallback
- Market Update — LLM-derived ETH price change and mNAV change are applied (clamped to ±50% per quarter)
- Flywheel Engine — If mNAV > breakeven, ATM shares are issued, ETH is purchased, ETH/share updates
- State Propagation — The quarter narrative feeds into the next round as context
How to Extend
Add a New Agent
Edit src/data/agents.js:
{
id: "your_agent",
name: "Your Agent Name",
type: "Institutional", // or Retail, Quant, Macro, Analyst, etc.
icon: "🎯",
bias: 0.2, // -1 (bearish) to 1 (bullish) for formula fallback
influence: 0.5, // 0-1: how much they sway others
susceptibility: 0.3, // 0-1: how much they follow the herd
memory: 0.6, // 0-1: how much past rounds carry forward
persona: "You are... [detailed natural language persona]. You believe... You react to..."
}
The persona is the most important field — write it like you're briefing a method actor.
Add a New Stimulus
Edit src/data/stimuli.js:
{
id: "your_event",
name: "Your Event Name",
cat: "ETH", // Category for filtering
icon: "⚡",
impact: 0.5, // -1 to 1 for formula fallback
desc: "Short description"
}
Add a New LLM Provider
Edit src/providers/index.js:
export const YourProvider = {
id: "your_provider",
name: "Your Provider",
models: ["model-1", "model-2"],
defaultModel: "model-1",
requiresKey: true,
async call(messages, { model, maxTokens, apiKey } = {}) {
// Make your API call here
// Return { text: string, raw: any }
const res = await fetch("https://your-api.com/v1/chat", { ... });
const data = await res.json();
return { text: data.output, raw: data };
}
};
// Register it:
export const PROVIDERS = {
...existingProviders,
your_provider: YourProvider,
};
Fork for Another Stock
The simulator is designed to be adapted. To fork for a different stock:
- Replace agent personas in
src/data/agents.jswith archetypes relevant to your stock - Replace stimuli in
src/data/stimuli.jswith events that affect your stock - Update
src/config/index.jswith fallback market data for your stock - Modify
src/engine/prompts.jsto reference your stock's specific dynamics (the flywheel mechanics are BMNR-specific — replace with whatever drives your stock's value) - Update the live data fetcher in
src/App.jsxto pull from relevant data sources
Acknowledgments
- MiroFish — the original swarm intelligence engine by Shanda Group. This project adapts their agent-based simulation concept for financial markets.
- OASIS — the underlying social simulation platform that powers MiroFish.
- Wedge — the BMNR flywheel model and design system.
- bitminetracker.io — live BMNR market data.
Contributing
PRs welcome. The most impactful contributions:
- Better agent personas — if you can write a more realistic persona for any of the 21 agents, that directly improves simulation quality
- New stimuli — market events we haven't thought of
- New LLM providers — expand the provider abstraction
- Prompt engineering — improvements to
src/engine/prompts.jsthat produce more realistic agent reasoning - UI improvements — better charts, mobile responsiveness, dark mode
- Other stocks — fork and adapt for MSTR, COIN, or any other stock with similar dynamics
License
MIT — same as MiroFish.
WEDGE × MIROFISH × BMNR
Educational only. Not financial advice.