---
title: "7.4.7 Ethics: personal data, AI and selling signals"
description: "GDPR applied to the data of a trading service, the EU AI Act and its dates, and how a signal track record is manufactured from channels with no skill."
url: "https://pythonparatrading.com/en/python-trading-course/level-7/ethics-personal-data-ai-trading-signals/"
lang: "en"
image: "https://pythonparatrading.com/og/en/python-trading-course/level-7/ethics-personal-data-ai-trading-signals.png"
---

# 7.4.7 · Ethics: personal data, artificial intelligence and selling signals

> A system that only trades for its owner barely touches other people's data. As soon as it has subscribers, an AI assistant or a paid signals channel, three frameworks come in: the GDPR, the EU AI Act and the rules on recommendations and advice. This lesson reads them in their primary sources, as they apply in the EU and Spain, pseudonymizes and erases data with code, computes which AI obligations apply today and simulates 2,000 signal channels with no skill at all to see how a brilliant track record comes out of them. It is not legal advice.

- Course: [Level 7: Production, MLOps, regulation, career and capstone](https://pythonparatrading.com/en/python-trading-course/level-7/)
- Module: 7.4 · Regulation, ethics and taxation
- Duration: 60 min
- Prerequisites: [2.5.4 · Deflated Sharpe Ratio and Probability of Backtest Overfitting (PBO)](https://pythonparatrading.com/en/python-trading-course/level-2/deflated-sharpe-ratio-and-pbo/), [4.4.5 · Secure credentials: environment variables, secret managers and least privilege](https://pythonparatrading.com/en/python-trading-course/level-4/secure-api-credentials-and-least-privilege/), [6.7.3 · Responsible web scraping](https://pythonparatrading.com/en/python-trading-course/level-6/responsible-web-scraping/), [6.7.4 · Alternative data vendors and due diligence](https://pythonparatrading.com/en/python-trading-course/level-6/alternative-data-vendors-and-due-diligence/)

## By the end of this lesson

- Apply the GDPR principles (purpose limitation, data minimization, storage limitation) to the data of a trading service and pseudonymize identifiers with HMAC instead of an unkeyed hash.
- Resolve an erasure request when part of the data is subject to a legal retention obligation (Art. 17(3)(b) of the GDPR).
- Compute which obligations of Regulation (EU) 2024/1689 apply on a given date, with the timeline amended by Regulation (EU) 2026/1744, and place a trading model within its risk categories.
- Distinguish an investment recommendation from personalized advice with MAR, Delegated Regulation 2017/565 and the guides of the CNMV (Spain's securities regulator), and know the obligations of whoever publishes signals.
- Simulate the survival of signal channels, the choice of windows and the deletion of losing signals, and measure how much apparent track record they manufacture with no skill.

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

This lesson explains EU rules, and the Spanish rules that apply alongside them, from their primary sources in order to
design a trading service that respects them. It is neither legal nor investment advice: the periods and rules in the
code are examples, and assessing a specific case requires reading the text in force and, if needed, consulting a
professional. Texts consulted on October 23, 2026, mostly in their Spanish versions; quotations from legal texts and
CNMV guides are unofficial English translations, except where the source is in English.

</aside>

## When the system touches other people

Lessons 6.7.3 and 6.7.4 deal with the personal data that come **from outside**: what a scraper collects from a website
and what a purchased alternative dataset contains. This lesson looks inward and ahead. A systematic trader often ends
up with other people's data: the mailing list of their blog, the subscribers of a signals channel, the client accounts
of a tool, the conversations of an AI assistant. And with them come three ethical questions that also have a legal
answer:

1. **What personal data do I process and how long do I keep them?** The GDPR.
2. **What obligations does the AI I use with those people have?** The AI Act and, if there are investment services,
   MiFID II.
3. **What can I say about my results and what can I not do with my recommendations?** MAR, the rules on investment
   advice and the warnings of the CNMV (*Comisión Nacional del Mercado de Valores*, Spain's securities regulator), plus a
   question of statistical honesty that no rule fully settles: how a track record is manufactured.

## GDPR: the data of a trading service

Article 5 of Regulation (EU) 2016/679 (GDPR) sets out the principles: data are collected for specified purposes and not
further processed in an incompatible way (purpose limitation), they must be “adequate, relevant and limited to what is
necessary” (data minimization), they are kept in a form that identifies the data subject only for as long as necessary
(storage limitation) and with appropriate security[^1]. Every processing operation needs a basis in Article 6: the
contract to send the signals to whoever pays for them, a legal obligation for invoicing, consent for the marketing
mailing list.

A measure the regulation cites explicitly, in Article 25 (data protection by design), is **pseudonymization**:
processing data so that they “can no longer be attributed to a specific data subject without the use of additional
information, provided that such additional information is kept separately” (Art. 4(5)). The European Data Protection
Board (EDPB) guidelines 01/2025 recall that pseudonymized data are still personal data and cite functions such as HMACs,
with a secret kept apart, as a way to do it[^2]. The usual mistake is to use an unkeyed hash:

```python
import hashlib
import hmac

import numpy as np
import pandas as pd

subs = pd.DataFrame({
    "email": [f"usuario{i}@example.com" for i in (3, 17, 42, 108,
                                                  512, 999)],
    "ip": [f"203.0.113.{i}" for i in (5, 17, 23, 42, 77, 91)],
    "plan": ["básico", "pro", "pro", "básico", "pro", "básico"],
})

def hash_simple(x):
    return hashlib.sha256(x.encode()).hexdigest()[:16]

# in production, the key lives in a secrets manager (lesson 4.4.5)
CLAVE = b"clave-de-ejemplo-guardada-aparte"

def seudonimo(x, clave=CLAVE):
    return hmac.new(clave, x.encode(), hashlib.sha256).hexdigest()[:16]

subs["h_simple"] = subs["email"].map(hash_simple)
subs["seud"] = subs["email"].map(seudonimo)

# someone who has the log and a list of candidate emails
candidatos = [f"usuario{i}@example.com" for i in range(1, 1001)]
dicc = {hash_simple(c): c for c in candidatos}
dicc_k = {seudonimo(c, b"clave-adivinada"): c for c in candidatos}
print("unkeyed hash, re-identified:",
      subs["h_simple"].map(dicc).notna().sum(), "of", len(subs))
print("HMAC, without the key:", subs["seud"].map(dicc_k).notna().sum())
print("HMAC, with the key:",
      subs["seud"].map({seudonimo(c): c for c in candidatos})
      .notna().sum())
```
```output
unkeyed hash, re-identified: 6 of 6
HMAC, without the key: 0
HMAC, with the key: 6
```

An email is predictable data: with a list of candidates (a thousand here; in reality, leaks with millions), the
unkeyed hash is undone entirely. The HMAC cannot be undone without the key, and with it, it can: that is why the key is
stored separately from the log and with restricted access. Pseudonymized data are still personal, but the risk of a
log leak drops a lot.

Minimization comes first: the log used to measure which signals are delivered and to which plan does not need the
email or the IP, nor the exact time. The plans keep their Spanish labels (`básico`, basic, and `pro`):

```python
envios = pd.DataFrame({
    "email": subs["email"].repeat(2).to_numpy(),
    "ip": subs["ip"].repeat(2).to_numpy(),
    "ts": pd.to_datetime(["2026-10-21 08:59:58.120"] * 6
                         + ["2026-10-22 09:00:01.873"] * 6),
    "senal": ["NORU compra"] * 6 + ["MURI venta"] * 6,
})
analitico = pd.DataFrame({
    "seud": envios["email"].map(seudonimo),
    "plan": envios["email"].map(subs.set_index("email")["plan"]),
    "dia": envios["ts"].dt.date,
    "senal": envios["senal"],
})
print(list(envios.columns), "->", list(analitico.columns))
analitico.groupby(["dia", "plan"]).size()
```
```output
['email', 'ip', 'ts', 'senal'] -> ['seud', 'plan', 'dia', 'senal']
dia         plan
2026-10-21  básico    2
            pro       4
2026-10-22  básico    4
            pro       2
dtype: int64
```

The analytical log answers what the service needs to know (how many signals are delivered each day per plan) with no
emails, IPs or milliseconds. The delivery log with IPs, if it is needed for security, has another purpose, other access
and a short retention period.

## Erasure versus the obligation to retain

Article 17 of the GDPR gives the right to obtain the erasure of data, but its paragraph 3, point (b), excludes it when
processing is necessary to comply with a legal obligation[^1]. A trading service has several:

- **Accounting and invoices.** In Spain, Article 30 of the Commercial Code (*Código de Comercio*) requires books,
  correspondence, documentation and supporting records of the business to be kept “for six years, from the last entry
  made in the books”[^3].
- **Client orders and transactions**, if the service is an investment firm: five years (Art. 25(1) of MiFIR) and, for
  recordings and communications, five years or up to seven if the authority requests it (Art. 16(7) of MiFID II)[^4].

```mermaid
flowchart TB
  P[Request] --> B{Legal basis?}
  B -- consent --> S[Erase now]
  B -- contract --> F{Contract active?}
  F -- no --> S
  F -- yes --> M[Keep]
  B -- obligation --> V{Period expired?}
  V -- yes --> S
  V -- no --> K[Block and retain]
```

Turned into code, with injected dates and the simplified rule that the six-year period counts from the date of the
document (the bases keep their Spanish keys: `consentimiento`, `contrato`, `obligación`):

```python
PLAZO_ANOS = {"contabilidad (art. 30 C. Com.)": 6}

datos = pd.DataFrame([
    ("mailing list", "consentimiento", None, None),
    ("profile and preferences", "contrato", None, False),
    ("invoice 2024-0312", "obligación",
     "contabilidad (art. 30 C. Com.)", "2024-03-12"),
    ("invoice 2019-0044", "obligación",
     "contabilidad (art. 30 C. Com.)", "2019-02-04"),
], columns=["dato", "base", "norma", "fecha_o_vivo"])

def resolver(fila, hoy):
    if fila.base == "consentimiento":
        return "erase"
    if fila.base == "contrato":
        return "keep" if fila.fecha_o_vivo else "erase"
    fin = (pd.Timestamp(fila.fecha_o_vivo)
           + pd.DateOffset(years=PLAZO_ANOS[fila.norma]))
    if hoy >= fin:
        return "erase"
    return f"retain blocked until {fin.date()}"

hoy = pd.Timestamp("2026-10-23")
for f in datos.itertuples():
    print(f"{f.dato:<24} {resolver(f, hoy)}")
```
```output
mailing list             erase
profile and preferences  erase
invoice 2024-0312        retain blocked until 2030-03-12
invoice 2019-0044        erase
```

The mailing list is erased as soon as consent is withdrawn, and the profile, because the contract has already ended.
The 2024 invoice is retained, but **blocked**: only for the purpose of the obligation (an inspection, an audit), not for
sending advertising or training a churn model. The 2019 one has already passed its period and should have been erased
without waiting for any request: storage limitation does not depend on someone claiming it.

## Responsible AI: the AI Act and its dates

Regulation (EU) 2024/1689 on artificial intelligence classifies systems by risk. Its application dates are in Article
113, which Regulation (EU) 2026/1744 (the “Digital Omnibus on AI”), published in the Official Journal on July 24, 2026
and in force three days later, has amended[^5]:

```python
calendario = pd.DataFrame([
    ("2025-02-02", "chapters I and II: prohibitions and literacy"),
    ("2025-08-02", "general-purpose AI, governance and penalties"),
    ("2026-08-02", "general application, Art. 50 transparency"),
    ("2026-12-02", "marking (Art. 50.2) of pre-existing systems"),
    ("2027-12-02", "Annex III high-risk (Art. 6.2)"),
    ("2028-08-02", "high-risk products in Annex I (Art. 6.1)"),
], columns=["desde", "que"])
calendario["desde"] = pd.to_datetime(calendario["desde"])

def vigentes(dia):
    c = calendario.copy()
    c["estado"] = np.where(c["desde"] <= dia, "applicable",
                           (c["desde"] - dia).dt.days.astype(str)
                           + " days")
    return c

vigentes(pd.Timestamp("2026-10-23"))
```
```output
       desde                                           que      estado
0 2025-02-02  chapters I and II: prohibitions and literacy  applicable
1 2025-08-02  general-purpose AI, governance and penalties  applicable
2 2026-08-02     general application, Art. 50 transparency  applicable
3 2026-12-02   marking (Art. 50.2) of pre-existing systems     40 days
4 2027-12-02                Annex III high-risk (Art. 6.2)    405 days
5 2028-08-02      high-risk products in Annex I (Art. 6.1)    649 days
```

*Fig. — Application dates of the AI Act, Regulation (EU) 2024/1689, as amended by Regulation (EU) 2026/1744, and the date of this lesson.* Six points on a 2025 to 2028 timeline: prohibitions and AI literacy on 2 Feb 2025, general-purpose AI on 2 Aug 2025, general application and article 50 on 2 Aug 2026, article 50(2) marking for systems already on the market on 2 Dec 2026, annex III high risk on 2 Dec 2027 and annex I high risk on 2 Aug 2028. A highlighted line marks 23 Oct 2026.

For a systematic trader, three consequences:

- **A proprietary trading model is not high-risk just for being one.** The high-risk categories of Annex III are a
  closed list; in finance they include systems for assessing the creditworthiness of natural persons or their credit
  score and those for risk assessment and pricing of life and health insurance[^5]. Buying and selling for oneself is
  not listed.
- **Transparency may well affect the service.** Since August 2, 2026, Article 50(1) requires systems that interact
  directly with people to be designed so that those people know they are talking to an AI, unless it is obvious. An
  assistant that answers the subscribers of a signals channel is the typical case. AI literacy under Article 4, as
  worded by the omnibus, asks providers and deployers to take measures to support it among those who operate the
  systems, without requiring a specific level.
- **If there are clients and investment services, MiFID II prevails.** ESMA said so in its statement of May 30, 2024:
  the firm's decisions remain the responsibility of its management body, “irrespective of whether those decisions are
  taken by people or AI-based tools”, and MiFID II obligations apply to the AI tools used with clients[^6]. If, in
  addition, an automated decision produces significant effects on a person (rejecting a client, for example), Article
  22 of the GDPR comes into play.

## Selling signals: recommendation or advice

Article 20 of MAR requires whoever produces or disseminates investment recommendations to present them objectively and
to disclose their interests or conflicts[^7]. The CNMV puts it this way in its guide for finfluencers: “Anyone can
publish investment recommendations”, but with general requirements (who produces it, date and time, facts separated
from opinions, sources, interests and conflicts visible on each channel) and additional requirements for professionals
and “experts”, among them the methodology, the investment horizon and risk warnings[^8]. Delegated Regulation (EU)
2016/958 details them; its Article 4(1)(i) asks experts for a list of **all** their recommendations from the previous
twelve months, with the date and price of each one[^9].

**Investment advice** is a different matter: a service that requires authorization. Article 9 of Delegated Regulation
(EU) 2017/565 defines it by the personal recommendation: one presented as suitable for that person or based on their
personal circumstances, and it clarifies that “a recommendation is not a personal recommendation if it is issued
exclusively to the public”[^10].

```mermaid
flowchart TB
  M[Message] --> A{Suggests investing?}
  A -- no --> I[Information]
  A -- yes --> P{Personalized?}
  P -- no --> R[MAR recommendation]
  P -- yes --> S[Advice]
  S --> Z[Requires authorization]
```

The CNMV is explicit about disclaimers: without authorization, no personalized recommendations should be given on what
to buy, sell or hold, and publishing “This is not investment advice” “will not protect you in these cases, nor does it
exempt you from complying with the applicable regulations”[^8]. In its guide for followers it lists “alerts and signals
(buy/sell)” among risky content and warns that the main risk is fraud: finfluencers who provide advice without
authorization or recruit clients for *chiringuitos financieros*, the Spanish term for boiler rooms, entities that
provide investment services without being authorized[^11]. Its search engine of warnings and its registers of
authorized entities are the prior check it recommends[^12].

Two frequent conflicts of interest in selling signals:

| Conduct | Why it is a problem |
|---|---|
| Buying before publishing the signal and selling when the subscribers buy | Article 12(2)(d) of MAR considers it manipulation to take positions, then voice an opinion in the media and profit from the effect without having disclosed the conflict |
| Receiving commissions from the recommended broker or exchange | It is an interest that must be disclosed; if the entity is not authorized, the CNMV warns that promoting it can make the promoter an accomplice to a fraud |

## How a track record is manufactured

A signals seller shows their track record. The ethical problem lies in how that track record is built, even if every
number is true. To measure it, the next cell creates 2,000 channels **with no skill at all**: every day they give a
random buy or sell signal on an asset with no trend. After a year, the channels with an annual Sharpe above 1 are
advertised, and their performance over the next six months is measured:

```python
rng = np.random.default_rng(2026)
N, DIAS, FUERA = 2000, 252, 126
r = rng.normal(0, 0.01, DIAS + FUERA)        # asset with no trend
senal = rng.choice([-1, 1], size=(N, DIAS + FUERA))   # no skill
ret = senal * r

def sharpe(x, axis=-1):
    return np.sqrt(252) * x.mean(axis) / x.std(axis, ddof=1)

sr_dentro = sharpe(ret[:, :DIAS])
sr_fuera = sharpe(ret[:, DIAS:])
anunciado = sr_dentro > 1
print(f"advertised: {anunciado.sum()} of {N}")
print(f"average Sharpe, year of the advertisement: "
      f"{sr_dentro[anunciado].mean():.2f}")
print(f"average Sharpe, six months later: "
      f"{sr_fuera[anunciado].mean():.2f}")
print(f"all channels, year of the advertisement: {sr_dentro.mean():.2f}")
```
```output
advertised: 316 of 2000
average Sharpe, year of the advertisement: 1.49
average Sharpe, six months later: -0.04
all channels, year of the advertisement: 0.02
```

One in six channels exceeds a Sharpe of 1 without knowing anything. Their average in the year of the advertisement,
1.49, is what their pages would show; over the following six months, that of a coin toss. The figure at the top
summarizes the three numbers. In reality, the bias is worse: losing channels close, change their name and start over,
and the reader only sees the survivors.

Lesson 2.5.4 provides the yardstick: the maximum Sharpe to be expected among $N$ strategies with no skill, with the
approximation by Bailey and López de Prado ($\gamma$ is the Euler-Mascheroni constant and $\sigma_{SR}$ the standard
deviation of the estimated Sharpe ratios):

$$
E[\max SR] \approx \sigma_{SR}\left[(1-\gamma)\,\Phi^{-1}\!\left(1-\frac{1}{N}\right)
+ \gamma\,\Phi^{-1}\!\left(1-\frac{1}{N e}\right)\right]
$$

```python
from scipy.stats import norm

g = np.euler_gamma
esperado = sr_dentro.std() * ((1 - g) * norm.ppf(1 - 1 / N)
                              + g * norm.ppf(1 - 1 / (N * np.e)))
mejor = sr_dentro.argmax()
print(f"best channel: Sharpe {sr_dentro[mejor]:.2f} "
      f"(six months later: {sr_fuera[mejor]:.2f})")
print(f"maximum expected with no skill for N={N}: {esperado:.2f}")
```
```output
best channel: Sharpe 3.06 (six months later: -1.52)
maximum expected with no skill for N=2000: 3.40
```

The best of 2,000 random channels has a Sharpe of 3.06, below what can be expected from the best of 2,000 coins. A
track record with a Sharpe of 3 says nothing unless you know how many attempts it comes from.

### Choosing the window

The second trick does not require advertising only the best: choosing the period is enough. Each channel shows its
“last three months” right when they are the best of the year. With 63 sessions, the estimated Sharpe has twice the
noise it has with 252, and among all the possible windows there is always a good one:

```python
panel = pd.DataFrame(ret[:, :DIAS].T)          # one column per channel
v = panel.rolling(63)
mejor_ventana = (np.sqrt(252) * v.mean() / v.std()).max()
print(f"average Sharpe over the full year: {sr_dentro.mean():.2f}")
print(f"average Sharpe of the best window: "
      f"{mejor_ventana.mean():.2f}")
print(f"channels with some window > 2: "
      f"{(mejor_ventana > 2).mean():.0%}")
```
```output
average Sharpe over the full year: 0.02
average Sharpe of the best window: 3.41
channels with some window > 2: 84%
```

Over the full year, the average channel has a Sharpe of 0.02; with its best three-month window, 3.41 on average, and
84% of the channels with no skill at all have some window above 2. “Our last three months” is informative only if the
cut-off date was fixed before seeing the results.

### Deleting the losing signals

The third trick is the simplest: not publishing, or deleting afterward, the signals that go wrong. With a mediocre
channel, the one at the median of the 2,000 by Sharpe, and one trade per day:

```python
mediano = np.argsort(sr_dentro)[N // 2]
ops = ret[mediano, :DIAS]
publicadas = ops[ops > 0]          # the losing ones “get deleted”
print(f"signals: {len(ops)}, published: {len(publicadas)}")
print(f"actual hit rate: {(ops > 0).mean():.1%}; "
      f"published hit rate: {(publicadas > 0).mean():.0%}")
print(f"actual return: {ops.sum():+.1%}; "
      f"published: {publicadas.sum():+.1%}")
```
```output
signals: 252, published: 124
actual hit rate: 49.2%; published hit rate: 100%
actual return: +0.3%; published: +107.7%
```

The median channel is right on 49.2% of the days and gains 0.3% over the year. Without its 128 losing signals, it
publishes 124 with a 100% hit rate and a sum of +107.7%. A 100% hit rate is impossible in an honest track record and
easy in an edited one. That is why the complete list of recommendations for twelve months that Article 4(1)(i) of
Delegated Regulation 2016/958 requires of experts matters more than any summary: with all the signals, dated and with
their price, the hit rate goes back to the real one.

### The letter that is right ten times in a row

The last trick is old and needs no market. A prediction (“up” or “down”) is sent to 1,024 people, half receive one and
half the other; the next week it is repeated only with those who received the right one:

```python
destinatarios = np.arange(1024)
for semana in range(1, 11):
    sube = destinatarios[: len(destinatarios) // 2]
    resultado_sube = rng.random() < 0.5
    destinatarios = sube if resultado_sube else \
        destinatarios[len(destinatarios) // 2:]
    if semana in (1, 5, 10):
        print(f"week {semana:>2}: {len(destinatarios):>4} people "
              "without a single miss")
```
```output
week  1:  512 people without a single miss
week  5:   32 people without a single miss
week 10:    1 people without a single miss
```

One person has received ten correct predictions in a row, a probability of 1 in 1,024 if they were random, and has no
way of knowing there are another 1,023 letters. It is the extreme version of the advertised channels: whoever looks at
the track record does not see the denominator. The question that dismantles it is always the same: how many attempts
were there and where are all of them?

## Exercises

1. Repeat the channel simulation advertising only those with a Sharpe above 2. How many are there, what average Sharpe
   do they show and what Sharpe do they have afterward?

**Solution.**

```python
for umbral in [1, 2]:
    a = sr_dentro > umbral
    print(f"threshold {umbral}: {a.sum():>3} channels, "
          f"in-sample {sr_dentro[a].mean():.2f}, "
          f"out-of-sample {sr_fuera[a].mean():.2f}")
```
```output
threshold 1: 316 channels, in-sample 1.49, out-of-sample -0.04
threshold 2:  37 channels, in-sample 2.35, out-of-sample -0.10
```

With a threshold of 2, 37 channels are advertised instead of 316 and their track record is more brilliant (2.35 on
average), but the following six months stay around zero (−0.10). Tightening the filter on a selected track record
does not create skill: it only selects more extreme luck. What distinguishes a channel with skill is that its Sharpe
outside the selection sample holds up, and that can only be seen with results dated before they are known.

2. A channel publishes 40 signals in a year; it says it got 30 right. It gives you the complete list with dates and
   prices and, when you check it, 12 of the 30 “winners” had an entry price that was not reached that day. Compute the
   real hit rate if those 12 do not count as trades and if they count as misses.

**Solution.**

```python
total, aciertos, imposibles = 40, 30, 12
print(f"declared: {aciertos / total:.0%}")
validas = total - imposibles
print(f"excluding impossible: {(aciertos - imposibles) / validas:.0%}")
print(f"impossible ones as misses: {(aciertos - imposibles) / total:.0%}")
```
```output
declared: 75%
excluding impossible: 64%
impossible ones as misses: 45%
```

The declared 75% drops to 64% if the signals with unreachable prices are excluded and to 45% if they are counted as
misses. That is why the complete list of Article 4(1)(i) includes the market price at the time of dissemination: it
makes it possible to check that the signal was executable. An entry price that never existed is a signal written after
the fact.

3. A paid Telegram channel sends the same three ideas every morning to all its subscribers. The administrator also
   opens a private chat for those who pay for the “premium” plan, where they ask about the subscriber's capital and
   profile and say how much to buy. Which part is a recommendation and which part is advice? What changes if the chat
   is handled by an AI assistant?

**Solution.**

The three daily ideas, the same for everyone, are investment recommendations disseminated through a distribution
channel: they can be published without authorization, but with the requirements of Article 20 of MAR and Delegated
Regulation 2016/958 (identity, date and time, objective presentation, interests and conflicts and, if whoever gives
them is an “expert”, methodology, risks and the twelve-month list). The premium chat, which asks about capital and
profile and says how much to buy, gives recommendations presented as suitable or based on personal circumstances: it is
investment advice under Article 9 of Delegated Regulation 2017/565 and requires authorization, whatever the disclaimer
says. If an AI assistant handles it, the assessment does not change (the service is provided by whoever deploys the
assistant) and the Article 50(1) obligation of the AI Act is added: the user must know they are talking to an AI; the
conversations are also personal data with their own purpose and retention period.

[^1]: Regulation (EU) 2016/679 (GDPR), Articles 4(5), 5, 6, 17, 22 and 25,
    [BOE](https://www.boe.es/buscar/doc.php?id=DOUE-L-2016-80807) (Spanish version; quotations are unofficial
    translations), accessed on October 23, 2026.
[^2]: EDPB, “Guidelines 01/2025 on Pseudonymisation”, adopted on January 16, 2025 (version for public consultation),
    [edpb.europa.eu](https://www.edpb.europa.eu/system/files/2025-01/edpb_guidelines_202501_pseudonymisation_en.pdf).
[^3]: Spanish Commercial Code (*Código de Comercio*), Article 30.1,
    [BOE-A-1885-6627](https://www.boe.es/buscar/act.php?id=BOE-A-1885-6627) (in Spanish; the quotation is an unofficial
    translation), consolidated text accessed on October 23, 2026.
[^4]: Regulation (EU) No 600/2014 (MiFIR), Article 25(1), and Directive 2014/65/EU (MiFID II), Article 16(7),
    [EUR-Lex](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32014L0065).
[^5]: Regulation (EU) 2024/1689, Articles 4, 50 and 113 and Annex III,
    [EUR-Lex](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R1689), and Regulation (EU) 2026/1744 of
    the European Parliament and of the Council of 8 July 2026 (OJ L, 24.7.2026), amending its Articles 4 and 113,
    [EUR-Lex](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32026R1744). Texts read in the Spanish version
    of the EU Publications Office on October 23, 2026.
[^6]: ESMA, “Public Statement on the use of Artificial Intelligence (AI) in the provision of retail investment
    services”, ESMA35-335435667-5924, May 30, 2024,
    [esma.europa.eu](https://www.esma.europa.eu/sites/default/files/2024-05/ESMA35-335435667-5924__Public_Statement_on_AI_and_investment_services.pdf).
[^7]: Regulation (EU) No 596/2014 (MAR), Articles 12(2)(d) and 20, OJ L 173, 12.6.2014,
    [copy in the BOE](https://www.boe.es/doue/2014/173/L00001-00061.pdf) (Spanish version).
[^8]: CNMV, “Finfluencers: cómo actuar con responsabilidad” (guide, May 2026), sections IV to VII,
    [cnmv.es](https://www.cnmv.es/DocPortal/Publicaciones/Guias/GuiaparaFinfluencers.pdf) (in Spanish; quotations are
    unofficial translations).
[^9]: Commission Delegated Regulation (EU) 2016/958 of 9 March 2016, Articles 2 to 5,
    [EUR-Lex](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32016R0958).
[^10]: Commission Delegated Regulation (EU) 2017/565, Article 9,
    [EUR-Lex](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32017R0565).
[^11]: CNMV, “Del like a la inversión: qué debes saber de los finfluencers” (guide, April 2026),
    [cnmv.es](https://www.cnmv.es/DocPortal/Publicaciones/Guias/Guia_Del_like_a_la_inversion.pdf), and “Chiringuitos
    financieros” (guide), [cnmv.es](https://internet.cnmv.es/DocPortal/Publicaciones/Guias/CCFF.pdf), both in Spanish.
[^12]: CNMV, search engine of warnings about unauthorized entities,
    [cnmv.es](https://www.cnmv.es/Portal/BusquedaAdvertencias.aspx?lang=es).

## Self-assessment

1. A signals service stores `sha256(email)` of its subscribers in the delivery log and says that this makes the data anonymous. What is wrong?

   - A. Nothing: a hash is irreversible
   - B. An unkeyed hash of predictable data is undone with a list of candidates (in the lesson, all six subscribers are re-identified with a thousand emails), and even with a secret key the data are still pseudonymous, that is, personal
   - C. That SHA-256 is prohibited by the GDPR
   - D. That MD5 should be used instead

   *Answer B: An unkeyed hash of predictable data is undone with a list of candidates (in the lesson, all six subscribers are re-identified with a thousand emails), and even with a secret key the data are still pseudonymous, that is, personal.* Article 4(5) defines pseudonymization as processing after which the data can no longer be attributed to a person without additional information kept separately; the EDPB guidelines 01/2025 insist that pseudonymized data are still personal data. An HMAC with the key in a secrets manager prevents dictionary re-identification by anyone without the key; it does not make the data anonymous.

2. A former subscriber asks for all their data to be erased. Their invoice from two years ago is in the accounting records. What is done with it?

   - A. It is erased immediately, because the right to erasure always prevails
   - B. It is kept forever
   - C. It is kept, blocked for other uses, for as long as the legal obligation lasts (six years under Article 30 of the Spanish Commercial Code), and erased afterward; what is based on consent, such as the mailing list, is erased now
   - D. It is sent to the data subject and deleted from the system

   *Answer C: It is kept, blocked for other uses, for as long as the legal obligation lasts (six years under Article 30 of the Spanish Commercial Code), and erased afterward; what is based on consent, such as the mailing list, is erased now.* Article 17(3)(b) of the GDPR excludes from the right to erasure the processing necessary to comply with a legal obligation. The obligation does not authorize other uses: the data are restricted to that purpose and erased when the period expires.

3. An ML model decides when to buy and sell for its author's own account. Is it a high-risk system under the AI Act?

   - A. Not for being a trading model: Annex III does not include proprietary trading (it does include, for example, assessing the creditworthiness of natural persons); other obligations, such as the Article 50 transparency if it converses with people, may apply to other systems of the same service
   - B. Yes, all financial AI systems are high-risk
   - C. Yes, from August 2, 2026
   - D. Only if it uses neural networks

   *Answer A: Not for being a trading model: Annex III does not include proprietary trading (it does include, for example, assessing the creditworthiness of natural persons); other obligations, such as the Article 50 transparency if it converses with people, may apply to other systems of the same service.* The Annex III categories are a closed list and in finance they cite the creditworthiness and credit scoring of natural persons and the pricing of life and health insurance. For those, Regulation (EU) 2026/1744 has moved the obligations to December 2, 2027. The model is still subject to MiFID II if an investment firm with clients uses it (ESMA statement of May 30, 2024).

4. Out of 2,000 channels that give random signals for a year, the ones with a Sharpe ratio above 1 are advertised. What Sharpe do the advertised ones have over the following six months?

   - A. Around 1.5, as in the year of the advertisement
   - B. More than 1, because they have shown skill
   - C. Exactly 1
   - D. Around 0: their average Sharpe in the year of the advertisement (1.49) was selection, not skill, and outside that sample it drops to −0.04

   *Answer D: Around 0: their average Sharpe in the year of the advertisement (1.49) was selection, not skill, and outside that sample it drops to −0.04.* With random signals, 316 of 2,000 channels exceed a Sharpe of 1 by sheer luck. Picking them by their track record produces an excellent track record with no ability to repeat it; it is the same selection bias that the Deflated Sharpe Ratio of lesson 2.5.4 corrects.

5. What protects an influencer who sends each paying subscriber buy recommendations tailored to their situation, if they add “this is not advice”?

   - A. The disclaimer, which turns it into generic information
   - B. Nothing: a recommendation presented as suitable or based on personal circumstances is advice, which requires authorization, and the CNMV warns that such disclaimers do not protect you or exempt you from complying with the rules
   - C. Charging less than €50 a month
   - D. Publishing on Telegram instead of on a website

   *Answer B: Nothing: a recommendation presented as suitable or based on personal circumstances is advice, which requires authorization, and the CNMV warns that such disclaimers do not protect you or exempt you from complying with the rules.* Article 9 of Delegated Regulation (EU) 2017/565 defines a personal recommendation and clarifies that one issued exclusively to the public is not. The CNMV guide for finfluencers says that publishing “This is not investment advice” does not protect you in those cases.

## Key points

- The GDPR applies to the data of subscribers, clients and users of a trading service: purpose limitation, data minimization and storage limitation (Art. 5). An unkeyed hash of an email is undone by dictionary; an HMAC with the key kept apart is pseudonymization, and the data are still personal.
- Erasure (Art. 17) gives way to a legal retention obligation (Art. 17(3)(b)), such as the six years of Article 30 of the Spanish Commercial Code or the five years of Article 25(1) of MiFIR for an investment firm's orders and transactions; what is kept stays blocked for that purpose.
- AI Act: prohibitions and AI literacy from February 2, 2025, general-purpose AI from August 2, 2025, general application and Article 50 transparency from August 2, 2026, and Annex III high-risk from December 2, 2027 after Regulation (EU) 2026/1744. A proprietary trading model is not in Annex III.
- Anyone can publish investment recommendations, with the objective presentation and conflict of interest obligations of Article 20 of MAR and Delegated Regulation 2016/958; personalized advice requires authorization, and a “this is not advice” disclaimer does not change that.
- With 2,000 random channels, 316 exceed a Sharpe of 1 in a year (average 1.49) and drop to −0.04 over the following six months; choosing the best three-month window or deleting losing signals manufactures equally empty track records. The complete 12-month list of recommendations (Art. 4(1)(i) of Delegated Regulation 2016/958) is the antidote.

## Resources

### Research

- [Introduction to Quant Research](https://pythonparatrading.com/en/quant-research-2/) · Research-0023 · 8 min

### Documentation

- [Regulation (EU) 2016/679 (GDPR), text in the BOE (Spanish)](https://www.boe.es/buscar/doc.php?id=DOUE-L-2016-80807) · boe.es
- [EDPB: Guidelines 01/2025 on pseudonymisation (version for public consultation)](https://www.edpb.europa.eu/our-work-tools/documents/public-consultations/2025/guidelines-012025-pseudonymisation_en) · edpb.europa.eu
- [Regulation (EU) 2024/1689 on artificial intelligence (EUR-Lex)](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R1689) · eur-lex.europa.eu
- [ESMA: public statement on the use of AI in the provision of retail investment services (May 30, 2024)](https://www.esma.europa.eu/sites/default/files/2024-05/ESMA35-335435667-5924__Public_Statement_on_AI_and_investment_services.pdf) · esma.europa.eu
- [CNMV (Spain's securities regulator): guide “Finfluencers: cómo actuar con responsabilidad” (acting responsibly, in Spanish)](https://www.cnmv.es/DocPortal/Publicaciones/Guias/GuiaparaFinfluencers.pdf) · cnmv.es
- [CNMV: guide “Del like a la inversión” (what to know about finfluencers, in Spanish)](https://www.cnmv.es/DocPortal/Publicaciones/Guias/Guia_Del_like_a_la_inversion.pdf) · cnmv.es

Previous lesson: [7.4.6 · Trading taxes in Spain](https://pythonparatrading.com/en/python-trading-course/level-7/trading-taxes-in-spain/)

Next lesson: [7.5.1 · Quant roles: six jobs around the same system](https://pythonparatrading.com/en/python-trading-course/level-7/quant-roles-explained/)
