gpt4 book ai didi

python - Python 中投资/股票和期权投资组合的面向对象设计

转载 作者:太空狗 更新时间:2023-10-29 21:51:02 26 4
gpt4 key购买 nike

我是初级/中级 Python 程序员,但我没有编写应用程序,只是编写脚本。我目前没有大量使用面向对象设计,所以我希望这个项目能帮助我培养 OOD 技能。问题是,我不知道从设计的角度从哪里开始(我知道如何创建对象和所有这些东西)。值得一提的是,我也是自学的,没有接受过正规的 CS 教育。

我想尝试编写一个程序来跟踪投资组合中的股票/期权头寸。

我对什么是好的候选对象(投资组合、股票、期权等)和方法(买入、卖出、更新数据等)有一个大概的了解。

多头头寸为买入开仓和卖出平仓,而空头头寸为卖出开仓和买入平仓。

portfolio.PlaceOrder(type="BUY", symbol="ABC", date="01/02/2009", price=50.00, qty=100)
portfolio.PlaceOrder(type="SELL", symbol="ABC", date="12/31/2009", price=100.00, qty=25)
portfolio.PlaceOrder(type="SELLSHORT", symbol="XYZ", date="1/2/2009", price=30.00, qty=50)
portfolio.PlaceOrder(type="BUY", symbol="XYZ", date="2/1/2009", price=10.00, qty=50)

那么,一旦这个方法被调用,我该如何存储信息呢?起初我以为我会有一个具有 Symbol、OpenDate、OpenPrice 等属性的 Position 对象,但是考虑更新头寸以计算销售额变得棘手,因为买卖发生在不同的时间和数量。

  • 买入 100 股开盘,1 次,1 个价格。卖出 4 次不同的时间,4 种不同的价格。
  • 买入 100 股。每天卖出 1 股,为期 100 天。
  • 购买 4 次不同的时间,4 种不同的价格。以 1 次、1 个价格卖出整个头寸。

一个可能的解决方案是为每一股股票创建一个对象,这样每股股票就会有不同的日期和价格。这会不会开销太大?投资组合可能有数千或数百万个小共享对象。如果你想找出一个头寸的总市场值(value),你需要这样的东西:

sum([trade.last_price for trade in portfolio.positions if trade.symbol == "ABC"])

如果你有一个位置对象,计算会很简单:

position.last * position.qty

在此先感谢您的帮助。查看其他帖子,很明显 SO 是为了“帮助”而不是“为您编写程序”。我觉得我只需要一些方向,指向正确的道路。

反射(reflection)后的附加信息目的该程序将跟踪所有头寸,包括未平仓头寸和平仓头寸;能够查看详细的损益。

当我考虑详细的 P&L 时,我希望看到... - 所有开放日期(和关闭日期) - 举办时间 - 开盘价(收盘日期) - 自开盘以来的盈亏 - 每日损益

@Senderle

I think perhaps you're taking the "object" metaphor too literally, and so are trying to make a share, which seems very object-like in some ways, into an object in the programming sense of the word. If so, that's a mistake, which is what I take to be juxtapose's point.

这是我的错误。考虑“对象”share 对象似乎是自然而然的选择。直到可能有数百万人时,这个想法才显得疯狂。这个周末我会有一些空闲的编码时间,我会尝试创建一个有数量的对象。

最佳答案

在设计这样的系统时,您应该牢记两个基本规则:

  1. 消除数据中的冗余。没有冗余可以确保完整性。
  2. 以最低的详细程度保留回答任何查询所需的所有数据。

基于这些规则,我的建议是维护一个事务日志文件。每笔交易都代表某种状态的变化,以及所有相关的事实:何时、什么、买/卖、多少、多少等。每笔交易都由一条记录表示(命名元组在这里很有用)在平面文件中。一年(甚至 5 年或 10 年)的交易应该很容易地放入内存驻留列表中。然后,您可以创建函数来从该列表中选择、排序和汇总您需要的任何信息,并且驻留在内存中,速度会惊人地快,比 SQL 数据库快得多。

当交易日志变得太大或太慢时,您可以计算截至特定日期(如年末)的所有头寸状态,将其用于下一时期的初始状态,并存档您的旧日志文件到光盘。

您可能需要一些关于您持有的 Assets 的辅助信息,例如任何特定日期的值(value)/价格,因此您可以绘制任何或所有 Assets 的值(value)与时间(此类信息有在线资源,yahoo finance一个。)包含有关您的每项 Assets 的静态信息的主数据库也很有用。

我知道这听起来不太“面向对象”,但是 OO 设计可能有助于将系统的详细工作隐藏在 TransLog 对象中,并提供将数据保存/恢复到的方法/从光盘(保存/打开方法),输入/更改/删除交易;以及将数据处理成有意义的信息显示的其他方法。

首先用命令行界面编写API。如果您对此感到满意,则可以根据需要继续创建 GUI 前端。

祝你好运,玩得开心!

关于python - Python 中投资/股票和期权投资组合的面向对象设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5399873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com