# LP Impermanent Loss Calculator (`gochujang/lp-impermanent-loss`) Actor

Calculate impermanent loss for Uniswap v2-style AMM pools. Auto-fetch current prices via CoinGecko or provide manual ratios. Compares LP vs HODL P\&L, factors in fee income, generates scenario sweep. $0.001/calculation.

- **URL**: https://apify.com/gochujang/lp-impermanent-loss.md
- **Developed by:** [Hojun Lee](https://apify.com/gochujang) (community)
- **Categories:** Developer tools, Automation, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## LP Impermanent Loss Calculator

> Calculate exact impermanent loss (IL) for constant-product AMM liquidity positions — Uniswap, SushiSwap, PancakeSwap, and any x*y=k AMM.

---

### What It Does

Computes impermanent loss and LP position value based on price change from entry to current, using the constant-product AMM formula.

- **Auto mode**: Fetch live prices from CoinGecko for any two tokens
- **Manual mode**: Enter a custom price ratio directly
- **Scenario sweep**: Generate IL across 14 price change scenarios (-95% to +10x)

Outputs LP value, HODL value, net P&L, and the minimum fee APY needed to break even.

---

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `mode` | string | `scenario_sweep` | `auto` (CoinGecko), `manual` (custom ratio), `scenario_sweep` |
| `coinAId` | string | `ethereum` | CoinGecko ID for token A (auto mode) |
| `coinBId` | string | `bitcoin` | CoinGecko ID for token B (auto mode) |
| `initialPriceRatio` | number | — | B/A price ratio at entry (manual mode) |
| `currentPriceRatio` | number | — | B/A price ratio now (manual mode) |
| `initialLiquidityUsd` | number | `10000` | Initial USD deposited into the LP |
| `holdingPeriodDays` | number | `30` | Days held (for annualized breakeven fee calculation) |

---

### Output

| Field | Description |
|-------|-------------|
| `price_ratio` | Current price ratio vs entry |
| `il_pct` | Impermanent loss percentage |
| `lp_value_usd` | Current LP position value |
| `hodl_value_usd` | What HODL would be worth |
| `net_pnl_vs_hodl` | LP vs HODL dollar difference |
| `breakeven_fee_apy_pct` | Required fee APY to offset IL |

---

### Pricing

**$0.001 per calculation** (flat per run).

### Use Cases

- Evaluate whether a pool's fee APY justifies the IL risk
- Compare LP entry prices vs current for risk/reward decisions
- Stress-test portfolio against extreme price moves

# Actor input Schema

## `tokenACoingeckoId` (type: `string`):

CoinGecko ID for token A (e.g. 'ethereum', 'uniswap', 'bitcoin'). Leave blank to use manual price ratio instead.
## `tokenBCoingeckoId` (type: `string`):

CoinGecko ID for token B (e.g. 'tether', 'usd-coin'). Usually 'tether' for USD-denominated pools.
## `initialPriceRatio` (type: `number`):

Price of token A / price of token B when you entered the pool. Used to compute price change. Required if using manual mode or CoinGecko mode with a non-current entry price.
## `currentPriceRatio` (type: `number`):

Current price of token A / price of token B. Only used in manual mode (when CoinGecko IDs are not provided).
## `initialValueUsd` (type: `number`):

Total initial value deposited into the LP pool in USD.
## `feeApyPct` (type: `number`):

Annual percentage yield from trading fees for this pool (e.g. 10 = 10% APY). Used to calculate fee income that offsets IL. Set to 0 to ignore fees.
## `holdingDays` (type: `integer`):

Number of days you've held (or plan to hold) the LP position. Used to prorate fee income.
## `scenarioMode` (type: `boolean`):

If true, generate IL across 14 standard price change scenarios (from 0.1x to 10x) instead of a single point calculation. Useful for planning.

## Actor input object example

```json
{
  "initialValueUsd": 10000,
  "feeApyPct": 0,
  "holdingDays": 365,
  "scenarioMode": false
}
````

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("gochujang/lp-impermanent-loss").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("gochujang/lp-impermanent-loss").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call gochujang/lp-impermanent-loss --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=gochujang/lp-impermanent-loss",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LP Impermanent Loss Calculator",
        "description": "Calculate impermanent loss for Uniswap v2-style AMM pools. Auto-fetch current prices via CoinGecko or provide manual ratios. Compares LP vs HODL P&L, factors in fee income, generates scenario sweep. $0.001/calculation.",
        "version": "0.1",
        "x-build-id": "rRUc7KJz9mS1cpGaY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/gochujang~lp-impermanent-loss/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-gochujang-lp-impermanent-loss",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/gochujang~lp-impermanent-loss/runs": {
            "post": {
                "operationId": "runs-sync-gochujang-lp-impermanent-loss",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/gochujang~lp-impermanent-loss/run-sync": {
            "post": {
                "operationId": "run-sync-gochujang-lp-impermanent-loss",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "tokenACoingeckoId": {
                        "title": "Token A CoinGecko ID",
                        "type": "string",
                        "description": "CoinGecko ID for token A (e.g. 'ethereum', 'uniswap', 'bitcoin'). Leave blank to use manual price ratio instead."
                    },
                    "tokenBCoingeckoId": {
                        "title": "Token B CoinGecko ID",
                        "type": "string",
                        "description": "CoinGecko ID for token B (e.g. 'tether', 'usd-coin'). Usually 'tether' for USD-denominated pools."
                    },
                    "initialPriceRatio": {
                        "title": "Initial Price Ratio (A/B at entry)",
                        "type": "number",
                        "description": "Price of token A / price of token B when you entered the pool. Used to compute price change. Required if using manual mode or CoinGecko mode with a non-current entry price."
                    },
                    "currentPriceRatio": {
                        "title": "Current Price Ratio (A/B now)",
                        "type": "number",
                        "description": "Current price of token A / price of token B. Only used in manual mode (when CoinGecko IDs are not provided)."
                    },
                    "initialValueUsd": {
                        "title": "Initial LP Value (USD)",
                        "minimum": 1,
                        "type": "number",
                        "description": "Total initial value deposited into the LP pool in USD.",
                        "default": 10000
                    },
                    "feeApyPct": {
                        "title": "Fee APY (%)",
                        "minimum": 0,
                        "type": "number",
                        "description": "Annual percentage yield from trading fees for this pool (e.g. 10 = 10% APY). Used to calculate fee income that offsets IL. Set to 0 to ignore fees.",
                        "default": 0
                    },
                    "holdingDays": {
                        "title": "Holding Period (days)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Number of days you've held (or plan to hold) the LP position. Used to prorate fee income.",
                        "default": 365
                    },
                    "scenarioMode": {
                        "title": "Scenario Mode",
                        "type": "boolean",
                        "description": "If true, generate IL across 14 standard price change scenarios (from 0.1x to 10x) instead of a single point calculation. Useful for planning.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
