Source code for portfolio_toolkit.position.closed_position

from dataclasses import dataclass, field
from typing import List

import pandas as pd

from .position import Position


[docs] @dataclass class ClosedPosition(Position): buy_date: str sell_price: float sell_date: str value: float = field(init=False) profit: float = field(init=False) return_percentage: float = field(init=False) def __post_init__(self): super().__post_init__() # Calcula `cost` desde Position self.value = self.sell_price * self.quantity self.profit = self.value - self.cost self.return_percentage = ( (self.profit / self.cost * 100) if self.cost != 0 else 0 )
[docs] @classmethod def to_dataframe(cls, positions: List["ClosedPosition"]) -> pd.DataFrame: """Convert a list of Position objects to a pandas DataFrame.""" if not positions: return pd.DataFrame() data = [] for position in positions: data.append( { "ticker": position.ticker, "buy_date": position.buy_date, "buy_price": position.buy_price, "quantity": position.quantity, "cost": position.cost, "sell_date": position.sell_date, "sell_price": position.sell_price, "value": position.value, "profit": position.profit, "return_percentage": position.return_percentage, } ) return pd.DataFrame(data)
def __repr__(self): return ( f"ClosedPosition(ticker={self.ticker}, buy_price={self.buy_price}, quantity={self.quantity}, " f"cost={self.cost}, buy_date={self.buy_date}, sell_price={self.sell_price}, " f"sell_date={self.sell_date}, value={self.value}, profit={self.profit}, " f"return_percentage={self.return_percentage})" )