sql >> Database >  >> RDS >> Database

Een gegevensmodel voor het verhandelen van aandelen, fondsen en cryptocurrencies

Het verhandelen van cryptocurrencies, het kopen van aandelen en dergelijke is tegenwoordig enorm populair - het wordt gezien als gemakkelijke winst. De prijzen stijgen momenteel, maar we kunnen niet weten wanneer dat zal veranderen. Aan de andere kant weten we dat het ooit zal gebeuren. Maar we zijn hier niet om financiële voorspellingen te doen. In plaats daarvan zullen we het hebben over een datamodel dat kan worden gebruikt om de handel in cryptocurrencies en financiële instrumenten zoals aandelen of fondsaandelen te ondersteunen.

Wat u moet weten over het handelen in valuta en aandelen

Technologische verbeteringen in de afgelopen decennia hebben een aanzienlijke impact gehad op de handel. Er zijn nu veel online handelsplatforms die u kunt gebruiken. De meeste handel van vandaag vindt virtueel plaats - u kunt papieren aandelen in musea zien, maar u zult de aandelen die u koopt waarschijnlijk niet in papieren vorm zien. En u hoeft uw koffers niet te pakken en naar Wall Street of een andere beurs te gaan om te handelen. Vanuit het comfort van uw eigen computer of mobiele apparaat kunt u financiële derivaten (zoals obligaties, aandelen of grondstoffen) kopen of verkopen.

De meeste transacties (verkoop van financiële derivaten) volgen dezelfde regels. Er zijn verkopers en kopers. Als ze het eens zijn over een prijs, gebeurt de handel. Na de transactie wordt de prijs van dat financiële derivaat opnieuw berekend en gaat het proces verder met nieuwe handelaren. Aandelen en andere derivaten werken op dezelfde manier.

Wat is cryptocurrency? Je hebt waarschijnlijk wel eens gehoord van Bitcoin en andere cryptocurrencies. Maar wat zijn ze? Cryptocurrencies zijn als virtuele valuta, maar ze zijn niet gebonden aan echte valuta's (zoals euro's of dollars). In plaats daarvan kunnen gebruikers onderling cryptocurrencies verhandelen als tokens. Ze kunnen dan onderhandelen over een verkoop die hun tokens in echt geld verandert. Deze verkopen werken precies zoals de hierboven beschreven aandelen- en aandelentransacties.

Dit onderwerp is complex en we zouden veel details in ons model kunnen hebben (bijvoorbeeld records van documenten en transacties). Ik ga het simpel houden; Ik zal geen enkele vorm van automatische handel of formules implementeren om nieuwe prijzen te genereren na een handelsevenement.

Laten we dus eens kijken naar dit eenvoudige handelsmodel.

Het gegevensmodel




Het datamodel bestaat uit drie vakgebieden:

  1. Currencies
  2. Items
  3. Traders

We presenteren elk onderwerp in de volgorde waarin het wordt vermeld.

Valuta's

De Currencies onderwerp is eenvoudig. Het bevat vier tabellen die elke valuta die we gebruiken en hun wisselkoersen opslaan. Valuta's zijn belangrijk omdat:

  • We gebruiken één valuta, de basisvaluta , voor de handel. Een online platform voor aandelenhandel zal waarschijnlijk de Amerikaanse dollar (USD) als basisvaluta gebruiken, ongeacht de werkelijke regio's van de handelaren. Alle transacties worden omgerekend naar de basisvaluta.
  • We kunnen ook niet-basisvaluta's of lokale valuta's hebben voor alle landen waar ons handelsplatform beschikbaar is. Dit zou ons in staat stellen om prijzen in de lokale valuta weer te geven, maar toch transacties in de basisvaluta uit te voeren.

De overige twee tabellen hebben betrekking op valuta's en landen.

De belangrijkste tabel in dit onderwerpgebied is de currency tafel. Hier slaan we alle valuta op die we ooit hebben gebruikt om te handelen, inclusief cryptocurrencies. Of een valuta in deze tabel is opgenomen, hangt af van of die valuta zal worden gebruikt om voor de verhandelde items te betalen. Voor elke valuta slaan we op:

  • code – Een code die UNIEK wordt gebruikt om die valuta aan te duiden. Voor nationale valuta is dit de ISO 4217-code (bijv. USD voor Amerikaanse dollar) of een andere officiële code. We zouden ook ISO 4217 kunnen gebruiken voor cryptocurrencies; XBT is de ISO-code van Bitcoin. Bitcoin gebruikt de code BTC echter ook informeel.
  • name – De UNIEKE naam van die valuta (bijv. Amerikaanse dollar).
  • is_active – Als de valuta momenteel actief is in ons systeem.
  • is_base – Als deze valuta de basisvaluta van ons systeem is. Meestal hebben we slechts één basisvaluta tegelijk. Het is mogelijk dat we er meer dan één hebben, zoals het gebruik van euro's voor EU-staten en Amerikaanse dollars voor andere gebieden. In dat geval hebben we de mogelijkheid om een ​​basisvaluta toe te wijzen aan elk land met dit kenmerk.

