Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added endpoint to calculate Bond Valuation #506

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions DOCUMENTATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -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. |
|--------------------------- ---|----------------------------------------|---------------------------------------------------------|
21 changes: 21 additions & 0 deletions ENDPOINTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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",
}
```
9 changes: 9 additions & 0 deletions helpers/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
14 changes: 13 additions & 1 deletion main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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(
Expand Down Expand Up @@ -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",

},
}
Expand Down Expand Up @@ -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)
18 changes: 18 additions & 0 deletions tasks/bond_valuation.py
Original file line number Diff line number Diff line change
@@ -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)
2 changes: 1 addition & 1 deletion tasks/tax_bracket_calculator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
6 changes: 6 additions & 0 deletions validators/request_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -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