Vai al contenuto

Creare agenti AI di intelligenza artificiale/Finanza e Trading

Wikibooks, manuali e libri di testo liberi.
Indice del libro

Creazione dell'agente

[modifica | modifica sorgente]

Volendo creare un agente AI che faccia da consulente finanziario e di trading on line, bisogna innnanzitutto creare un notebook Google Colab in cui installare le librerie litellm e yfinance:

!pip install litellm yfinance

Poi bisogna importare l'API KEY dell'LLM prescelto, cliccando sull'immagine della chiave nella barra laterale di sinistra di Colab e abilitandola:

import os
from google.colab import userdata
api_key = userdata.get('GOOGLE_API_KEY')
os.environ['GOOGLE_API_KEY'] = api_key

Poi bisogna creare dei tools (in questo esempio se ne creano 2) : uno per visualizzare gli ultimi dati di un'azione e un altro per visualizzare la media mobile. Poi si crea una funzione python per richiamare Google Gemini e ottenere la risposta tramite prompt programmatici che richiama i tools solo se necessario:

from litellm import completion
import yfinance as yf
import json

def extract_code_block(response: str) -> str:
   """Extract code block from response"""

   if not '```' in response:
      return response

   code_block = response.split('```')[1].strip()
   # Check for "json" at the start and remove

   if code_block.startswith("json"):
      code_block = code_block[4:]

   return code_block


# ---- TOOLS ----

def get_stock_data(ticker: str, period="1mo"):
    """Scarica dati giornalieri di un titolo"""
    data = yf.download(ticker, period=period, interval="1d")
    return data.tail(5).to_dict()

def moving_average(ticker: str, period="1mo", window=5):
    """Calcola la media mobile semplice di un titolo"""
    data = yf.download(ticker, period=period, interval="1d")
    data["SMA"] = data["Close"].rolling(window=window).mean()
    return data[["Close", "SMA"]].tail(10).to_dict()

# ---- AGENTE ----

tools = {
    "get_stock_data": get_stock_data,
    "moving_average": moving_average,
}

def generate_response(messages: str,domanda: str) -> str:
    try:
        response = completion(
            model="gemini/gemini-2.0-flash",
            messages=messages,
            max_tokens=300,
            temperature=0.2
        )
        message=extract_code_block(response.choices[0].message.content)
        # 2. Se la risposta è JSON → chiamiamo il tool

        parsed = json.loads(message)
        if "tool" in parsed:
            tool_name = parsed["tool"]
            args = parsed.get("args", {})
            if tool_name in tools:
                tool_result = tools[tool_name](**args)
                # 3. Rimandiamo al modello il risultato per la risposta finale
                final_response = completion(
                    model="gemini/gemini-2.0-flash",
                    messages=[
                        {"role": "system", "content": "Sei un assistente di trading AI."},
                        {"role": "user", "content": f"Domanda: {domanda}"},
                        {"role": "assistant", "content": f"Ho chiamato il tool {tool_name} con risultato: {tool_result}"}
                    ],
                    max_tokens=400,
                    temperature=0.2
                )
                return final_response["choices"][0]["message"]["content"]

    except:
      pass;

    # 4. Altrimenti restituiamo la risposta normale
    return message

Si crea un messaggio di sistema per l'agente in modo da impartire le istruzioni all'agente che deve essere un esperto di trading on line e di finanza:

agent_rules = [{
    "role": "system",
    "content": (
        "Sei un agente AI per il trading ed esperto di finanza personale e investimenti. "
        "Puoi usare i tool definiti: get_stock_data, moving_average. "
        "Se ti serve chiamare un tool, rispondi con JSON { 'tool': nome_tool, 'args': {...} }. "
        "Se non serve un tool, rispondi normalmente."

    )
}]

Si costruisce un ciclo di 5 iterazioni in cui l'utente inserisce la domanda , si passano al prompt programmatico di sistema agent_rules e domanda, in tal modo si ottiene risposta dall'agente:

iterations = 0
max_iterations = 5