De volgende tabel bevat huidige en historische koersen tussen valutaparen. In de currency_rate tabel, slaan we de currency_id . op we willen vergelijken met een base_currency_id evenals het rate wanneer dit paar werd opgeslagen (ts ). Aangezien we tarieven opslaan zoals ze waren op verschillende tijdstippen, worden in deze tabel zowel historische als actuele gegevens opgeslagen.

Een lijst van alle relevante landen wordt opgeslagen in het country woordenboek. Naast de primaire sleutel (id ), het bevat één kenmerk met een UNIEKE land name .

De laatste tabel in dit onderwerpgebied is de currency_used tafel. In de meeste gevallen zal een land altijd dezelfde valuta gebruiken. Toch kunnen er veranderingen plaatsvinden, zoals toen veel EU-landen hun nationale valuta vervingen door de euro. Om een ​​dergelijke mogelijkheid te dekken, slaan we een geschiedenis op van alle valuta's die we hebben gebruikt. Voor elk record in deze tabel slaan we verwijzingen op naar het country tabel (country_id ), de currency tabel (currency_id ), en wanneer deze valuta werd gebruikt (date_from en date_to ). Als date_to NULL is, dan is deze valuta momenteel in gebruik. Per land mag natuurlijk maar één munteenheid worden gebruikt. We zullen die controle niet in het model implementeren; in plaats daarvan voeren we een controle uit wanneer een record wordt toegevoegd of bijgewerkt in deze tabel.

Artikelen

Tabellen in de Items onderwerpgebied definieert alle items die beschikbaar zijn voor handel en hun huidige status. Het registreert ook alle wijzigingen die in de loop van de tijd met deze items zijn gebeurd.

Het item tabel bevat alle items die handelaren kunnen kopen of verkopen (of die ze hebben gekocht of verkocht). Dit kunnen aandelen, fondsen of cryptocurrencies zijn. Elke transactie waarbij deze financiële instrumenten betrokken zijn, gebruikt bijna exact hetzelfde proces, dus we kunnen voor al deze instrumenten dezelfde structuur gebruiken. Voor elk item slaan we op:

  • code – Een UNIEKE tekstcode voor dat item, vergelijkbaar met wat we gebruiken voor aandelen (NASDAQ gebruikt bijvoorbeeld de code "AAPL" voor Apple Inc).
  • name – De volledige naam van het bedrijf (voor aandelen), fonds of cryptocurrency.
  • is_active – Of dit item nu beschikbaar is om te ruilen of niet.
  • currency_id – Verwijst naar de currency gebruikt als basisvaluta voor dit item.
  • details – Alle aanvullende details (zoals het aantal uitgegeven aandelen) in tekstvorm.

De price tabel volgt alle prijsveranderingen in de tijd. Zodra er een wijziging heeft plaatsgevonden, slaan we de tijd op (ts ), en de buy en sell prijs voor het artikel (item_id ) betrokken. We slaan ook een verwijzing op naar de currency tabel, die ons de valuta vertelt die werd gebruikt om de waarde van dat item op dat moment in te stellen. Merk op dat de voorkeursvaluta voor elk item kan veranderen.

De finaletafel in dit onderwerpgebied is het report tafel. Het idee is om voor elk item regelmatige (d.w.z. dagelijkse) rapporten op te slaan. Dit rapport is gebaseerd op de handel in die periode en houdt financiële gegevens op één plek bij. Dit zijn overbodige gegevens, maar het kan erg handig zijn bij het opvragen van historische prijzen (wat vaak gebeurt, omdat handelaren buitengewoon geïnteresseerd zijn in trends). Voor elk record in deze tabel slaan we op:

  • trading_date – De datum van dit rapport. Als we vaker dan één keer per dag rapporten moeten opstellen, zullen we wijzigingen in het model moeten doorvoeren. tijdstempels toevoegen die aangeven wanneer een handelsperiode begon en eindigde.
  • item_id en currency_id – Verwijst naar het gerelateerde item en de currency gebruikt.
  • first_price , last_price , min_price , max_price en avg_price – De eerste, laatste, maximale, minimale en gemiddelde prijs voor dit artikel gedurende deze periode.
  • total_amount – Het totale bedrag dat tijdens de rapportageperiode voor dat item is betaald.
  • quantity – Het aantal (hoeveelheid) artikelen dat in deze verslagperiode is verhandeld. Houd er rekening mee dat een gemiddelde prijs kan worden berekend op basis van total_amount en quantity , maar ik geef er de voorkeur aan om "total_amount" gescheiden te houden. Dit vereenvoudigt de situatie wanneer we een rapport maken voor een langere periode, zoals wekelijks. In dat geval zouden we alle total_amount . kunnen toevoegen attributen en deel ze door de som van alle quantity attributen om een ​​wekelijkse gemiddelde prijs te krijgen.

