---
title: "1.3.7 Market data licensing and terms of use"
description: "Market data licenses: personal or professional use, non-display, derived data, redistribution and attribution, with NYSE and Nasdaq definitions."
url: "https://pythonparatrading.com/en/python-trading-course/level-1/market-data-licensing-and-terms-of-use/"
lang: "en"
image: "https://pythonparatrading.com/og/en/python-trading-course/level-1/market-data-licensing-and-terms-of-use.png"
---

# 1.3.7 · Market data licensing and terms of use

> Paying for data does not make you its owner: you buy a license with conditions. This lesson explains the ones that matter most to a trader who writes code (personal or professional use, machine use, derived data, redistribution) using the exchanges' own definitions, and ends with a license checker in Python.

- Course: [Level 1: Financial data, markets and analysis](https://pythonparatrading.com/en/python-trading-course/level-1/)
- Module: 1.3 · Market data sources
- Duration: 45 min
- Prerequisites: [1.3.2 · Free market data sources](https://pythonparatrading.com/en/python-trading-course/level-1/free-market-data-sources/), [1.3.3 · Retail and prosumer market data APIs](https://pythonparatrading.com/en/python-trading-course/level-1/retail-and-prosumer-market-data-apis/)

## By the end of this lesson

- Explain what a “non-professional” subscriber is according to NYSE and Nasdaq and why the classification changes the price and what you can do with the data.
- Distinguish display use, “non-display” use (by machines, algorithmic trading included), derived data and redistribution.
- Read the reuse conditions of public sources (SEC, ECB, FRED) and of an unofficial tool (yfinance and Yahoo's terms).
- Decide with a question tree what can be published from a trading project and automate it with a catalog of license metadata.

## You buy a license, not the data

When you pay for a data subscription, what you acquire is a **right of use** with conditions: who can use the data, on
how many screens or programs, for what purpose, and what can be published or passed on to others. The owner of market
data is, originally, the exchange that produces it; providers and brokers are **distributors** that resell it under the
exchange's license plus their own. That is why a retail provider's contract usually includes clauses that come from the
exchange, and why the same data costs different amounts depending on who uses it and for what.

```mermaid
flowchart LR
  B[Exchange] --> D[Distributor]
  D --> S[Subscriber]
  S --> U[Permitted use]
```

The previous lesson already showed an example: Massive's Advanced plan, the only one with real-time data, carries the
label “Non-pros only” (lesson 1.3.3). This lesson explains what it means and what other conditions are worth reading
before building anything on top of a dataset. It is not legal advice: for a specific case, the contract you sign is
what governs.

## Professional or non-professional

US exchanges charge **non-professional** subscribers much less than professionals. NYSE's definition, in its
non-professional subscriber policy, requires two things[^1]:

- Being a **natural person** who receives the data **solely for personal, non-business use**.
- Not being a **securities professional**: not being registered or qualified with the SEC, the CFTC, a state securities
  agency, a securities exchange or association, or a futures market; not acting as an investment adviser; and not
  working for a bank or other organization exempt from registration in functions that would require it.

Two nuances in the same policy: someone working outside the US performing the same functions is considered a
professional, and if the data arrives through an **organization's account**, the user is professional even if they are
a natural person. Nasdaq uses an equivalent definition in its data policies and adds the default rule: **all
subscribers are considered professional unless they qualify as non-professional**, and for non-professionals the
information is licensed for personal use only[^2].

```mermaid
flowchart TB
  P{Natural person?} -- no --> PRO[Professional]
  P -- yes --> U{Personal use?}
  U -- no --> PRO
  U -- yes --> R{Securities professional?}
  R -- yes --> PRO
  R -- no --> C{Company account?}
  C -- yes --> PRO
  C -- no --> NP[Non-professional]
```

Practical consequences for someone who builds systems:

- An individual who trades their own money through their personal account is usually non-professional.
- The same individual stops being one if they set up a company to trade or manage third-party money: the fee changes
  and, sometimes, so does the data they can receive.
- When signing up, the broker or provider asks about this classification. Answering it wrongly is not a formality: it is
  a breach of the contract with the exchange.

## Display, machine, derived data and redistribution

The second dimension of a license is **what you do** with the data. Exchange policies distinguish four uses, which are
licensed and priced separately:

| Use | What it is | Example |
|---|---|---|
| Display | Showing the data to a person on a screen | Watching quotes on the broker's platform |
| Non-display | Access or processing by a machine, for a purpose other than displaying or redistributing it | A program that computes signals and sends orders |
| Derived data | Information computed from the data that does not allow it to be reconstructed | A proprietary index, a signal, a risk metric |
| Redistribution | Passing the data (or something that substitutes for it) to third parties | Publishing a CSV of prices or an API serving them |

NYSE defines **non-display** use of its real-time information as accessing, processing or consuming it for a purpose
other than displaying or redistributing it, and clarifies that this includes trading uses such as high-frequency or
**algorithmic** trading[^3]. Nasdaq describes it as automated access or use by a machine, without a person seeing it on
a screen[^2]. A trading system fed with real-time data is, by definition, non-display use, and exchanges price it
separately from display use.

*Fig. — What each source allows by use, summarised from its terms (accessed 21/10/2026); «Contract» and «Check» mean it depends on the specific text (schematic).* Table of six sources by four uses. Course data: yes to all. SEC EDGAR and ECB: yes for personal use and algorithm, cite for derived data and redistribution. FRED with third-party copyright: yes for personal use, permission for the rest. Yahoo via yfinance: yes for personal use, check for algorithm and derived data and no for redistribution, highlighted. Non-pro feed: yes for personal use, contract for algorithm and derived data and no for redistribution.

## What derived data is: a test in code

Nasdaq defines **derived data** as information generated wholly or partly from the exchange's information in such a
way that the original information **cannot be reconstructed** or used to create something that is a **reasonable
substitute** for it[^2]. The definition has a consequence that is easier to see in code: not every calculation is
derived data. With NOVA's daily series:

```python
import numpy as np
import pandas as pd

nova = pd.read_csv("nova_diario_sin_ajustar.csv",
                   parse_dates=["fecha"], index_col="fecha")
rent = nova["cierre"].pct_change()          # “only” returns

ancla = nova["cierre"].iloc[0]              # a single public price
reconstruido = ancla * (1 + rent.fillna(0)).cumprod()
error = (reconstruido - nova["cierre"]).abs().max()
print(f"{len(rent) - 1} returns; maximum error: {error:.2e} USD")
```
```output
2010 returns; maximum error: 4.55e-13 USD
```

With the 2,010 returns and a single starting price, the whole series of closes comes back with a maximum error on the
order of 10⁻¹³ dollars, floating-point rounding. Publishing the daily returns is, for practical purposes, publishing the
prices: they are not derived data in the sense of the definition. A metric that summarizes many data points into a few
numbers is:

```python
anual = rent.groupby(rent.index.year).agg(
    rent_pct=lambda r: 100 * ((1 + r).prod() - 1),
    vol_pct=lambda r: 100 * r.std() * np.sqrt(252),
)
print(anual.round(1).head(3))
print(f"{anual.size} numbers versus {len(nova)} closes")
```
```output
       rent_pct  vol_pct
fecha
2018      -12.5     36.8
2019       19.4     34.5
2020       -0.9     48.5
16 numbers versus 2011 closes
```

Sixteen numbers for eight years do not allow 2,011 closes to be reconstructed: it is derived data. The boundary is not
always this clear (a 2-session moving average together with its first value allows the series to be reconstructed; a
rounded 200-session one, in practice, does not), and what counts in the end is what the specific license says. But the
useful question is always the same: does what I publish allow someone else to stop paying for the data?

<aside class="callout" data-kind="aviso">

A price chart on a blog, a table of closes in a repository or a backtest CSV shared on a forum are redistribution if
the data belongs to a third party. A backtest can be described through its metrics (return, drawdown, Sharpe ratio)
without publishing the prices that feed it.

</aside>

## Public sources and unofficial tools

A free source is not a source without conditions. Those of the sources in lesson 1.3.2:

| Source | Main condition | Reference |
|---|---|---|
| SEC (sec.gov, EDGAR) | Public information: it can be copied and redistributed without permission; asks to cite the SEC as the source | [^4] |
| ECB | Free reuse citing the source (“Source: ECB statistics.”) and without modifying statistics or metadata; third-party data requires permission | [^5] |
| FRED | Series with a copyright notice belong to third parties: using them beyond personal use requires permission from their owner; FRED cannot grant it | [^6] |
| Yahoo (yfinance) | Without written permission, the content cannot be reproduced, distributed or commercially exploited, collected by automated means, or used to build databases that substitute for it | [^7] |

The last case is the most delicate. yfinance is a legitimate open-source tool, but the data it downloads belongs to
Yahoo, and Yahoo's terms of service prohibit automated collection without permission and redistribution. Its README
reminds you of this: you have to consult those terms, and the API is for personal use (lesson 1.3.2). Using it to learn
on your own computer is one thing; publishing the CSV files or building a service with them is another. The figure at the top orders the cases in this lesson from most open to most restricted.

Standard open licenses, such as Creative Commons Attribution 4.0, bring order to this terrain: they allow the material
to be copied and redistributed for any purpose, even commercially, on condition of giving credit, linking to the
license and indicating whether changes were made[^8]. When a source publishes its data under such a license, the
question “can I publish this?” has a clear answer.

## The data in this course

The data in the course's examples and exercises is **synthetic**: it comes from models with a fixed seed that the
course runs with its own script, not from any exchange feed or provider (its README explains it file by file). It
therefore carries no third-party licenses: it can be downloaded, used and shared for learning without the restrictions
of this lesson. That is one of the reasons the course does not use real data in its cells: with real data, neither the
cell outputs nor the download files could be published freely.

What does not change with synthetic data is the habit: knowing where each file comes from and under what conditions it
can be used. That is what a catalog is for.

## A license checker

A catalog of a project's datasets, with the license metadata of each one, lets you answer automatically before
publishing anything. The decision tree it applies:

```mermaid
flowchart TB
  Q{Publish or share?} -- no --> OK[Internal use]
  Q -- yes --> A{Open license?}
  A -- yes --> AT[Yes, with attribution]
  A -- no --> D{Is it derived?}
  D -- yes --> L{Is it allowed?}
  D -- no --> NO[Not without permission]
  L -- yes --> AT
  L -- no --> NO
```

```python
catalogo = {
    "nova_diario": {"origen": "course synthetic data",
                    "redistribuir": True, "derivados": True,
                    "atribucion": "Python para Trading"},
    "fred_serie": {"origen": "FRED, series without copyright notice",
                   "redistribuir": True, "derivados": True,
                   "atribucion": "FRED, St. Louis Fed"},
    "bce_exr": {"origen": "ECB", "redistribuir": True,
                "derivados": True, "sin_modificar": True,
                "atribucion": "Source: ECB statistics."},
    "yahoo_precios": {"origen": "Yahoo via yfinance",
                      "redistribuir": False, "derivados": None,
                      "atribucion": None},
    "feed_tiempo_real": {"origen": "provider, non-professional plan",
                         "redistribuir": False, "derivados": False,
                         "atribucion": None},
}
pd.DataFrame(catalogo).T[["origen", "redistribuir", "derivados"]]
```
```output
                                                 origen redistribuir derivados
nova_diario                       course synthetic data         True      True
fred_serie        FRED, series without copyright notice         True      True
bce_exr                                             ECB         True      True
yahoo_precios                        Yahoo via yfinance        False      None
feed_tiempo_real        provider, non-professional plan        False     False
```

`None` means “the license does not say”: it is not a yes. The function walks the tree for a dataset and a use:

```python
def puedo(nombre, publicar, es_derivado=False):
    meta = catalogo[nombre]
    if not publicar:
        return "yes: internal use"
    if meta["redistribuir"] and not es_derivado:
        extra = " unmodified" if meta.get("sin_modificar") else ""
        return f"yes{extra}, citing: {meta['atribucion']}"
    if es_derivado:
        if meta["derivados"] is True:
            return f"yes (derived), citing: {meta['atribucion']}"
        if meta["derivados"] is None:
            return "check: the license does not say"
    return "not without the owner's permission"

plan = [("nova_diario", True, False), ("bce_exr", True, False),
        ("yahoo_precios", True, False), ("yahoo_precios", True, True),
        ("feed_tiempo_real", True, True),
        ("feed_tiempo_real", False, False)]
for nombre, pub, der in plan:
    tipo = "derived" if der else "data"
    print(f"{nombre:17} {tipo:9} -> {puedo(nombre, pub, der)}")
```
```output
nova_diario       data      -> yes, citing: Python para Trading
bce_exr           data      -> yes unmodified, citing: Source: ECB statistics.
yahoo_precios     data      -> not without the owner's permission
yahoo_precios     derived   -> check: the license does not say
feed_tiempo_real  derived   -> not without the owner's permission
feed_tiempo_real  data      -> yes: internal use
```

The result is a report of what can be done with each item: the synthetic data and the ECB data are published with a
citation (the ECB data, unmodified); Yahoo's prices are not; a metric derived from Yahoo stays at “check”, because the
terms do not cover it; and the non-professional feed is only good for internal use. The catalog does not replace
reading the contract, but it forces you to read it once and to write it down next to the data, which is where it is
needed (lesson 1.4.8).

## Exercises

1. Repeat the price reconstruction with returns **rounded** to two decimal places in percent (`round(4)` as a
   fraction). How much accumulated error is there at the end? Are they still a reasonable substitute for the prices?

**Solution.**

```python
r4 = rent.round(4)
rec4 = ancla * (1 + r4.fillna(0)).cumprod()
err = (rec4 - nova["cierre"]).abs()
print(f"final error: {err.iloc[-1]:.2f} USD;",
      f"maximum: {err.max():.2f} USD")
print(f"maximum relative error: {(err / nova['cierre']).max():.3%}")
```
```output
final error: 0.11 USD; maximum: 0.27 USD
maximum relative error: 0.189%
```

Rounding accumulates error over eight years, but the reconstructed series stays very close to the original: the
maximum relative error is small. For almost any use (a chart, a daily backtest), it would be a reasonable substitute
for the prices. Rounding does not turn data into derived data.

2. Add to the catalog a dataset `edgar_10k` (EDGAR filings) with the SEC's conditions and check what `puedo` returns
   when publishing the data as is and when publishing a ratio computed from it.

**Solution.**

```python
catalogo["edgar_10k"] = {
    "origen": "SEC EDGAR", "redistribuir": True, "derivados": True,
    "atribucion": "U.S. Securities and Exchange Commission (EDGAR)",
}
print(puedo("edgar_10k", True))
print(puedo("edgar_10k", True, es_derivado=True))
```
```output
yes, citing: U.S. Securities and Exchange Commission (EDGAR)
yes (derived), citing: U.S. Securities and Exchange Commission (EDGAR)
```

The SEC considers the information on sec.gov public and allows it to be copied and redistributed, asking to be cited.
Both the data and the ratios can be published with the attribution. What you do need to check is whether a specific
document includes third-party material with its own rights.

3. Write, in three or four sentences, what you would publish from a backtest made with data from a retail provider's
   non-professional plan, and what you would not.

**Solution.**

You can describe the method, the code (without data) and the aggregate metrics of the result: annual return, drawdown,
Sharpe ratio, number of trades; they are summaries that do not allow the prices to be reconstructed. You would not
publish the prices, the bars, the day-by-day signals with their entry and exit prices, or a CSV with the curve of each
trade if it allows the prices to be recovered. Before publishing, read the derived data and redistribution clauses of
the provider's contract; if they say nothing, ask.

[^1]: [NYSE: Nonprofessional Subscriber Policy](https://www.nyse.com/publicdocs/nyse/data/Non_Professional_Subscribers_PDP_Policy.pdf), accessed on October 21, 2026.
[^2]: [Nasdaq: US Equities and Options Data Policies](https://www.nasdaqtrader.com/content/AdministrationSupport/Policy/USEquitiesandOptionsDataPolicies.pdf), version 2.6, sections on definitions, derived data and non-display.
[^3]: [NYSE: Comprehensive Market Data Policies](https://www.nyse.com/publicdocs/nyse/data/NYSE_Proprietary_Market_Data_Comprehensive_Policy_Package.pdf) (March 21, 2022), §2.1 and §2.3.
[^4]: [SEC: Privacy Information](https://www.sec.gov/privacy) (public information on sec.gov), accessed on October 21, 2026.
[^5]: [ECB: Policy regarding the reuse of ESCB statistics](https://www.ecb.europa.eu/stats/ecb_statistics/governance_and_quality_framework/html/usage_policy.en.html).
[^6]: [FRED: Legal Notices, Information and Disclaimers](https://fred.stlouisfed.org/legal/).
[^7]: [Yahoo Terms of Service](https://legal.yahoo.com/us/en/yahoo/terms/otos/index.html) (updated August 4, 2026) and the [yfinance](https://github.com/ranaroussi/yfinance) README.
[^8]: [Creative Commons: Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0/deed.en).

## Self-assessment

1. According to NYSE policy, who can be a “non-professional” subscriber?

   - A. A natural person who receives the data solely for personal, non-business use and who is not a securities professional (not registered with the SEC, the CFTC or other bodies, not an investment adviser, not employed by an exempt bank)
   - B. Any small company
   - C. Anyone who pays for the cheap plan
   - D. Anyone who does not trade third-party money

   *Answer A: A natural person who receives the data solely for personal, non-business use and who is not a securities professional (not registered with the SEC, the CFTC or other bodies, not an investment adviser, not employed by an exempt bank).* The definition requires both things: a natural person with personal use, and not being a securities professional. If the data arrives through an organization's account, the user is classified as professional.

2. For Nasdaq, what is a subscriber who has not qualified as non-professional?

   - A. Non-professional by default
   - B. It depends on the country
   - C. Professional: all subscribers are considered professional unless they meet the non-professional definition
   - D. They cannot receive data

   *Answer C: Professional: all subscribers are considered professional unless they meet the non-professional definition.* Nasdaq's data policies say so. The burden of proof is on the subscriber.

3. Your program reads real-time quotes and sends orders without anyone looking at them on a screen. What use is it, in NYSE and Nasdaq terminology?

   - A. Display use
   - B. Redistribution
   - C. Derived data
   - D. “Non-display” use: access or processing by a machine, for a purpose other than displaying the data; it includes algorithmic trading

   *Answer D: “Non-display” use: access or processing by a machine, for a purpose other than displaying the data; it includes algorithmic trading.* NYSE defines non-display as accessing, processing or consuming the data for a purpose other than displaying or redistributing it, and it explicitly includes algorithmic trading. It usually has its own fees.

4. You publish the daily returns of a stock computed with a provider's data. Are they “derived data” in Nasdaq's sense?

   - A. Yes, because they are a calculation
   - B. Not necessarily: if they allow the prices to be reconstructed (a single starting price is enough), they are a reasonable substitute for the original data
   - C. Yes, as long as they are rounded
   - D. There is never such a thing as derived data

   *Answer B: Not necessarily: if they allow the prices to be reconstructed (a single starting price is enough), they are a reasonable substitute for the original data.* Nasdaq defines derived data as information that cannot be used to recreate the exchange's data or as a reasonable substitute for it. In the lesson, NOVA's returns reconstruct its closes with an error on the order of 10⁻¹³ dollars.

5. What conditions does the ECB set for reusing its public statistics?

   - A. None
   - B. Non-commercial use only
   - C. Cite the source and do not modify the statistics or their metadata
   - D. Ask for written permission

   *Answer C: Cite the source and do not modify the statistics or their metadata.* Its reuse policy allows free use under those two conditions. Third-party data it publishes requires permission from its author.

## Key points

- Market data is licensed, not bought: the contract says who can use it, how, and what can be published.
- Non-professional, according to NYSE and Nasdaq, is a natural person with personal use who is not a securities professional; at Nasdaq, every subscriber is professional unless they prove otherwise.
- Showing data on a screen, processing it with a machine (non-display, algorithmic trading included), creating derived data and redistributing are different uses, with different licenses and fees.
- Data is “derived” only if it does not allow the original to be reconstructed: daily returns reconstruct the prices; an annual Sharpe ratio does not.
- Public sources have conditions too: the SEC asks to be cited, the ECB to be cited without modifications, FRED requires permission for series under third-party copyright; Yahoo's terms prohibit redistribution without permission.
- The course's synthetic data does not come from any feed: it can be shared without carrying third-party licenses, which is one of the reasons the course uses it.

## Resources

### Documentation

- [NYSE: Nonprofessional Subscriber Policy (PDF)](https://www.nyse.com/publicdocs/nyse/data/Non_Professional_Subscribers_PDP_Policy.pdf) · nyse.com
- [Nasdaq: US Equities and Options Data Policies (PDF)](https://www.nasdaqtrader.com/content/AdministrationSupport/Policy/USEquitiesandOptionsDataPolicies.pdf) · nasdaqtrader.com
- [NYSE: Comprehensive Market Data Policies (non-display, PDF)](https://www.nyse.com/publicdocs/nyse/data/NYSE_Proprietary_Market_Data_Comprehensive_Policy_Package.pdf) · nyse.com
- [ECB: Policy regarding the reuse of ESCB statistics](https://www.ecb.europa.eu/stats/ecb_statistics/governance_and_quality_framework/html/usage_policy.en.html) · ecb.europa.eu
- [Creative Commons: Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0/deed.en) · creativecommons.org

### Data

- [Level 1 data: unadjusted daily NOVA (CSV)](https://pythonparatrading.com/curso/datos/nivel-1/nova_diario_sin_ajustar.csv) · Download · nova_diario_sin_ajustar.csv

Previous lesson: [1.3.6 · Brokers as market data sources](https://pythonparatrading.com/en/python-trading-course/level-1/brokers-as-market-data-sources/)

Next lesson: [1.3.8 · How to choose a market data provider](https://pythonparatrading.com/en/python-trading-course/level-1/how-to-choose-a-data-provider/)
