我是一名初学者/中级 Python 程序员,但我没有编写应用程序,只是编写脚本。我目前没有使用很多面向对象的设计,所以我希望这个项目能够帮助我培养 OOD 技能。问题是,我不知道从设计角度从哪里开始(我知道如何创建对象和所有这些东西)。对于它的价值,我也是自学的,没有正规的 CS 教育。
我想尝试编写一个程序来跟踪投资组合的股票/期权头寸。
我对什么是好的对象候选(投资组合、股票、期权等)和方法(购买、销售、UpdateData 等)有一个粗略的想法。
多头头寸有买入开仓和卖出平仓,而空头头寸有卖出开仓和买入平仓。
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 个价格卖出全部头寸。
一种可能的解决方案是为每一股股票创建一个对象,这样每一股就会有不同的日期和价格。这会不会有太多开销?投资组合可能有成千上万个小 Share 对象。如果你想找出一个头寸的总市值,你需要这样的东西:
sum([trade.last_price for trade in portfolio.positions if trade.symbol == "ABC"])
如果你有一个位置对象,计算会很简单:
position.last * position.qty
在此先感谢您的帮助。查看其他帖子,很明显 SO 是“帮助”而不是“为您编写程序”。我觉得我只需要一些方向,指向正确的道路。
反思后的附加信息 目的 该程序将跟踪所有头寸,包括未平仓头寸;能够查看详细的损益。
当我考虑详细的损益时,我想查看... - 所有开盘日期(和收盘日期) - 持有时间 - 开盘价(收盘日期) - 自开盘以来的盈亏 - 每天的盈亏
@Senderle
我认为也许您将“对象”比喻过于字面化,因此正试图将在某些方面看起来非常像对象的共享变成该词的编程意义上的对象。如果是这样,那是一个错误,这就是我认为并列的观点。
这是我的错误。考虑“对象”一个share
对象似乎很自然。直到可能有数百万人,这个想法才显得疯狂。这个周末我会有一些空闲的编码时间,并会尝试创建一个有数量的对象。