while iterations < max_iterations:

    domanda = input("Inserisci domanda : ")
    user_input=[{"role": "user", "content": f"Domanda: {domanda}"}]

    prompt = agent_rules + user_input

    print("\n🤖 Agent thinking...")
    response = generate_response(prompt,domanda)
    print("\n📬 Agent response:\n", response)


    iterations += 1


Esecuzione dell'agente

[modifica | modifica sorgente]

Inserisci domanda : Se investo 10.000€ al 5% annuo composto per 10 anni, quanto avrò?

🤖 Agent thinking...

📬 Agent response:

Ecco come calcolare l'interesse composto:
  **Formula:** A = P (1 + r/n)^(nt)
   *   A = l'importo del denaro accumulato dopo n anni, compresi gli interessi.
   *   P = l'importo del capitale iniziale
   *   r = il tasso di interesse annuale (in forma decimale)
   *   n = il numero di volte che l'interesse viene composto all'anno
   *   t = il numero di anni in cui il denaro viene investito o preso in prestito
In questo caso:
  *   P = 10.000€
  *   r = 5% o 0,05
  *   n = 1 (composto annualmente)
  *   t = 10 anni
Quindi:
  A = 10.000€ (1 + 0,05/1)^(1*10)
  A = 10.000€ (1,05)^10
  A ≈ 16.288,95€
  Dopo 10 anni, avrai circa 16.288,95€.

Inserisci domanda : Dammi gli ultimi dati di TSLA

🤖 Agent thinking...

📬 Agent response:

Ecco gli ultimi dati di TSLA:
*   **09-10-2025:**
   *   Chiusura: 435.54
   *   Massimo: 436.35
   *   Minimo: 426.18
   *   Apertura: 431.81
   *   Volume: 69149400

Inserisci domanda : Mostrami la media mobile 5 giorni di AAPL

🤖 Agent thinking...

📬 Agent response:

Ecco la media mobile a 5 giorni per AAPL:
2025-09-26: 255.02999572753907
2025-09-29: 254.6999969482422
2025-09-30: 254.73999938964843
2025-10-01: 255.3679992675781
2025-10-02: 255.4200012207031
2025-10-03: 255.93199768066407
2025-10-06: 256.3839996337891
2025-10-07: 256.7540008544922
2025-10-08: 257.2760009765625
2025-10-09: 256.6579986572266

Inserisci domanda : calcolare il valore attuale di una rendita posticipata di 900 euro annue, che dura 17 anni, al tasso 7,15%

🤖 Agent thinking...

📬 Agent response:

Per calcolare il valore attuale di una rendita posticipata, posso usare la formula:
PV = PMT * [1 - (1 + r)^-n] / r
Dove:
*   PV = Valore attuale
*   PMT = Pagamento periodico (900 euro)
*   r = Tasso di interesse periodico (7,15% o 0,0715)
*   n = Numero di periodi (17 anni)
Quindi:
PV = 900 * [1 - (1 + 0,0715)^-17] / 0,0715
PV = 900 * [1 - (1,0715)^-17] / 0,0715
PV = 900 * [1 - 0,3063] / 0,0715
PV = 900 * 0,6937 / 0,0715
PV = 900 * 9,7021
PV = 8731,89
Pertanto, il valore attuale della rendita è di circa 8731,89 euro.

Inserisci domanda : calcolare il montante di una rendita posticipata di 225 euro annue, che dura 12 anni, al tasso 5,15%

🤖 Agent thinking...

📬 Agent response:

Per calcolare il montante di una rendita posticipata, posso usare la formula:
M = R * (((1 + i)^n - 1) / i)
Dove:
* M è il montante
* R è la rata annuale (225 euro)
* i è il tasso di interesse (5,15% = 0,0515)
* n è il numero di anni (12)
Quindi:
M = 225 * (((1 + 0,0515)^12 - 1) / 0,0515)
M = 225 * (((1,0515)^12 - 1) / 0,0515)
M = 225 * ((1,8304 - 1) / 0,0515)
M = 225 * (0,8304 / 0,0515)
M = 225 * 16,1243
M = 3627,97
Il montante della rendita posticipata è di circa 3627,97 euro.