Equity Markets and Stock Instruments › Stock Prices and Quotes

Michael BrenndoerferNovember 2, 20259 min read
Quantitative FinanceAll chapters
Part 2 of 15Equity and Fixed Income Markets
Chapter 10Equity Markets and Stock Instruments › Stock Prices and Quotes
Reading section 4 of 11 · Stock Prices and Quotes · 9 minSection 4 of 11 · 9 min

Book contents

Section 4 of 11 · 9 min read

Equity Markets and Stock Instruments › Stock Prices and QuotesOne section · Sections in this chapter4 / 11 ↓
Reading tools Definitions & inline links

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Article links

Make inline references clickable

A stock’s last traded price records the price of a completed transaction, while bid and ask quotes describe prices available for specified quantities. These observations reflect trading decisions, not agreement by every participant on fair value. A price is not a fixed property of a stock but the result of continuous negotiation between buyers and sellers. Understanding how prices are quoted, what they represent, and how they must be adjusted for corporate actions is essential for any quantitative analysis.

Reading a Stock Quote

A stock quote provides a snapshot of current trading information, condensing the state of the order book and recent trading activity into a digestible summary. Key elements include:

  • Last price: The most recent transaction price
  • Bid: The highest price someone is willing to pay (with bid size)
  • Ask: The lowest price someone is willing to accept (with ask size)
  • Volume: Total shares traded during the session
  • Open/High/Low/Close (OHLC): Summary statistics for a specified trading session, using the exchange or data feed’s definitions of the opening and closing fields
  • Previous close: The preceding trading session’s closing price, used to calculate daily change
In[12]:
Code
# Using sample data for reproducibility
# For live data, you would use a financial data API
import pandas as pd

dates = pd.bdate_range(start="2024-01-02", periods=5)
hist = pd.DataFrame(
    {
        "Open": [178.50, 179.20, 177.80, 180.10, 179.50],
        "High": [180.20, 181.50, 179.90, 182.30, 181.80],
        "Low": [177.80, 178.90, 176.50, 179.80, 178.90],
        "Close": [179.80, 180.50, 178.20, 181.90, 180.70],
        "Volume": [52000000, 48000000, 61000000, 55000000, 49000000],
    },
    index=dates,
)
Out[13]:
Console
Synthetic OHLCV Example (Not Actual AAPL Data)
======================================================================
               Open     High      Low    Close Volume
2024-01-02  $178.50  $180.20  $177.80  $179.80  52.0M
2024-01-03  $179.20  $181.50  $178.90  $180.50  48.0M
2024-01-04  $177.80  $179.90  $176.50  $178.20  61.0M
2024-01-05  $180.10  $182.30  $179.80  $181.90  55.0M
2024-01-08  $179.50  $181.80  $178.90  $180.70  49.0M

These handcrafted OHLCV rows demonstrate the format of a price table; they are not measured Apple observations. A valid OHLC bar has its open and close within its low-to-high range. Volume summarizes shares traded but does not, by itself, identify which trades came from institutions.

The Bid-Ask Spread

The bid-ask spread is the difference between the best ask and best bid prices. It represents the transaction cost of immediate execution and the compensation to liquidity providers. More fundamentally, the spread reflects the cost of the market-making function: someone must stand ready to trade, and they demand compensation for that service.

The spread captures the round-trip cost of trading: if you buy at the ask and immediately sell at the bid, you lose the spread amount. Narrow spreads indicate competitive, liquid markets. Wide spreads suggest illiquidity or uncertainty that discourages market makers.

Spread=Pask−Pbid\text{Spread} = P_{ask} - P_{bid}

where:

  • PaskP_{ask}: the best (lowest) ask price, which is the minimum price at which sellers are willing to sell
  • PbidP_{bid}: the best (highest) bid price, which is the maximum price at which buyers are willing to buy

This simple formula masks considerable economic content. The spread exists because market makers face costs: they must hold inventory that might lose value, they risk trading against better-informed counterparties, and they incur operational costs. The spread compensates them for bearing these risks and costs.

The spread is often expressed as a percentage of the midpoint price:

Spread %=Pask−Pbid(Pask+Pbid)/2×100\text{Spread \%} = \frac{P_{ask} - P_{bid}}{(P_{ask} + P_{bid})/2} \times 100

where all variables are as defined above, and:

  • (Pask+Pbid)/2(P_{ask} + P_{bid})/2: the midpoint price, a reference halfway between the displayed bid and ask, not a guarantee of fair value

Using the midpoint as the denominator makes the percentage spread comparable across stocks at different price levels. A $0.05 spread on a $10 stock (0.5%) represents a much higher transaction cost than on a $100 stock (0.05%). This normalization is essential for comparing liquidity across the market and identifying stocks where transaction costs might erode strategy profits.

Spread width depends on several factors:

  • Liquidity: Other things equal, more liquid shares typically have narrower spreads; low trading activity and limited depth can accompany wider spreads.
  • Volatility: Greater uncertainty can lead liquidity providers to quote wider spreads or smaller quantities to manage inventory risk.
  • Information asymmetry: If informed traders are present, market makers widen spreads to avoid adverse selection
  • Tick size: Minimum quoting increments constrain displayed prices. Applicable rules depend on the security, quotation price and implementation date; executions can also receive price improvement.

For a dated US example, the SEC adopted a half-cent quoting increment for certain NMS stocks in 2024, then extended relief from the amended Rule 612 compliance date until the first business day of November 2027 in its June 11, 2026 order. That is not a claim that the new increment was already generally implemented when this chapter was reviewed. Check the SEC’s June 2026 statement and linked order before configuring live order validation.

