sql >> Base de Datos >  >> RDS >> Database

Un modelo de datos para negociar acciones, fondos y criptomonedas

El comercio de criptomonedas, la compra de acciones y similares es extremadamente popular en estos días:se percibe como una ganancia fácil. Los precios están aumentando actualmente, pero no podemos saber cuándo cambiará eso. Por otro lado, sabemos que lo hará en algún momento. Pero no estamos aquí para hacer predicciones financieras. En cambio, hablaremos sobre un modelo de datos que se puede usar para respaldar el comercio de criptomonedas e instrumentos financieros como acciones o acciones de fondos.

Lo que necesita saber sobre el comercio de divisas y acciones

Las mejoras tecnológicas en las últimas décadas han tenido un impacto significativo en el comercio. Ahora hay muchas plataformas de comercio en línea que puede usar. La mayor parte del comercio actual se realiza virtualmente:puede ver las acciones en papel en los museos, pero no es probable que vea las acciones que compra en papel. Y no necesita empacar sus maletas y dirigirse a Wall Street o cualquier otra bolsa de valores para hacer una operación. Desde la comodidad de su propia computadora o dispositivo móvil, puede comprar o vender derivados financieros (como bonos, acciones o materias primas).

La mayoría de las operaciones (ventas de derivados financieros) siguen las mismas reglas. Hay vendedores y compradores. Si acuerdan un precio, se produce el comercio. Después de la operación, se recalculará el precio de ese derivado financiero y el proceso continuará con nuevos operadores. Las acciones y otros derivados funcionan de la misma manera.

¿Qué es la criptomoneda? Probablemente hayas oído hablar de Bitcoin y otras criptomonedas. Pero, ¿qué son? Las criptomonedas son como monedas virtuales, pero no están vinculadas a monedas del mundo real (como euros o dólares). En cambio, los usuarios pueden intercambiar criptomonedas entre ellos como tokens. Luego pueden negociar una venta que convierta sus tokens en dinero real. Estas ventas funcionan exactamente igual que las transacciones de acciones y acciones descritas anteriormente.

Este tema es complejo y podríamos tener muchos detalles en nuestro modelo (por ejemplo, registros de documentos y transacciones). Voy a mantenerlo simple; No implementaré ningún tipo de comercio automático ni ninguna fórmula para generar nuevos precios después de un evento comercial.

Entonces, echemos un vistazo a este modelo comercial simple.

El modelo de datos




El modelo de datos consta de tres áreas temáticas:

  1. Currencies
  2. Items
  3. Traders

Presentaremos cada área temática en el orden en que aparece.

Divisas

Las Currencies el tema es simple. Contiene cuatro tablas que almacenan cada moneda que usamos y sus tipos de cambio. Las monedas son importantes porque:

  • Utilizaremos una moneda, llamada moneda base , para negociar. Es probable que una plataforma de comercio de acciones en línea utilice el dólar estadounidense (USD) como moneda base, independientemente de las regiones reales de los comerciantes. Todas las transacciones se convertirán a la moneda base.
  • También podemos tener monedas no base o locales para todos los países donde está disponible nuestra plataforma comercial. Esto nos permitiría mostrar los precios en la moneda local y seguir realizando transacciones en la moneda base.

Las dos tablas restantes relacionan monedas y países.

La tabla más importante en esta área temática es la currency mesa. Aquí es donde almacenaremos todas las monedas que hayamos usado para operar, incluidas las criptomonedas. La inclusión de una moneda en esta tabla depende de si esa moneda se utilizará para pagar los artículos comercializados. Para cada moneda, almacenaremos:

  • code – Un código utilizado para denotar ÚNICAMENTE esa moneda. Para monedas nacionales, este será el código ISO 4217 (por ejemplo, USD para dólar estadounidense) o algún otro código oficial. También podríamos usar ISO 4217 para criptomonedas; XBT es el código ISO de Bitcoin. Sin embargo, Bitcoin también usa el código BTC de manera informal.
  • name – El nombre ÚNICO de esa moneda (por ejemplo, dólar estadounidense).
  • is_active – Si la moneda está actualmente activa en nuestro sistema.
  • is_base – Si esta moneda es la moneda base de nuestro sistema. Por lo general, solo tendremos una moneda base a la vez. Es posible que podamos tener más de uno, como usar euros para los estados de la UE y dólares estadounidenses para otras áreas. En ese caso, tenemos la capacidad de asignar una moneda base a cada país con este atributo.

