The finance developer workbenchSearch the reference Development · 0.1.4 · unpublished

Learn / analyze a strategy

Analyze a bull call spread

Two explicitly priced legs, one expiry. The chart is net profit or loss, not option value. Premiums are per share; the contract multiplier is 100.

Try it

Sample data

Two explicitly priced legs, one expiry. The chart is net profit or loss, not option value. Premiums are per share; the contract multiplier is 100.

Loading the local calculator. The verified sample is displayed below.

Net debit400USD / spread
Maximum profit600USD
Maximum loss-400USD
Break-even104USD underlying
Profit / loss at expiration
-400-15010035060080132Underlying price · USD

Bull call spreadNet P&L · USD / spread

Exact chart data
SeriesUnderlying price · USDNet P&L · USD / spread
Bull call spread80-400
Bull call spread80.52-400
Bull call spread81.04-400
Bull call spread81.56-400
Bull call spread82.08-400
Bull call spread82.6-400
Bull call spread83.12-400
Bull call spread83.64-400
Bull call spread84.16-400
Bull call spread84.68-400
Bull call spread85.2-400
Bull call spread85.72-400
Bull call spread86.24-400
Bull call spread86.76-400
Bull call spread87.28-400
Bull call spread87.8-400
Bull call spread88.32-400
Bull call spread88.84-400
Bull call spread89.36-400
Bull call spread89.88-400
Bull call spread90.4-400
Bull call spread90.92-400
Bull call spread91.44-400
Bull call spread91.96000000000001-400
Bull call spread92.48-400
Bull call spread93-400
Bull call spread93.52-400
Bull call spread94.04-400
Bull call spread94.56-400
Bull call spread95.08-400
Bull call spread95.6-400
Bull call spread96.12-400
Bull call spread96.64-400
Bull call spread97.16-400
Bull call spread97.68-400
Bull call spread98.2-400
Bull call spread98.72-400
Bull call spread99.24000000000001-400
Bull call spread99.76-400
Bull call spread100.28-371.9999999999999
Bull call spread100.8-320.0000000000002
Bull call spread101.32-268.0000000000007
Bull call spread101.84-215.99999999999966
Bull call spread102.36-164.00000000000006
Bull call spread102.88-112.00000000000045
Bull call spread103.4-59.99999999999943
Bull call spread103.92-7.9999999999998295
Bull call spread104.4443.99999999999977
Bull call spread104.9600000000000196.0000000000008
Bull call spread105.48148.0000000000004
Bull call spread106200
Bull call spread106.52251.9999999999996
Bull call spread107.03999999999999303.9999999999992
Bull call spread107.56356.0000000000002
Bull call spread108.08407.99999999999983
Bull call spread108.6459.99999999999943
Bull call spread109.12512.0000000000005
Bull call spread109.64564
Bull call spread110.16600
Bull call spread110.68600
Bull call spread111.2600
Bull call spread111.72600
Bull call spread112.24000000000001600
Bull call spread112.75999999999999600
Bull call spread113.28600
Bull call spread113.80000000000001600
Bull call spread114.32600
Bull call spread114.84600
Bull call spread115.36600
Bull call spread115.88600
Bull call spread116.4599.9999999999999
Bull call spread116.92600
Bull call spread117.44600
Bull call spread117.96000000000001600.0000000000001
Bull call spread118.48600
Bull call spread119600
Bull call spread119.52000000000001599.9999999999999
Bull call spread120.03999999999999599.9999999999999
Bull call spread120.56600
Bull call spread121.08600
Bull call spread121.6600.0000000000001
Bull call spread122.12600
Bull call spread122.64600
Bull call spread123.16600
Bull call spread123.68600
Bull call spread124.2600
Bull call spread124.72600
Bull call spread125.24000000000001600
Bull call spread125.76600
Bull call spread126.28600
Bull call spread126.80000000000001599.9999999999998
Bull call spread127.32599.9999999999998
Bull call spread127.84600
Bull call spread128.36600
Bull call spread128.88600
Bull call spread129.4600
Bull call spread129.92000000000002600.0000000000002
Bull call spread130.44600.0000000000002
Bull call spread130.96600
Bull call spread131.48000000000002600
Bull call spread132600
Assumptions & conventions
{
  "model": "piecewise-linear expiration payoff",
  "contractMultiplier": 100,
  "premiums": "user-supplied",
  "costs": "no commissions or slippage included",
  "currency": "USD"
}
Diagnostics & warnings
{
  "warnings": [
    "Sample premiums are hypothetical, not market quotes. Expiration payoff is not the mark-to-market value before expiration."
  ]
}
Full result · JSON
{
  "netDebit": 400,
  "netCredit": -400,
  "maxProfit": 600,
  "maxLoss": -400,
  "bounded": {
    "profit": true,
    "loss": true
  },
  "breakevens": [
    104
  ],
  "points": [
    {
      "underlyingPrice": 80,
      "pnl": -400
    },
    {
      "underlyingPrice": 80.52,
      "pnl": -400
    },
    {
      "underlyingPrice": 81.04,
      "pnl": -400
    },
    {
      "underlyingPrice": 81.56,
      "pnl": -400
    },
    {
      "underlyingPrice": 82.08,
      "pnl": -400
    },
    {
      "underlyingPrice": 82.6,
      "pnl": -400
    },
    {
      "underlyingPrice": 83.12,
      "pnl": -400
    },
    {
      "underlyingPrice": 83.64,
      "pnl": -400
    },
    {
      "underlyingPrice": 84.16,
      "pnl": -400
    },
    {
      "underlyingPrice": 84.68,
      "pnl": -400
    },
    {
      "underlyingPrice": 85.2,
      "pnl": -400
    },
    {
      "underlyingPrice": 85.72,
      "pnl": -400
    },
    {
      "underlyingPrice": 86.24,
      "pnl": -400
    },
    {
      "underlyingPrice": 86.76,
      "pnl": -400
    },
    {
      "underlyingPrice": 87.28,
      "pnl": -400
    },
    {
      "underlyingPrice": 87.8,
      "pnl": -400
    },
    {
      "underlyingPrice": 88.32,
      "pnl": -400
    },
    {
      "underlyingPrice": 88.84,
      "pnl": -400
    },
    {
      "underlyingPrice": 89.36,
      "pnl": -400
    },
    {
      "underlyingPrice": 89.88,
      "pnl": -400
    },
    {
      "underlyingPrice": 90.4,
      "pnl": -400
    },
    {
      "underlyingPrice": 90.92,
      "pnl": -400
    },
    {
      "underlyingPrice": 91.44,
      "pnl": -400
    },
    {
      "underlyingPrice": 91.96000000000001,
      "pnl": -400
    },
    {
      "underlyingPrice": 92.48,
      "pnl": -400
    },
    {
      "underlyingPrice": 93,
      "pnl": -400
    },
    {
      "underlyingPrice": 93.52,
      "pnl": -400
    },
    {
      "underlyingPrice": 94.04,
      "pnl": -400
    },
    {
      "underlyingPrice": 94.56,
      "pnl": -400
    },
    {
      "underlyingPrice": 95.08,
      "pnl": -400
    },
    {
      "underlyingPrice": 95.6,
      "pnl": -400
    },
    {
      "underlyingPrice": 96.12,
      "pnl": -400
    },
    {
      "underlyingPrice": 96.64,
      "pnl": -400
    },
    {
      "underlyingPrice": 97.16,
      "pnl": -400
    },
    {
      "underlyingPrice": 97.68,
      "pnl": -400
    },
    {
      "underlyingPrice": 98.2,
      "pnl": -400
    },
    {
      "underlyingPrice": 98.72,
      "pnl": -400
    },
    {
      "underlyingPrice": 99.24000000000001,
      "pnl": -400
    },
    {
      "underlyingPrice": 99.76,
      "pnl": -400
    },
    {
      "underlyingPrice": 100.28,
      "pnl": -371.9999999999999
    },
    {
      "underlyingPrice": 100.8,
      "pnl": -320.0000000000002
    },
    {
      "underlyingPrice": 101.32,
      "pnl": -268.0000000000007
    },
    {
      "underlyingPrice": 101.84,
      "pnl": -215.99999999999966
    },
    {
      "underlyingPrice": 102.36,
      "pnl": -164.00000000000006
    },
    {
      "underlyingPrice": 102.88,
      "pnl": -112.00000000000045
    },
    {
      "underlyingPrice": 103.4,
      "pnl": -59.99999999999943
    },
    {
      "underlyingPrice": 103.92,
      "pnl": -7.9999999999998295
    },
    {
      "underlyingPrice": 104.44,
      "pnl": 43.99999999999977
    },
    {
      "underlyingPrice": 104.96000000000001,
      "pnl": 96.0000000000008
    },
    {
      "underlyingPrice": 105.48,
      "pnl": 148.0000000000004
    },
    {
      "underlyingPrice": 106,
      "pnl": 200
    },
    {
      "underlyingPrice": 106.52,
      "pnl": 251.9999999999996
    },
    {
      "underlyingPrice": 107.03999999999999,
      "pnl": 303.9999999999992
    },
    {
      "underlyingPrice": 107.56,
      "pnl": 356.0000000000002
    },
    {
      "underlyingPrice": 108.08,
      "pnl": 407.99999999999983
    },
    {
      "underlyingPrice": 108.6,
      "pnl": 459.99999999999943
    },
    {
      "underlyingPrice": 109.12,
      "pnl": 512.0000000000005
    },
    {
      "underlyingPrice": 109.64,
      "pnl": 564
    },
    {
      "underlyingPrice": 110.16,
      "pnl": 600
    },
    {
      "underlyingPrice": 110.68,
      "pnl": 600
    },
    {
      "underlyingPrice": 111.2,
      "pnl": 600
    },
    {
      "underlyingPrice": 111.72,
      "pnl": 600
    },
    {
      "underlyingPrice": 112.24000000000001,
      "pnl": 600
    },
    {
      "underlyingPrice": 112.75999999999999,
      "pnl": 600
    },
    {
      "underlyingPrice": 113.28,
      "pnl": 600
    },
    {
      "underlyingPrice": 113.80000000000001,
      "pnl": 600
    },
    {
      "underlyingPrice": 114.32,
      "pnl": 600
    },
    {
      "underlyingPrice": 114.84,
      "pnl": 600
    },
    {
      "underlyingPrice": 115.36,
      "pnl": 600
    },
    {
      "underlyingPrice": 115.88,
      "pnl": 600
    },
    {
      "underlyingPrice": 116.4,
      "pnl": 599.9999999999999
    },
    {
      "underlyingPrice": 116.92,
      "pnl": 600
    },
    {
      "underlyingPrice": 117.44,
      "pnl": 600
    },
    {
      "underlyingPrice": 117.96000000000001,
      "pnl": 600.0000000000001
    },
    {
      "underlyingPrice": 118.48,
      "pnl": 600
    },
    {
      "underlyingPrice": 119,
      "pnl": 600
    },
    {
      "underlyingPrice": 119.52000000000001,
      "pnl": 599.9999999999999
    },
    {
      "underlyingPrice": 120.03999999999999,
      "pnl": 599.9999999999999
    },
    {
      "underlyingPrice": 120.56,
      "pnl": 600
    },
    {
      "underlyingPrice": 121.08,
      "pnl": 600
    },
    {
      "underlyingPrice": 121.6,
      "pnl": 600.0000000000001
    },
    {
      "underlyingPrice": 122.12,
      "pnl": 600
    },
    {
      "underlyingPrice": 122.64,
      "pnl": 600
    },
    {
      "underlyingPrice": 123.16,
      "pnl": 600
    },
    {
      "underlyingPrice": 123.68,
      "pnl": 600
    },
    {
      "underlyingPrice": 124.2,
      "pnl": 600
    },
    {
      "underlyingPrice": 124.72,
      "pnl": 600
    },
    {
      "underlyingPrice": 125.24000000000001,
      "pnl": 600
    },
    {
      "underlyingPrice": 125.76,
      "pnl": 600
    },
    {
      "underlyingPrice": 126.28,
      "pnl": 600
    },
    {
      "underlyingPrice": 126.80000000000001,
      "pnl": 599.9999999999998
    },
    {
      "underlyingPrice": 127.32,
      "pnl": 599.9999999999998
    },
    {
      "underlyingPrice": 127.84,
      "pnl": 600
    },
    {
      "underlyingPrice": 128.36,
      "pnl": 600
    },
    {
      "underlyingPrice": 128.88,
      "pnl": 600
    },
    {
      "underlyingPrice": 129.4,
      "pnl": 600
    },
    {
      "underlyingPrice": 129.92000000000002,
      "pnl": 600.0000000000002
    },
    {
      "underlyingPrice": 130.44,
      "pnl": 600.0000000000002
    },
    {
      "underlyingPrice": 130.96,
      "pnl": 600
    },
    {
      "underlyingPrice": 131.48000000000002,
      "pnl": 600
    },
    {
      "underlyingPrice": 132,
      "pnl": 600
    }
  ]
}

