Graham number calculator
With earnings of 2.5 per share and a book value of 20 per share, Graham's price ceiling is 33.54, the square root of 22.5 × 2.5 × 20. Compare it with the market price to see whether a stock trades above what Graham would defend. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Earnings per share
- 2.5
- Book value per share
- 20
- Product
- 1,125
- Graham number
- 33.54
The Graham number is Benjamin Graham's maximum defensible price for a common stock: the square root of 22.5 times earnings per share times book value per share. Value investors, screeners, and student-analysts use that ceiling to flag names trading above a conservative combination of a 15 times earnings multiple and a 1.5 times book multiple, the product that produces the famous 22.5 constant. Zero earnings or zero book value is allowed and yields a Graham number of zero.
What the Graham number means and how 22.5 becomes a price ceiling
The Graham number is a conservative price ceiling for a common stock, taken from Benjamin Graham's value-investing rules of thumb: a no-growth company should not trade above a price-to-earnings multiple of fifteen, and it should not trade above a price-to-book multiple of one and a half. A stock trading above the Graham number is, on this screen, more expensive than Graham would defend; a stock trading below it still has to pass qualitative work, because the formula is a ceiling, not a buy list.
Earnings per share is the trailing or forward profit that belongs to each ordinary share, in one currency. Book value per share is shareholders' equity divided by the same share count, in that same currency. A two-point-five earnings figure and a twenty book-value figure produce a product of 22.5 times 2.5 times 20, which is 1125, and a Graham number of 33.54 after half-up rounding to two decimal places.
Zero earnings or zero book value is a legitimate outcome and returns a price ceiling of zero rather than an error: Graham's screen says there is no defensible positive price when either factor is missing. You supply two finite non-negative numbers that already share one period and one currency; the calculator multiplies them by 22.5, takes the square root, and rounds the ceiling half-up to two decimal places so goldens compare byte-for-byte across runtimes.
This is Graham's 22.5 screen, not a PEG ratio, not a dividend-discount model, and not an enterprise-value multiple.
Where a Graham number calculator earns its keep
Screeners and value-investing clubs use a Graham number calculator to turn last year's earnings per share and book value per share into one comparable price ceiling before they open a full 10-K. Portfolio tools drop EPS from the trailing statement and book value from the latest equity line, and they flag names whose last trade sits above the ceiling without pretending the formula is a discounted-cash-flow target.
This is a different search and a different job from a PEG ratio, from a dividend-discount model, from an earnings-per-share calculator, and from a times-earnings business valuation: those tools scale growth, discount a perpetual dividend, divide profit by shares, or apply an industry multiple to a whole company. A Graham number prices one share against Graham's 15 times 1.5 bound. Failed validation does not consume balance.
Keep both inputs non-negative, pin the rounded ceiling in tests, and you get a reproducible Graham number for teasers, LMS plugins, and edge workers without standing up a valuation engine of your own.
What you can do with it
Value screen before reading the 10-K
Turn trailing earnings per share and book value per share into one Graham price ceiling before you spend a weekend on the annual report.
Classroom and CFA-style homework
Let students submit EPS and book value per share and verify the ordered radical √(22.5 × EPS × BVPS) against the textbook method.
FAQ
How is the Graham number calculated?
The constant 22.5 is Graham's 15× earnings limit times his 1.5× book limit. The ceiling is rounded half-up to two decimal places; product (the value inside the radical) is rounded half-up to six.
What happens if earnings per share or book value per share is negative?
A negative factor would put a negative number under the square root, which is not a real price ceiling, and those failures are not billed.
What should I enter as earnings per share?
Use basic or diluted, trailing twelve months or next-year, whichever matches the book figure you apply. The calculator does not rebuild the income statement or look up a quote.
Is this the same as intrinsic value or a discounted-cash-flow target?
No. The Graham number is a conservative price ceiling from a 15× earnings bound times a 1.5× book bound. Intrinsic value from a dividend-discount model or a discounted-cash-flow path is a different search and a different job. A name below the Graham number still needs qualitative work; the formula is a screen, not a buy list.
What does it mean if a stock trades above the Graham number?
On this screen it is more expensive than Graham would defend: its earnings and book multiples cannot both stay inside his limits. A price below the ceiling is not a buy signal on its own; the business still needs proper research.
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/graham-number \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"earnings_per_share":2.5,"book_value_per_share":20}'const res = await fetch("https://api.kit.forhosting.com/fin/graham-number", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"earnings_per_share": 2.5,
"book_value_per_share": 20
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/graham-number",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"earnings_per_share": 2.5,
"book_value_per_share": 20
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/graham-number", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"earnings_per_share":2.5,"book_value_per_share":20}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"earnings_per_share":2.5,"book_value_per_share":20}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/graham-number", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"earnings_per_share": 2.5,
"book_value_per_share": 20
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.graham_number",
"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.
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
This Graham number calculator takes two finite numbers in the same currency — earnings_per_share and book_value_per_share — multiplies them by 22.5, takes the positive square root, and returns the price ceiling together with the product inside the radical and the formula shown beside the result. Either input that is negative is rejected with invalid_input and is not billed, because a square root of a negative product is not a real price ceiling.
What the Graham number means and how 22.5 becomes a price ceiling
Multiplying those two limits gives the constant 22.5, and rearranging price over earnings times price over book into a single identity yields graham_number equals the square root of 22.5 times earnings_per_share times book_value_per_share. That square root is the highest price at which both the earnings multiple and the book multiple stay inside Graham's bounds at once. Negative earnings and negative book value are not legitimate inputs for this radical: the square root of a negative product is not a real price, so the task fails with invalid_input. This calculator does not look up a live quote, does not apply a margin of safety haircut, does not annualise a stub period, does not convert currencies, and does not compute a discounted-cash-flow value.
Input contract, response shape, and error behaviour
Zero is allowed on either field and produces a Graham number of zero: a company with no earnings or no book equity has a price ceiling of zero on this screen, which is the honest result rather than a clamped dummy price. Keep both numbers in one unit so the ceiling is a price in that same unit. POST a JSON body with two required finite numbers. earnings_per_share is trailing or forward earnings that belong to each ordinary share, in one currency unit; aliases eps and earnings map to the same field so a screener worksheet can keep its column names. book_value_per_share is shareholders' equity per ordinary share in that same currency; aliases bvps, book_value, and book are accepted. Each numeric field may arrive as a JSON number or a numeric string. Missing fields, empty strings, and non-finite values fail with invalid_input naming the field. On success the body echoes earnings_per_share and book_value_per_share, then reports product as 22.5 times those two numbers (the value inside the square root), graham_number as the price ceiling rounded half-up to two decimal places, and a formula string restating the identity. Example: earnings_per_share of 2.5 and book_value_per_share of 20 yield a product of 1125 and a Graham number of 33.54. Pair the JSON with your own rule for which EPS definition matches the book figure you chose — trailing twelve months, diluted, or forward — because this endpoint multiplies the two numbers you send; it does not rebuild the income statement, choose a share count, or convert currencies.
Where a Graham number calculator earns its keep
Student-analysts re-run the same two fields when a year closes or a split adjusts the share count, then pin graham_number next to the market quote so every discussion starts from one defensible price rather than a hand-waved multiple.
Integration use cases
Watchlist ceiling versus last trade
Pin graham_number next to the last trade so a watchlist flags names sitting above Graham's 15 × 1.5 bound without a live quote feed.
Technical questions
What does the Graham number calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.