Soy un programador principiante/intermedio de Python pero no he escrito una aplicación, solo scripts. Actualmente no uso mucho diseño orientado a objetos, por lo que me gustaría que este proyecto me ayudara a desarrollar mis habilidades OOD. El problema es que no sé por dónde empezar desde la perspectiva del diseño (sé cómo crear los objetos y todo eso). Por lo que vale, también soy autodidacta, no tengo educación formal de CS.Diseño orientado a objetos para un portafolio de inversiones/stock y opciones en Python
Me gustaría intentar escribir un programa para hacer un seguimiento de las posiciones de stock/opciones de una cartera.
Tengo una idea aproximada de lo que serían buenos candidatos para objetos (Cartera, Stock, Opción, etc.) y métodos (Comprar, Vender, Actualizar datos, etc.).
Una posición larga sería buy-to-open, y sell-to-close mientras que una posición corta tiene sell-to-open y buy-to-close.
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)
Luego, una vez que se llama este método, ¿cómo almaceno la información? Al principio pensé que tendría un objeto Position con atributos como Symbol, OpenDate, OpenPrice, etc. pero pensar en actualizar la posición para dar cuenta de las ventas se vuelve complicado porque las compras y las ventas ocurren en diferentes momentos y cantidades.
- Comprar 100 acciones para abrir, 1 vez, 1 precio. Vende 4 veces diferentes, 4 precios diferentes.
- Comprar 100 acciones. Venda 1 acción por día, durante 100 días.
- Compre 4 veces diferentes, 4 precios diferentes. Vende toda la posición al 1 vez, 1 precio.
Una posible solución sería crear un objeto para cada acción, de esta forma cada acción tendría diferentes fechas y precios. ¿Esto sería demasiado por encima? La cartera podría tener miles o millones de pequeños objetos Share. Si usted quiere saber el valor total de mercado de una posición que había necesidad de algo así como:
sum([trade.last_price for trade in portfolio.positions if trade.symbol == "ABC"])
Si tuviera una posición objetar el cálculo sería simple:
position.last * position.qty
Gracias de antemano por la ayuda. En cuanto a otras publicaciones, es evidente que SO es para "ayudar" a no "escribir su programa para usted". Siento que solo necesito una dirección, señalando el camino correcto.
INFORMACIÓN ADICIONAL después de una reflexión El propósito El programa sería realizar un seguimiento de todas las posiciones, abierta y cerrada; con la capacidad de ver una ganancia y una pérdida detalladas.
Cuando pienso en detalles P & L Quiero ver ... - todas las fechas de apertura (y fechas cerradas) - tiempo mantuvo - precio de apertura (fecha de cierre) - P & L desde la apertura - P & L por día
@Senderle
I piense que tal vez está tomando la metáfora del "objeto" demasiado literalmente, y por eso está tratando de hacer un intercambio, que en cierto sentido parece muy similar a un objeto, en un objeto en el sentido de programación de la palabra. Si es así, es un error, que es lo que considero un punto de yuxtaposición.
Este es mi error. Al pensar en "objetos", un objeto share
parece candidato natural. Solo hasta que haya millones, la idea parece una locura. Voy a tener un poco de tiempo de codificación libre este fin de semana y trataré de crear un objeto con una cantidad.
Desea una capa de base de datos para este tipo de aplicaciones. – Santa
por curiosidad, al no estar muy familiarizado con esta jerga, ¿tengo razón en que una posición "abierta" es simplemente una tenencia distinta de cero (positiva, o negativa para una posición corta) en una acción en particular? – senderle
Sí, una posición abierta sería distinta de cero. Básicamente hay dos tipos de posiciones: larga y corta. Largo es lo que piensa la mayoría de la gente cuando invierte. Compre bajo, venda alto. Una posición corta es lo opuesto a ir largo. Usted toma prestado acciones de su corredor y las vende en el mercado, creando una obligación de que deba devolver las acciones a su proveedor roto (o cuando él las devuelva). El proceso es (pedir prestado) vender alto, comprar bajo (devolverlo a su corredor). –