PVGO calculator
A share quoted at 50 with earnings per share of 4 and a required return of 0.10 has a no-growth value of 40, so 10 of its price is the present value of growth opportunities. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Share price
- 50
- Eps
- 4
- Required return
- 0.1
- No growth value
- 40
- Pvgo
- 10
The present value of growth opportunities, almost always abbreviated PVGO, is the slice of a listed share price that cannot be explained by treating current earnings as a no-growth perpetuity. This PVGO calculator accepts the current share price, earnings per share, and the required return as a decimal fraction, then returns PVGO as share price minus EPS divided by required return. A positive result means the market is paying for future projects that earn above the cost of equity; a result of zero describes a no-growth stock whose quote equals capitalized earnings.
What PVGO measures and how the identity is formed
Equity valuation splits a quoted share price into two stories. The first story is a no-growth firm that pays out all earnings forever: its value is earnings per share capitalized at the required return, EPS divided by r. The second story is everything the market is willing to pay above that floor: the present value of growth opportunities, or PVGO.
Searchers who type pvgo calculator want that residual, not a full discounted-cash-flow engine, not a period-over-period EPS growth rate, and not a compound future-value projection. The identity is one subtraction. Take the current share price P0, subtract the no-growth value EPS divided by the required return, and the difference is PVGO.
A textbook case is a fifty-dollar quote, four dollars of earnings per share, and a required return of 0.10: the no-growth value is forty, so PVGO is ten. If the quote already equals capitalized earnings, PVGO is zero and the stock is priced as a no-growth perpetuity. A negative PVGO means the market is quoting the shares below capitalized current earnings, which can happen when investors expect earnings to shrink, capital to be wasted, or risk to be higher than the r you typed.
The required return is the cost of equity as a decimal fraction: enter 0.10 for ten percent, not 10. Entering ten would treat r as one thousand percent and collapse the no-growth value. This calculator does not forecast a growth rate g, does not take a payout ratio, and does not look up a ticker: you already have the three numbers, and it applies one deterministic division and one subtraction so a browser check and a production job never disagree.
What you can do with it
Equity-research residual screens
Turn a quoted share price, an EPS print, and a cost of equity into PVGO for a ticker note, a dashboard cell, or a screening column without opening a spreadsheet.
CFA and classroom valuation drills
Let students enter P0, EPS, and r as a decimal and see the no-growth value plus PVGO, including a clear failure when the required return is zero.
Investor-education widgets
Show readers how much of a listed price is capitalized current earnings versus the present value of growth opportunities, using the same identity a textbook prints.
FAQ
How is PVGO calculated?
Subtract the no-growth value from the share price. The result is pvgo after half-up rounding to ten places, together with the echoed inputs and the formula string.
Is the required return a percent or a decimal fraction?
Enter a decimal fraction, not percent points: 0.10 means a ten percent cost of equity. Typing 10 would treat r as one thousand percent and collapse the no-growth value.
Can PVGO be negative, and can EPS be a loss?
Yes. Negative PVGO means the quote sits below capitalized current earnings. Zero or negative EPS is allowed and produces a zero or negative no-growth value. This is the PVGO identity, not a multi-year DCF; use a dedicated intrinsic-value tool for a cash-flow path.
What does a positive PVGO tell me?
That the market is paying for future projects it expects to earn more than the cost of equity. A PVGO of zero means the price equals capitalized current earnings, so the stock is valued as if it will never grow.
Do I need a growth rate or a payout ratio?
No. You only need the share price, the earnings per share and the required return. The calculator does not forecast growth, does not use a payout ratio and does not look up a ticker.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/fin/pvgo \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"share_price":50,"eps":4,"required_return":0.1}'const res = await fetch("https://api.kit.forhosting.com/fin/pvgo", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"share_price": 50,
"eps": 4,
"required_return": 0.1
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/pvgo",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"share_price": 50,
"eps": 4,
"required_return": 0.1
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/pvgo", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"share_price":50,"eps":4,"required_return":0.1}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"share_price":50,"eps":4,"required_return":0.1}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/pvgo", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"share_price": 50,
"eps": 4,
"required_return": 0.1
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.pvgo",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_abs_value | 1000000000000000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Required return of exactly zero is rejected with invalid_input, because the no-growth value is undefined.
Input contract, response shape, and the zero-return guard
Share price and EPS have no such restriction; zero and negative EPS (a reported loss) are valid and simply produce a negative no-growth value, which lifts PVGO above the quote. Keep the required return as a decimal so tests pin 0.10 rather than a localized percent string. Do not send a growth rate, a payout, or a share count: this landing does not run Gordon growth and does not reconstruct EPS from net income. Pair the three figures in the same currency and the same per-share convention so the residual compares like with like. POST a JSON body with three required finite numbers: share_price (the current market price per share P0; aliases price, p0, stock_price, market_price), eps (earnings per share in the same currency; aliases earnings_per_share, earnings), and required_return (the cost of equity as a decimal fraction, for example 0.10 for ten percent; aliases r, cost_of_equity, discount_rate). Each field may arrive as a JSON number or as a numeric string. Missing fields, empty strings, booleans, non-finite values, and magnitudes above the declared limit fail with invalid_input naming the field and are not billed. On success the body echoes share_price, eps, and required_return as parsed, reports no_growth_value as EPS over r rounded half-up to ten decimals, reports pvgo as price minus that no-growth value rounded the same way, and includes a short formula string restating pvgo = share_price - eps / required_return.
Where a PVGO calculator earns its keep
Educators teaching residual valuation can seed examples that show a fifty-dollar quote, four dollars of EPS, and r of 0.10 as PVGO of ten; a quote that already equals EPS over r as PVGO of zero; and the hard fail when someone types a required return of zero. Failed validation, including the zero required-return case, does not consume balance. Use a dedicated DCF tool when the question is intrinsic value from a cash-flow path, and keep this page for the PVGO identity that searchers actually type. Because the implementation is tier A parse, every successful call costs the published $0.002 base price with no model tokens and no outbound network. Keep required_return non-zero and in decimal form, pin the rounded pvgo field in tests, and you get reproducible present-value-of-growth-opportunities results for widgets, CMS embeds, and edge workers without standing up a research terminal of your own.
Technical questions
What happens if the required return is zero?
The task fails with invalid_input. PVGO is undefined when the required return is zero because earnings cannot be capitalized as a perpetuity; enter a non-zero required_return as a decimal. Failed validation is not billed.
What does the PVGO calculator cost?
The browser tool is free. API requests use prepaid balance at $0.002 per successful call; invalid input, including a required return of zero, is not billed.