Use it in your project

Returns a payoff report with named summary fields and an ordinary points array. Each point has underlyingPrice and pnl; amounts include the 100-share multiplier and premiums. These five explicit prices sample the same position as the chart.

import { legs, strategy } from '@insiderfinance/totalfinance/strategy';

const position = strategy([
  legs.call({ strike: 100, premium: 6, quantity: 1 }),
  legs.call({ strike: 110, premium: 2, quantity: -1 }),
], { multiplier: 100 });
const underlyingPrices = [80,90,100,110,132];
const result = position.payoff({ prices: underlyingPrices });
console.log(result);

Output of this example

{
  "netDebit": 400,
  "netCredit": -400,
  "maxProfit": 600,
  "maxLoss": -400,
  "bounded": {
    "profit": true,
    "loss": true
  },
  "breakevens": [
    104
  ],
  "points": [
    {
      "underlyingPrice": 80,
      "pnl": -400
    },
    {
      "underlyingPrice": 90,
      "pnl": -400
    },
    {
      "underlyingPrice": 100,
      "pnl": -400
    },
    {
      "underlyingPrice": 110,
      "pnl": 600
    },
    {
      "underlyingPrice": 132,
      "pnl": 600
    }
  ]
}
Reproduce this entire playground

This complete example reproduces every chart point and the full playground result. Sample generation and chart mapping are example setup, not required conversions of library outputs.

import { legs, strategy } from '@insiderfinance/totalfinance/strategy';

const position = strategy([
  legs.call({ strike: 100, premium: 6, quantity: 1 }),
  legs.call({ strike: 110, premium: 2, quantity: -1 }),
], { multiplier: 100 });
const result = position.payoff({ prices: { from: 80, to: 132, steps: 101 } });
console.log(result);

Both examples use the last successfully calculated inputs. The first call may show fewer scenarios or selected report fields, as labeled above. Displayed metrics are rounded; copied calculations retain exact values.

Before expiry, explore price and volatility scenarios. An expiration payoff is a different question from a mark-to-market value.

Continue with the full API reference or the API levels guide.