La siguiente tabla almacena las tasas actuales e históricas entre pares de divisas. En el currency_rate tabla, almacenaremos el currency_id queremos comparar con un base_currency_id así como la rate cuando se almacenó este par (ts ). Dado que almacenaremos las tarifas tal como eran en varios momentos, esta tabla almacenará datos históricos y actuales.

Una lista de todos los países relevantes se almacena en el country diccionario. Además de la clave principal (id ), contiene un atributo que tiene un país ÚNICO name .

La última tabla en esta área temática es currency_used mesa. En la mayoría de los casos, un país siempre utilizará la misma moneda. Aún así, pueden ocurrir cambios, como cuando muchos países de la UE reemplazaron sus monedas nacionales con el euro. Para cubrir tal eventualidad, almacenaremos un historial de todas las monedas que hemos utilizado. Para cada registro de esta tabla, almacenaremos referencias al country tabla (country_id ), la currency tabla (currency_id ), y cuándo se usó esta moneda (date_from y date_to ). Si date_to es NULL, entonces esta moneda está actualmente en uso. Por supuesto, solo debe utilizarse una moneda por país. No implementaremos esa verificación en el modelo; en su lugar, realizaremos una verificación cuando se agregue o actualice un registro en esta tabla.

Objetos

Tablas en los Items El área temática define todos los artículos disponibles para el comercio y su estado actual. También registra todos los cambios que sucedieron en estos elementos a lo largo del tiempo.

El item La tabla enumera todos los artículos que los comerciantes pueden comprar o vender (o que han comprado o vendido). Estos pueden ser acciones, fondos o criptomonedas. Cualquier operación que involucre estos instrumentos financieros utiliza casi exactamente el mismo proceso, por lo que podemos utilizar la misma estructura para todos ellos. Para cada artículo, almacenaremos:

  • code – Un código de texto ÚNICO para ese elemento, similar al que usamos para las acciones (por ejemplo, NASDAQ usa el código "AAPL" para Apple Inc).
  • name – El nombre completo de la empresa (para acciones), fondo o criptomoneda.
  • is_active – Si este artículo está disponible para el comercio o no.
  • currency_id – Hace referencia a la currency utilizado como moneda base para este artículo.
  • details – Todos los detalles adicionales (como el número de acciones emitidas) en formato de texto.

El price tabla rastrea todos los cambios de precios a lo largo del tiempo. Una vez que se ha producido un cambio, almacenaremos el tiempo (ts ), y el buy y sell precio del artículo (item_id ) involucrado. También almacenaremos una referencia a la currency tabla, que nos dice la moneda utilizada para establecer el valor de ese artículo en ese momento. Tenga en cuenta que la moneda preferida para cualquier artículo podría cambiar.

La tabla final en esta área temática es el report mesa. La idea es almacenar informes regulares (es decir, diarios) para cada elemento. Este informe se basará en el comercio durante ese período y mantendrá los detalles financieros en un solo lugar. Estos son datos redundantes, pero pueden resultar muy útiles cuando se consultan precios históricos (lo que sucede a menudo, ya que los comerciantes están muy interesados ​​en las tendencias). Para cada registro de esta tabla, almacenaremos:

  • trading_date – La fecha de este informe. Si necesitamos compilar informes con más frecuencia que una vez al día, tendremos que hacer cambios en el modelo, p. agregando marcas de tiempo que indican cuándo comenzó y terminó un período de negociación.
  • item_id y currency_id – Hace referencia al item y la currency usado.
  • first_price , last_price , min_price , max_price y avg_price – El precio primero, último, máximo, mínimo y promedio de este artículo durante este período.
  • total_amount – El monto total pagado por ese artículo durante el período del informe.
  • quantity – El número (cantidad) de artículos negociados durante este período de informe. Tenga en cuenta que un precio promedio podría calcularse a partir de total_amount y quantity , pero prefiero mantener "total_amount" por separado. Esto simplifica la situación cuando creamos un informe para un período de tiempo más largo, como semanal. En ese caso, podríamos sumar todos los total_amount atributos y dividirlos por la suma de todas las quantity atributos para obtener un precio promedio semanal.

