Django模型用于时间序列数据

9

我和我的朋友正在开发一款股票交易应用,我们希望在每天结束时保留我们拥有的每只股票的历史价格。其中最重要的三个字段是股票代码价格日期

例如:

01/01/2018 - Bought Stock A, record price of Stock A at end of day(EOD)
01/02/2018 - Did nothing, record price of Stock A at EOD
01/03/2018 - Bought Stock B, record price of Stock A and Stock B at EOD
01/04/2018 - Sell Stock A, record price of Stock B at EOD

我们正在使用Django来构建模型。每天我们会记录我们所持有的每只股票的价格。这组数据仅供外部使用,不会公开展示。
我的初步研究表明,将历史价格存储为单个表,并将每只股票的每个价格作为单独的行存储不是理想的方法。在使用Django时不确定最佳方法是什么。存储所有这些数据的Django模型会是什么样子?我们应该使用MYSQL吗?
2个回答

6
您需要将数据模型分为三种:
  • 库存模型,含有历史记录、当前价格和数量以及元数据的链接
  • 购买历史模型
  • 价格历史模型
这三个模型都从库存模型中的外键连接。以下是示例代码:
from django.db import models
from django.util.translation import ugettext_lazy as _
from datetime import date


class StockAsset(models.Model):
    symbol = models.CharField(max_length=5)
    amount = models.PositiveIntegerField()
    price = models.FloatField()

class PurchaseHistory(models.Model):
    BUY = 1
    SELL = 2
    ACTION_CHOICES = (
        (BUY, _('buy')),
        (SELL, _('sell')),
    )
    action = models.PositiveIntegerField(choices=ACTION_CHOICES)
    action_date = models.DateTimeField(auto_now_add=True)
    stock = models.ForeignKey(StockAsset,
        on_delete=models.CASCADE, related_name='purchases'
    )

class PriceHistory(models.Model):
    stock = models.ForeignKey(StockAsset, on_delete=models.CASCADE, related_name='price_history')
    price_date = models.DateField(default=date.today)

这样,您就可以访问StockAsset模型中的所有内容。从这里开始阅读。
对于此操作,选择数据库类型并不是非常重要。如果您没有偏好,请选择PostgreSQL。

谢谢你的回答,Melvyn!这是我的理解,StockAsset表将跟踪我们所持有的股票的最新价格和数量。PurchaseHistory表将跟踪我们所有的交易记录。PriceHistory将跟踪每日收盘时的所有历史数据。我理解得对吗?你知道这个方案是否适用于大规模应用吗?比如说我们有2000个股票持仓,每天存储2000个价格。 - Alan
它可以很好地扩展,因为在大多数情况下,您只需要创建最多两个小表连接。 - Melvyn Sopacua
1
price_date是一个日期字段,那么你要在哪里存储价格历史记录呢? - Florent
1
不要使用Float来表示货币 - 而是使用Decimal。 - phi
@phi 或者更好的是 int。 - Ezra

1
如果您只关心日期而不是每次价格变动的时间戳,则django-simple-history是一种选择。您只需更新价值(价格),将其保存在时间序列中的不同表格中由该库完成,甚至不需要定义日期字段。
class StockAsset(models.Model):
    history = HistoricalRecords()

    symbol = models.CharField(...)
    price = models.DecimalField(max_digit=8, decimal_places=2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接