|
class StockSale: |
|
def __init__(self, name, sale_price, purchase_price, quantity, holding_period_months): |
|
self.name = name |
|
self.sale_price = sale_price |
|
self.purchase_price = purchase_price |
|
self.holding_period_months = holding_period_months |
|
self.quantity = quantity |
|
|
|
def calculate_capital_gain(self): |
|
if self.holding_period_months > 12: |
|
return self.calculate_ltcg() |
|
else: |
|
return self.calculate_stcg() |
|
|
|
def calculate_ltcg(self): |
|
|
|
indexed_cost = self.purchase_price |
|
ltcg = (self.sale_price - indexed_cost) * self.quantity |
|
return ltcg |
|
|
|
def calculate_stcg(self): |
|
|
|
stcg = (self.sale_price - self.purchase_price) * self.quantity |
|
return stcg |
|
|
|
class Portfolio: |
|
def __init__(self): |
|
self.stocks = [] |
|
|
|
def add_stock(self, stock_sale): |
|
self.stocks.append(stock_sale) |
|
|
|
def analyze_portfolio(self): |
|
total_stcg = 0 |
|
total_ltcg = 0 |
|
for stock in self.stocks: |
|
gain = stock.calculate_capital_gain() |
|
if stock.holding_period_months > 12: |
|
total_ltcg += gain |
|
else: |
|
total_stcg += gain |
|
return total_stcg, total_ltcg |
|
|
|
def apply_tax(self, total_stcg, total_ltcg): |
|
stcg_tax = max(0, total_stcg) * 0.15 |
|
if total_ltcg > 100000: |
|
ltcg_tax = (total_ltcg - 100000) * 0.10 |
|
else: |
|
ltcg_tax = 0 |
|
total_tax = stcg_tax + ltcg_tax |
|
return stcg_tax, ltcg_tax, total_tax |
|
|
|
class Stock: |
|
def __init__(self, name, purchase_price, current_price, quantity): |
|
self.name = name |
|
self.purchase_price = purchase_price |
|
self.current_price = current_price |
|
self.quantity = quantity |
|
|
|
def calculate_capital_gain(self): |
|
return (self.current_price - self.purchase_price) * self.quantity |
|
|
|
def calculate_capital_loss(self): |
|
return -self.calculate_capital_gain() if self.calculate_capital_gain() < 0 else 0 |
|
|
|
def optimize_taxes_selling_stocks(stocks): |
|
suggested_stocks_to_sell = [] |
|
for stock in stocks: |
|
if stock.calculate_capital_gain() < 0: |
|
suggested_stocks_to_sell.append(stock) |
|
return suggested_stocks_to_sell |
|
|
|
def calculate_total_loss(stocks): |
|
total_loss = 0 |
|
for stock in stocks: |
|
total_loss += stock.calculate_capital_loss() |
|
return total_loss |