Todos los atributos de esta tabla (aparte de la clave principal y las claves externas) pueden ser NULL. Este será el caso cuando insertemos un registro para un nuevo período de negociación:hasta ahora no hay transacciones. Al comienzo de cada fecha, podemos esperar que insertemos un registro para cada elemento y actualicemos estos valores a medida que avanza el día. El valor actualizado final también será el informe final de ese día.

Comerciantes

Los Traders El área temática es la última que discutiremos, pero es el área más importante en el modelo. Sus cuatro tablas (omitiendo el country y item tablas que ya hemos cubierto) almacenan información sobre los comerciantes, sus inventarios y sus acciones. Tenga en cuenta que la currency La tabla utilizada aquí es solo una copia. Se utiliza para simplificar el modelo y evitar la superposición de relaciones.

La mesa central es el trader mesa. Para cada comerciante, almacenaremos:

  • name y last_name – Nombre y apellido del comerciante.
  • user_name y password – El nombre de usuario y la contraseña (hash) elegidos por el comerciante. El user_name El atributo solo puede almacenar valores ÚNICOS.
  • email – La dirección de correo electrónico del comerciante. Esto se utilizará para completar el proceso de registro y para todos los contactos posteriores con el comerciante. También puede contener solo valores ÚNICOS.
  • confirmation_code – El código enviado al usuario para completar el proceso de registro.
  • time_registered y time_confirmed – Marcas de tiempo de cuándo se registró el comerciante y cuándo completó el proceso de registro.
  • country_id – El country donde vive el comerciante.
  • preferred_currency_id – La currency que el comerciante quiere que se muestren los precios.

La lista de todos los artículos que posee actualmente un comerciante se almacena en el current_inventory mesa. Para cada trader_id ÚNICO – item_id par, almacenaremos la quantity el comerciante posee actualmente.

Las dos tablas restantes están directamente relacionadas con las ofertas y los intercambios. Asumiremos que cada comerciante puede realizar una oferta para comprar o vender artículos a un precio determinado. Cuando aparece una oferta coincidente, se producirá el evento comercial. (No entraremos en detalles que son específicos de las bolsas de valores, donde un corredor actúa como mediador).

Mantendremos un registro de todas las ofertas en la offer mesa. Cualquier comerciante puede hacer una oferta para comprar o vender artículos. Para que esto suceda, necesitamos almacenar los siguientes detalles:

  • trader_id y item_id – Hace referencia al trader quién hizo esa oferta y el item quieren comprar o vender.
  • quantity – La cantidad que quieren comprar o vender.
  • buy y sell – Si esta oferta es para comprar o vender. Solo se puede establecer un atributo a la vez.
  • price – El precio de compra o venta deseado. No es obligatorio porque un comerciante puede querer comprar o vender sin importar cuál sea el precio.
  • ts – La marca de tiempo cuando se insertó este registro.
  • is_active – Si esta oferta sigue activa. Podría volverse inactivo a) si el comerciante lo configura como inactivo, o b) si se ha realizado la operación.

La tabla final de nuestro modelo contiene datos relacionados con el evento comercial. El comercio se lleva a cabo entre dos usuarios después de que ambos hagan una oferta. El precio utilizado puede ser el primer precio ofrecido o el precio actual, dependiendo de lo que queramos implementar en nuestra aplicación. Para cada trade evento, almacenaremos:

  • item_id – Se refiere al item negociado.
  • seller_id y buyer_id – Ambos hacen referencia al trader tabla e indicar los usuarios involucrados en el intercambio.
  • quantity – Cuánto de ese artículo se negoció en esta transacción.
  • unit_price – El precio unitario utilizado para este artículo en este intercambio.
  • description – Todos los detalles adicionales, en formato de texto.
  • offer_id – El ID de la offer que inició este comercio. Nota:La primera oferta inicia una transacción, así que esa es la ID que almacenaremos aquí.
  • ts – La marca de tiempo cuando ocurrió este intercambio.

¿Qué piensas?

Acabamos de considerar un modelo de datos para facilitar el comercio en línea de criptomonedas, acciones y otros derivados financieros. Esto es solo el esqueleto del modelo; Hay un montón de otros detalles que podríamos agregar. Estoy pensando en documentos relacionados con comerciantes y una forma de almacenar información de pago. ¿Qué agregarías? ¿O tal vez eliminar? Cuéntanoslo en los comentarios.