Bij het bouwen van een portfolio -assistent maakt de kwaliteit van uw gegevensbron het verschil. U hebt een feed nodig die betrouwbaar, realtime en gemakkelijk om mee te werken is.
Dit is precies waar Financial Modellering Prep’s (FMP) ETF Holdings API komt binnen.
De API biedt gedetailleerde informatie over de afzonderlijke bedrijven in een ETF – inclusief de naam van elke voorraad, tickers symbool en gewichtspercentage.
Dit maakt het ongelooflijk eenvoudig om assistenten te bouwen die echte gebruikersvragen kunnen beantwoorden zonder complexe financiële databases.
Hier is een voorbeeld van hoe eenvoudig het is om ETF Holdings -gegevens op te halen:
https://financialmodelingprep.com/api/v3/etf-holdings/SPY?apikey=YOUR_API_KEY
Een oproep als deze zal gestructureerde informatie retourneren zoals:
{
"holdings": [
{
"asset": "Apple Inc.",
"assetSymbol": "AAPL",
"weightPercentage": 7.2
},
{
"asset": "Microsoft Corporation",
"assetSymbol": "MSFT",
"weightPercentage": 6.1
},
...
]
}
Met deze schone gegevensset in de hand, kunt u eenvoudig vragen beantwoorden zoals:
- “Welke voorraad heeft het hoogste gewicht in spion?”
- “Maak een lijst van alle bedrijven in QQQ boven 2% gewicht.”
- “Laat me alle technologische aandelen zien in VTI.” (met enkele verbeteringen)
Door de ETF Holdings API van FMP te gebruiken, elimineert u het zware werk van handmatige gegevensextractie en laat uw AI -systeem gefocust blijven op het leveren van snelle, nauwkeurige portfolio -inzichten.
Voordat we duiken in het ophalen van ETF -bedrijven en het bouwen van een portfolio -assistent, laten we de omgeving snel instellen.
Het idee is om dingen licht en modulair te houden, zodat u het later gemakkelijk kunt uitbreiden als u wilt.
1. Installeer de vereiste bibliotheken
Je hebt slechts een paar Python -bibliotheken nodig om te beginnen:
- verzoeken – Om de FMP API te bellen en ETF -bedrijven op te halen.
- openai of een andere lichtgewicht LLM API – Om gebruikersvragen op natuurlijke wijze te interpreteren.
- (Optioneel) Panda’s – Als u Holdings -gegevens schoneer wilt organiseren.
U kunt ze installeren met:
pip install requests openai pandas
(Als u een andere LLM -provider gebruikt, pas dan de bibliotheek dienovereenkomstig aan.)
2. Krijg uw FMP API -sleutel
U hebt een API -sleutel nodig van Financial Modellering Prep.
Als u er geen hebt, kunt u zich eenvoudig registreren bij de voorbereiding van de financiële modellen en uw sleutel krijgen.
Zodra je het hebt, bewaar het veilig:
FMP_API_KEY = "your_actual_api_key_here"
3. (Optioneel) Krijg uw LLM API -sleutel
Als u van plan bent om de GPT -modellen van Openai of iets dergelijks te gebruiken, hebt u ook een API -sleutel van de respectieve provider nodig.
Voorbeeld voor openai:
OPENAI_API_KEY = "your_openai_api_key_here"
We zullen het later gebruiken om gebruikersvragen te verzenden en intelligenter te interpreteren.
4. Overzicht van de projectstructuur
Hier is een eenvoudige structuur die u kunt volgen:
portfolio_assistant/
│
├── app.py # Main logic for fetching data and answering questions
├── helpers.py # (Optional) Utility functions for API calls and formatting
├── requirements.txt # List of required libraries
└── README.md # Basic project overview
Door dingen modulair te houden, wordt het gemakkelijker om later verbeteringen toe te voegen, zoals sectorafbraak, multi-ETF-behandeling of een webinterface.
Met de projectopstelling klaar, is de eerste stap om Live ETF Holdings op te halen met behulp van de API van FMP.
We zullen een eenvoudige Python -functie maken die alle aandelen in een bepaalde ETF trekt, samen met hun gewichtspercentages.
Hier is hoe u het kunt doen:
import requestsFMP_API_KEY = "your_actual_api_key_here"
def fetch_etf_holdings(etf_symbol):
url = f"https://financialmodelingprep.com/api/v3/etf-holdings/{etf_symbol}?apikey={FMP_API_KEY}"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
return data.get("holdings", [])
else:
print(f"Error fetching data: {response.status_code}")
return []
Voorbeeldgebruik:
holdings = fetch_etf_holdings("SPY")for holding in holdings:
print(f"{holding['assetSymbol']} - {holding['asset']} - {holding['weightPercentage']}%")
Voorbeelduitvoer:
AAPL - Apple Inc. - 7.2%
MSFT - Microsoft Corporation - 6.1%
AMZN - Amazon.com Inc. - 3.5%
...
Wat deze functie u geeft
- bezit – Volledige bedrijfsnaam (bijv. Apple Inc.)
- Assetsymbol – Stock Ticker (bijv. AAPL)
- gewicht – Hoeveel gewicht die voorraad heeft in de ETF
Deze schone structuur maakt het ongelooflijk eenvoudig om aandelen te ondervragen, rangschikken en filteren op basis van gebruikersvragen.
Zodra u de ETF Holdings -gegevens hebt, is de volgende stap het ontwerpen van de logica die de vragen van de gebruiker interpreteert en slimme antwoorden retourneert.
We houden het simpel:
– Gebruik een lichtgewicht LLM (zoals GPT-3.5 of een klein open-source model) tot Detecteer de bedoeling van de gebruiker.
– Dan, Pas filterlogica toe over de Holdings -gegevens op basis van die intentie.
1. Definieer mogelijke gebruikersintenties
Uw portfolio -assistent kan worden ontworpen om vragen te verwerken als:
• Top Holdings
Example: "Show me the top 5 holdings in SPY."• Holdings Above a Threshold
Example: "List all stocks in QQQ with more than 3% weight."
• Specific Stock Query
Example: "What is Apple's weight in SPY?"
Later kun je dit uitbreiden naar nog meer intenties zoals Sector breakdowns of ETF -vergelijkingen.
2. Proef lichtgewicht intentiedetectie
Hier is een eenvoudige functie die trefwoorddetectie gebruikt (of u kunt dit verbeteren met behulp van LLM -prompt voltooiing):
def detect_intent(question):
question = question.lower()if "top" in question:
return "top_holdings"
elif "more than" in question or "above" in question:
return "holdings_above_threshold"
elif "weight" in question:
return "specific_stock_weight"
else:
return "unknown"
U kunt dit verbeteren door de vraag naar een LLM te sturen met een prompt zoals:
Classificeer de volgende gebruikersvraag in een van deze categorieën: [top_holdings, holdings_above_threshold, specific_stock_weight]. Vraag: {user_question}
Parseer vervolgens het antwoord van de LLM.
3. Doe de intenties op Holdings -gegevens
Bijvoorbeeld:
• Bovenste belangen:
def get_top_holdings(holdings, top_n=5):
sorted_holdings = sorted(holdings, key=lambda x: x['weightPercentage'], reverse=True)
return sorted_holdings[:top_n]
• Holdings boven een drempel:
def get_holdings_above_threshold(holdings, threshold=3.0):
return [h for h in holdings if h['weightPercentage'] > threshold]
• Specifiek voorraadgewicht:
def get_stock_weight(holdings, stock_symbol):
for h in holdings:
if h['assetSymbol'].lower() == stock_symbol.lower():
return h['weightPercentage']
return None
4. Voorbeeldstroom
user_question = "Show me the top 5 holdings in SPY"
intent = detect_intent(user_question)holdings = fetch_etf_holdings("SPY")
if intent == "top_holdings":
top_stocks = get_top_holdings(holdings)
for stock in top_stocks:
print(f"{stock['assetSymbol']} - {stock['asset']} - {stock['weightPercentage']}%")
Laten we een paar voorbeelden doorlopen om te zien hoe de portfolio -assistent omgaan met vragen van echte gebruikers met behulp van FMP’s ETF Holdings API en lichtgewicht logica.
Voorbeeld 1:
Gebruikersvraag: “Laat me de Top 5 Holdings in Spy zien.”
Stroom:
- Detecteer intentie → top_holdings.
- Holdings -gegevens ophalen voor spion.
- Sorteer op gewichtpercentage en kies de top 5.
Code Voorbeeld:
user_question = "Show me the top 5 holdings in SPY"
intent = detect_intent(user_question)holdings = fetch_etf_holdings("SPY")
if intent == "top_holdings":
top_stocks = get_top_holdings(holdings)
for stock in top_stocks:
print(f"{stock['assetSymbol']} - {stock['asset']} - {stock['weightPercentage']}%")
Monsteruitgang:
AAPL - Apple Inc. - 7.2%
MSFT - Microsoft Corporation - 6.1%
AMZN - Amazon.com Inc. - 3.5%
NVDA - NVIDIA Corporation - 3.2%
GOOGL - Alphabet Inc. - 2.8%
Voorbeeld 2:
Gebruikersvraag: “Maak een lijst van alle aandelen in QQQ met een gewicht van meer dan 3%.”
Stroom:
- Detecteer intentie → Holdings_above_threshold.
- Holdings -gegevens ophalen voor QQQ.
- Filtervoorraden waar gewichtpercentage> 3.0.
Code Voorbeeld:
user_question = "List all stocks in QQQ with more than 3% weight"
intent = detect_intent(user_question)holdings = fetch_etf_holdings("QQQ")
if intent == "holdings_above_threshold":
filtered_stocks = get_holdings_above_threshold(holdings, threshold=3.0)
for stock in filtered_stocks:
print(f"{stock['assetSymbol']} - {stock['asset']} - {stock['weightPercentage']}%")
Belangrijke afhaalrestaurants
- De assistent haalt op Live ETF Holdings.
- Het detecteert de bedoeling van gebruikersvragen, zelfs als ze iets anders formuleren.
- Antwoorden zijn nauwkeurig, realtime en direct afgeleid van de FMP-gegevens.
