diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md index d2a4cbc..77d74a0 100644 --- a/DOCUMENTATION.md +++ b/DOCUMENTATION.md @@ -82,3 +82,8 @@ The initial price of the product or service. | | POST /margin_of_safety | Calculate margin of safety | - `current_sales` (float): The amount of current sales. | | | | - `break_even_point` (float): The break_even_point amount. | |--------------------------- ---|----------------------------------------|---------------------------------------------------------| +| POST /bond_valuation | Calculate Bond valuation | - `face_value` (int):Amount calculated for coupon payments. | +| | | - `coupon_rate` (float): The annul coupon payment. | +| | | - `years_to_maturity` (int): Years remaining till its maturity date. | +| | | - `discount_rate` (float): It is used to discount future cash flows. | +|--------------------------- ---|----------------------------------------|---------------------------------------------------------| diff --git a/ENDPOINTS.md b/ENDPOINTS.md index be417c0..170f572 100644 --- a/ENDPOINTS.md +++ b/ENDPOINTS.md @@ -2362,3 +2362,24 @@ Sample Output "Margin Of Safety": 8%, } ``` + +**POST** `/bond_valuation` + +- Request body : `{ + "face_value": 1000, + "coupon_rate": 0.05, + "years_to_maturity": 10, + "discount_rate": 0.08 +}` +- Sample output + +```py +{ + "Tag": "Bond Valuation", + "Face Value": 1000, + "Coupon Rate": 0.05, + "Years to Maturity": 10, + "Discount Rate": 0.08, + "Bond Valuation": 928.50", +} +``` diff --git a/helpers/functions.py b/helpers/functions.py index ebfbbb7..7c80115 100644 --- a/helpers/functions.py +++ b/helpers/functions.py @@ -2112,3 +2112,12 @@ def tax_bracket_calculator(income:float, filing_status:str): def margin_of_safety(current_sales:float, break_even_point: float): margin = ((current_sales - break_even_point) / current_sales) * 100 return margin + +# Function to Calculate Bond Valuation + +def calculate_bond_value(face_value, coupon_rate, years_to_maturity, discount_rate): + coupon_payment = face_value * coupon_rate + cash_flows = [coupon_payment] * years_to_maturity + cash_flows[-1] += face_value + bond_value = sum([cf / (1 + discount_rate) ** i for i, cf in enumerate(cash_flows)]) + return bond_value diff --git a/main.py b/main.py index 2f5cefc..9f5f6d9 100644 --- a/main.py +++ b/main.py @@ -135,7 +135,7 @@ from tasks.cash_conversion_cycle import cash_conversion_cycle_task from tasks.financialAssestRatio import financial_assest_ratio from tasks.PolicyPremium import calculate_policy_premium -from validators.request_validators import SimpleInterestRateRequest, calculatePension, compoundInterest, futureSip, paybackPeriod, capmRequest, DebtServiceCoverageRatio, futureValueOfAnnuity, futureValueOfAnnuityDue, ProfitPercentage, LossPercentage, DefensiveIntervalRatio, CashConversionCycle, RateofReturn, financialAssestRatio, PriceElasticity, PolicyPremium, AveragePaymentPeriod, ModifiedInternalRateOfReturn, SavingGoal, InterestCoverageRatio, MarginOfSafety, TaxBracketCalculator +from validators.request_validators import SimpleInterestRateRequest, calculatePension, compoundInterest, futureSip, paybackPeriod, capmRequest, DebtServiceCoverageRatio, futureValueOfAnnuity, futureValueOfAnnuityDue, ProfitPercentage, LossPercentage, DefensiveIntervalRatio, CashConversionCycle, RateofReturn, financialAssestRatio, PriceElasticity, PolicyPremium, AveragePaymentPeriod, ModifiedInternalRateOfReturn, SavingGoal, InterestCoverageRatio, MarginOfSafety, TaxBracketCalculator, BondValuation from tasks.financialAssestRatio import financial_assest_ratio from tasks.PriceElasticity import calculate_price_elasticity from tasks.average_payment_period import average_payment_period_task @@ -144,6 +144,7 @@ from tasks.interest_coverage_ratio import interest_coverage_ratio_task from tasks.tax_bracket_calculator import tax_bracket_calculator from tasks.margin_of_safety import margin_of_safety_task +from tasks.bond_valuation import bond_valuation_task # Creating the app app = FastAPI( @@ -279,6 +280,7 @@ def index(): "/modified_internal_rate_of_return": "Calculate modified internal rate of return", "/interest_coverage_ratio": "Calculates interest coverage ratio", "/margin_of_safety": "Calculates margin of safety", + "/bond_valuation": "Calculates Bond Valuation", }, } @@ -2033,3 +2035,13 @@ def tax_bracket_calculator(request: TaxBracketCalculator): ) def margin_of_safety(request: MarginOfSafety): return margin_of_safety_task(request.current_sales, request.break_even_point) + + +# Endpoint to calculate Bond Valuation +@app.post( + "/bond_valuation", + tags=["bond_valuation"], + description="Calculates Bond Valuation", +) +def bond_valuation(request: BondValuation): + return bond_valuation_task(request.face_value, request.coupon_rate, request.years_to_maturity, request.discount_rate) diff --git a/tasks/bond_valuation.py b/tasks/bond_valuation.py new file mode 100644 index 0000000..ff3efe1 --- /dev/null +++ b/tasks/bond_valuation.py @@ -0,0 +1,18 @@ +from helpers import functions +from fastapi import HTTPException, status + +def bond_valuation_task(face_value: int, coupon_rate: float, years_to_maturity: int, discount_rate : float): + try: + result = functions.calculate_bond_value( + face_value, coupon_rate, years_to_maturity, discount_rate + ) + return { + "Tag": "Bond Valuation", + "Face Value": face_value, + "Coupon Rate": coupon_rate, + "Years to Maturity": years_to_maturity, + "Discount Rate": discount_rate, + "Bond Valuation": f"{result}", + } + except: + return HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR) \ No newline at end of file diff --git a/tasks/tax_bracket_calculator.py b/tasks/tax_bracket_calculator.py index 328c7ea..825a650 100644 --- a/tasks/tax_bracket_calculator.py +++ b/tasks/tax_bracket_calculator.py @@ -44,5 +44,5 @@ def tax_bracket_calculator(income: float, filing_status: str,): 'Tax Bracket': "{:.2%}".format(tax_rate), 'Tax Liability': tax_liability, } - except: + except: return HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR) \ No newline at end of file diff --git a/validators/request_validators.py b/validators/request_validators.py index 96bd688..1a8eecb 100644 --- a/validators/request_validators.py +++ b/validators/request_validators.py @@ -673,3 +673,9 @@ class TaxBracketCalculator(BaseModel): class MarginOfSafety(BaseModel): current_sales:float break_even_point: float + +class BondValuation(BaseModel): + face_value: int + coupon_rate: float + years_to_maturity: int + discount_rate : float