Alle attributen in deze tabel (behalve de primaire sleutel en de externe sleutels) kunnen NULL zijn. Dit is het geval wanneer we een record voor een nieuwe handelsperiode invoegen - er zijn tot nu toe geen transacties. Aan het begin van elke datum kunnen we verwachten dat we voor elk item één record invoegen en deze waarden bijwerken naarmate de dag vordert. De laatste bijgewerkte waarde is ook het eindrapport voor die dag.

Handelaars

De Traders onderwerpgebied is het laatste dat we zullen bespreken, maar het is het belangrijkste gebied in het model. De vier tabellen (zonder het country en item tabellen die we al hebben behandeld) bevatten informatie over handelaren, hun voorraden en hun acties. Merk op dat de currency tabel die hier wordt gebruikt, is slechts een kopie. Het wordt gebruikt om het model te vereenvoudigen en overlappende relaties te voorkomen.

De centrale tafel is de trader tafel. Voor elke handelaar slaan we op:

  • first_name en last_name – De voor- en achternaam van de handelaar.
  • user_name en password – De gebruikersnaam en het wachtwoord (hash) gekozen door de handelaar. De user_name attribuut kan alleen UNIEKE waarden opslaan.
  • email – Het e-mailadres van de handelaar. Dit wordt gebruikt om het registratieproces te voltooien en voor alle daaropvolgende contacten met de handelaar. Het kan ook alleen UNIEKE waarden bevatten.
  • confirmation_code – De code die naar de gebruiker is verzonden om het registratieproces te voltooien.
  • time_registered en time_confirmed – Tijdstempels van wanneer de handelaar zich heeft geregistreerd en wanneer ze het registratieproces hebben voltooid.
  • country_id – Het country waar de handelaar woont.
  • preferred_currency_id – De currency waarin de handelaar prijzen wil weergeven.

De lijst met alle items die een handelaar momenteel bezit, wordt opgeslagen in de current_inventory tafel. Voor elke UNIEKE trader_iditem_id paar, we slaan de quantity op de handelaar bezit momenteel.

De overige twee tabellen zijn direct gerelateerd aan aanbiedingen en transacties. We gaan ervan uit dat elke handelaar een aanbod kan doen om artikelen tegen een bepaalde prijs te kopen of te verkopen. Wanneer een bijpassende aanbieding verschijnt, vindt het handelsevenement plaats. (We zullen niet ingaan op details die specifiek zijn voor beurzen, waar een makelaar als bemiddelaar optreedt.)

We houden alle aanbiedingen bij in de offer tafel. Elke handelaar kan een aanbod plaatsen om artikelen te kopen of te verkopen. Om dit mogelijk te maken, moeten we de volgende gegevens opslaan:

  • trader_id en item_id – Verwijst naar de trader wie die aanbieding heeft geplaatst en het item ze willen kopen of verkopen.
  • quantity – De hoeveelheid die ze willen kopen of verkopen.
  • buy en sell – Als dit aanbod voor aan- of verkoop is. Er kan slechts één kenmerk tegelijk worden ingesteld.
  • price – De gewenste koop- of verkoopprijs. Het is niet vereist omdat een handelaar misschien wil kopen of verkopen, ongeacht de prijs.
  • ts – Het tijdstempel waarop dit record is ingevoegd.
  • is_active – Of deze aanbieding nog actief is. Het kan inactief worden a) als de handelaar het op inactief zet, of b) als de transactie heeft plaatsgevonden.

De finaletafel in ons model bevat gegevens met betrekking tot de handelsgebeurtenis. De handel vindt plaats tussen twee gebruikers nadat ze allebei een aanbieding hebben gedaan. De gebruikte prijs kan de eerste prijs zijn die wordt aangeboden of de huidige prijs, afhankelijk van wat we in onze applicatie willen implementeren. Voor elke trade evenement slaan we op:

  • item_id – Verwijst naar het item verhandeld.
  • seller_id en buyer_id – Beide verwijzen naar de trader tabel en duiden de gebruikers aan die bij de handel betrokken zijn.
  • quantity – Hoeveel van dat item werd verhandeld in deze transactie.
  • unit_price – De eenheidsprijs die voor dit artikel in deze handel wordt gebruikt.
  • description – Alle aanvullende details, in tekstformaat.
  • offer_id – De ID van de offer waarmee deze handel is begonnen. Opmerking:met de eerste aanbieding wordt een transactie gestart, dus dat is de ID die we hier opslaan.
  • ts – Het tijdstempel waarop deze transactie plaatsvond.

Wat denk je?

We hebben zojuist een datamodel overwogen om de online handel in cryptocurrencies, aandelen en andere financiële derivaten te vergemakkelijken. Dit is slechts de kern van het model; er zijn nog een heleboel andere details die we kunnen toevoegen. Ik denk aan documenten met betrekking tot handelaren en een manier om betalingsinformatie op te slaan. Wat zou je toevoegen? Of misschien verwijderen? Vertel het ons in de comments.


  1. Gegevens invoegen van de ene databasetabel naar een andere databasetabel in Mysql

  2. Werken met cPanel MySQL-databases

  3. Een SSIS-pakket uitvoeren met dtexec

  4. De waarde van de identiteitskolom retourneren na invoeging in Oracle