Polymarket offers prediction markets on stock prices, such as "Will GOOGL close above $200 by end of February?". These markets let you bet YES or NO on outcomes.
By buying NO shares on price targets significantly above the current stock price, you're essentially betting the stock won't reach that price. If you're right, you get $1 per share at expiration. If you're wrong but own the actual stock, your stock gains offset the prediction market loss.
Prediction markets, especially low-liquidity ones, are often inefficient. You can frequently find 20-50%+ APY on relatively safe scenarios (e.g., betting a stock won't rise 30% in 2 weeks).
GOOGL is at $180. A market asks "Will GOOGL hit $250 by March?". NO shares cost $0.92. If GOOGL stays below $250, you profit $0.08/share (8.7% in a few weeks = high APY). If GOOGL somehow hits $250, you lose $0.92/share but your GOOGL stock gained ~39%.
This tool scans Polymarket for these opportunities, ranks them by attractiveness, and optionally lets you execute trades directly.
- Market Scanner: Scans Polymarket for stock price prediction markets and identifies opportunities based on delta from current price, time to expiry, and APY
- Portfolio Dashboard: View positions, available balance, and portfolio breakdown
- Stock Holdings Tracker: Enter your stock holdings to see hedge scenario calculations when trading
- Trade Execution: Execute trades directly with configurable max price and amount (optional - requires wallet setup)
- Position Redemption: Automatically redeems resolved winning positions
You can run the scanner without any wallet configuration to just discover opportunities.
npm installEdit config/config.json:
{
"stocks": ["GOOGL", "AMZN"],
"opportunities": {
"opportunityAPY": 25,
"minDisplayAPY": 8,
"minDeltaPercent": 7
}
}| Field | Description |
|---|---|
stocks |
Stock tickers to scan for |
opportunityAPY |
Minimum APY to flag as "opportunity" (green highlight) |
minDisplayAPY |
APY cutoff - hide opportunities below this |
minDeltaPercent |
Delta (% from current stock price) cutoff |
npm run devTo execute trades, you need to configure your Polymarket wallet.
⚠ Please read the Security section carefully before enabling trading features
# Wallet credentials (required for trading)
POLYGON_PRIVATE_KEY=your_wallet_private_key
POLYMARKET_FUNDER_ADDRESS=your_polymarket_proxy_wallet_address
POLYGON_RPC_URL=https://polygon-rpc.com
# Auth password for trading
TRADE_PASSWORD=your_secure_password
# Readonly mode (default: true)
# When true, requires login to trade or skip opportunities
READONLY_MODE=trueFinding your Polymarket proxy address: This is the address Polymarket uses to hold your funds. You can find it in your Polymarket account settings or by checking the deposit address.
Click Login in the app header and enter your TRADE_PASSWORD to enable trading.
- Positions: Total value of open positions with count
- Balance: USDC balance available for trading
- Opportunities: Count of opportunities meeting the
opportunityAPYthreshold - Stock Holdings: Enter shares you own for each stock to enable hedge calculations
Click column headers to sort. Columns:
| Column | Description |
|---|---|
| Market | Event title with link to Polymarket |
| Strike | Strike price of the bracket |
| Delta | % difference from current stock price |
| NO Price | Current best ask price for NO shares |
| APY | Annualized yield if NO wins |
| Score | Opportunity score (0-100) |
| Expires | Days until market resolution |
- Click Trade on an opportunity
- Adjust Max Price (highest price you'll pay)
- Adjust Max Amount (budget limit)
- Review shares, cost, APY, and profit preview
- If you've entered stock holdings, see hedge scenarios showing:
- Bet profit if stock stays below strike
- Hedge cost % if stock rises above strike
- Click Execute
Click Skip to hide an opportunity:
- Snooze (24h): Reappears after 24 hours
- Dismiss Forever: Permanently hidden
Score = APY Score (30 pts max) + Delta Score (70 pts max)
APY Score = min(APY, 200) / 200 * 30
Delta Score = min(|delta|, 50) / 50 * 70
Higher delta = safer bet (stock less likely to reach strike price).
- Private Key: Your
POLYGON_PRIVATE_KEYgrants full control over your wallet. Never share it, commit it to git, or expose it publicly. Use a dedicated wallet with limited funds. - Trade Password: If exposing the UI on the internet, use a strong
TRADE_PASSWORD. Anyone with access can execute trades on your behalf. - Readonly Mode: Enabled by default (
READONLY_MODE=true). Requires login to skip opportunities, preventing visitors from modifying your data. - Stock Holdings: Stored locally in your browser (localStorage). Never sent to any server.
- Self-hosted: This app is designed to run on your own infrastructure. Don't use third-party hosted versions with your private key.
docker compose up -d --buildThe app runs on port 50003 by default.
Required to place orders if your server is in a country where Polymarket is restricted (e.g., France).
If you don't need it, remove the vpn service from the docker-compose.yml file & the references to it in the app
service.
Using Proton VPN as an example (works with other providers too):
- Log in to Proton VPN Dashboard
- Navigate to Downloads > OpenVPN configuration files
- Select:
- Platform: Linux
- Protocol: UDP (recommended) or TCP
- Connection: Choose a specific server (e.g., Ireland)
- Download the
.ovpnfile - Get your OpenVPN Credentials from Account section (different from login password)
mkdir -p vpn
mv ~/Downloads/your-server.ovpn vpn/vpn.ovpnCreate vpn/vpn.auth with your OpenVPN credentials:
your-openvpn-username
your-openvpn-password
One credential per line (username on line 1, password on line 2).
Open vpn/vpn.ovpn and:
-
Find
auth-user-passand change it to:auth-user-pass /vpn/vpn.auth -
Comment out
update-resolv-confreferences if present:# script-security 2 # up /etc/openvpn/update-resolv-conf # down /etc/openvpn/update-resolv-conf
The docker-compose.yml includes VPN configuration. Just run:
docker compose up -dThe app traffic will route through the VPN while the port remains accessible on your host.