In[14]:
Code
import pandas as pd

# Analyze spread characteristics across different stocks
# Sample spread data for demonstration
# For live data, you would use a financial data API
spread_df = pd.DataFrame(
    [
        {
            "Ticker": "AAPL",
            "Bid": 179.50,
            "Ask": 179.52,
            "Spread": 0.02,
            "Spread_Pct": 0.011,
            "Avg_Volume": 55000000,
        },
        {
            "Ticker": "MSFT",
            "Bid": 378.20,
            "Ask": 378.25,
            "Spread": 0.05,
            "Spread_Pct": 0.013,
            "Avg_Volume": 22000000,
        },
        {
            "Ticker": "SPY",
            "Bid": 450.10,
            "Ask": 450.11,
            "Spread": 0.01,
            "Spread_Pct": 0.002,
            "Avg_Volume": 85000000,
        },
        {
            "Ticker": "GME",
            "Bid": 15.80,
            "Ask": 15.85,
            "Spread": 0.05,
            "Spread_Pct": 0.316,
            "Avg_Volume": 3500000,
        },
        {
            "Ticker": "BRK-B",
            "Bid": 365.50,
            "Ask": 365.60,
            "Spread": 0.10,
            "Spread_Pct": 0.027,
            "Avg_Volume": 3200000,
        },
    ]
)
Out[15]:
Console
Bid-Ask Spread Comparison
======================================================================
AAPL   | Bid: $  179.50 | Ask: $  179.52 | Spread: $0.02 (0.011%) | Vol: 55.0M
MSFT   | Bid: $  378.20 | Ask: $  378.25 | Spread: $0.05 (0.013%) | Vol: 22.0M
SPY    | Bid: $  450.10 | Ask: $  450.11 | Spread: $0.01 (0.002%) | Vol: 85.0M
GME    | Bid: $   15.80 | Ask: $   15.85 | Spread: $0.05 (0.316%) | Vol: 3.5M
BRK-B  | Bid: $  365.50 | Ask: $  365.60 | Spread: $0.10 (0.027%) | Vol: 3.2M

Average Spread: 0.074%
Out[16]:
Visualization
Scatter plot on a logarithmic x-axis showing five stocks labeled with their tickers. High-volume stocks like SPY and AAPL cluster in the lower right with tight spreads, while lower-volume stocks like GME sit in the upper left with wider spreads.
Relationship between average daily trading volume and bid-ask spread percentage. The synthetic observations illustrate how spread percentages can be compared with volume; they do not establish a measured causal relationship.

In these synthetic rows, the observations labelled AAPL and SPY have smaller percentage spreads than GME. The chart demonstrates the comparison, not a causal estimate or a current liquidity ranking of those securities. Actual spreads reflect several influences, including displayed competition, inventory risk, informed trading and the applicable quoting rules.

Corporate Actions and Price Adjustments

Stock prices require adjustment for corporate actions to create consistent time series. Without the appropriate adjustments, return calculations spanning corporate actions can be misleading. A stock that split 10-for-1 would appear to have crashed 90%, when in fact shareholders were made whole through additional shares. The most common adjustments involve:

Stock splits divide existing shares into more shares. In a 2-for-1 split, each shareholder receives an additional share, and the price halves. A 200stockbecomes200 stock becomes 100, but total value remains unchanged. Historical prices must be adjusted downward to maintain comparability. Otherwise, a return calculation spanning a split would show a spurious loss.

Dividends distribute cash to shareholders. For an ordinary cash dividend, the theoretical ex-dividend price is lower by the dividend amount, all else equal. Actual prices also reflect other news and market movements. For total return analysis, dividends must be added back. For price analysis, adjustment factors account for the drop. This distinction matters: price-only series understate the returns that investors received.

Spin-offs and mergers require checking the data provider's corporate-action rules. The adjustment depends on the cash or securities distributed and, for an exchange of shares, the applicable exchange ratio. Compare those rules before combining adjusted price series from different providers.

In[17]:
Code
import numpy as np
import pandas as pd

# Demonstrate the difference between adjusted and unadjusted prices
# Sample data for demonstration
dates = pd.bdate_range(start="2024-01-02", periods=252)
hist = pd.DataFrame(
    {"Close": np.linspace(165, 180, 252) + np.random.randn(252) * 2},
    index=dates,
)

# Sample dividend data
div_dates = pd.to_datetime(["2024-02-09", "2024-05-10", "2024-08-09", "2024-11-08"])
recent_divs = pd.Series([0.24, 0.25, 0.25, 0.25], index=div_dates)
recent_divs = recent_divs[recent_divs.index >= "2024-01-01"]
Out[18]:
Console
Synthetic Corporate-Action Example
==================================================

Dividends:
  2024-02-09: $0.24 per share
  2024-05-10: $0.25 per share
  2024-08-09: $0.25 per share
  2024-11-08: $0.25 per share

  Total dividends: $0.99

Price Summary:
  Start: $165.99
  End:   $181.84
  Price Return: 9.5%
  Total Return (with dividends): 10.1%

The illustrative holding-period calculation separates price change from the $0.99 of specified cash dividends. Those cash flows are sample inputs, not a claim about a current company dividend yield. The formula assumes the dividends are held as cash and ignores fees and taxes. Reinvested dividends require a different wealth calculation using the prices at which additional shares are purchased.

When analyzing historical returns, check the provider’s adjustment convention. Some adjusted series account only for splits; others also incorporate cash dividends or represent a reinvested total-return series. Unadjusted prices show historical trading levels. The appropriate series depends on whether you want transaction prices, price returns or total returns.