diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f7d9f1f7..9b742627 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -179,7 +179,7 @@ def simple_interest_rate(request: SimpleInterestRateRequest): +Update the Docs ``` |---------------------------|----------------------------------------|---------------------------------------------------------| -| GET /simple_interest_rate | Calculate simple interest rates | - `amount_paid` (float): The amount paid. | +| POST /simple_interest_rate | Calculate simple interest rates | - `amount_paid` (float): The amount paid. | | | | - `principle_amount` (float): The principle amount. | | | | - `months` (int): The number of months. | ``` diff --git a/ENDPOINTS.md b/ENDPOINTS.md index ad2c6987..4fc8370d 100644 --- a/ENDPOINTS.md +++ b/ENDPOINTS.md @@ -105,7 +105,6 @@ } ``` - **GET** `/asset_portfolio` - Required parameters : `price_A`, `price_B`, `return_A`, `return_B`, `standard_dev_A`, `standard_dev_B` and `correlation` where A and B refer to the 2 stocks. @@ -1584,7 +1583,6 @@ Add-function-and-endpoint-to-calculate-lump-sum-mutual-fund-investment } ``` - **GET** `/asdcr` - Required parameters :`net_operating_cost`, @@ -1593,7 +1591,6 @@ Add-function-and-endpoint-to-calculate-lump-sum-mutual-fund-investment `annual_debt_service` - Sample output - ```py { @@ -1603,28 +1600,32 @@ Add-function-and-endpoint-to-calculate-lump-sum-mutual-fund-investment "Depreciation":20000.0, "Non Cash Expenses":5000.0, "Annual Debt":60000.0 - + } ``` **GET** `/calculate_vat` + - required parameters : `price`, `vat_rate` - Sample Request: GET /calculate_vat?price=100&vat_rate=20 - Sample output + ```py { "Price (excluding VAT)": 83.33, "Price (including VAT)": 100.0, "VAT Amount": 16.67 -} +} ``` **GET** `/bond_equivalent_yield` + - required parameters : `face_value`, `purchase_price`,`days_to_maturity` - Sample Request: GET /bond_equivalent_yield?face_value=1000&purchase_price=900&days_to_maturity=182 - Sample output + ```py { "Tag": "Bond Equivalent Yield", @@ -1638,10 +1639,10 @@ Add-function-and-endpoint-to-calculate-lump-sum-mutual-fund-investment **GET** `/loan-affordability` - Required parameters : `income`, - `expenses`, - `loan_term`, - `interest_rate`, -- Sample Request: `GET`, `http://127.0.0.1:8000/loan-affordability?income=5000&expenses=2000&loan_term=12&interest_rate=5`, + `expenses`, + `loan_term`, + `interest_rate`, +- Sample Request: `GET`, `http://127.0.0.1:8000/loan-affordability?income=5000&expenses=2000&loan_term=12&interest_rate=5`, - Sample output @@ -1659,13 +1660,12 @@ Add-function-and-endpoint-to-calculate-lump-sum-mutual-fund-investment **GET** `/calculate_bvps` - Required parameters : `stockholders_equity`, - `preferred_stock`, `average_outstanding_shares`, - + `preferred_stock`, `average_outstanding_shares`, - Sample output ```py { - + "Tag": "Calculate Book value per share", "Stockholders Equity":1000000.0, "Preferred Stock value":50000.0, @@ -1676,11 +1676,13 @@ Add-function-and-endpoint-to-calculate-lump-sum-mutual-fund-investment ``` **GET** `/gratuity-amount` + - Required parameters : `last_salary`, - `tenure_years`, - `tenure_months`, -- Sample Request: `GET`, `http://localhost:8000/calculate_gratuity?last_salary=20000000&tenure_years=10&tenure_months=1`, + `tenure_years`, + `tenure_months`, +- Sample Request: `GET`, `http://localhost:8000/calculate_gratuity?last_salary=20000000&tenure_years=10&tenure_months=1`, - Sample output + ```py { { @@ -1707,9 +1709,11 @@ Add-function-and-endpoint-to-calculate-lump-sum-mutual-fund-investment ``` - **GET** `/personal_savings` +**GET** `/personal_savings` + - Required parameters : 'init','monthly', 'tenure' - Sample output + ```py { "Tag": "Simple Personal Savings", @@ -1721,9 +1725,11 @@ Add-function-and-endpoint-to-calculate-lump-sum-mutual-fund-investment ``` **GET** `/accrint` + - Required parameters : `issue_date`,`settlement_date`,`rate`,`par`, -- Sample Request: `GET`, `http://localhost:8000/accrint?issue_date=01-01-2012&settlement_date=15-02-2012&rate=5.25&par=5000&frequency=4&basis=3`, +- Sample Request: `GET`, `http://localhost:8000/accrint?issue_date=01-01-2012&settlement_date=15-02-2012&rate=5.25&par=5000&frequency=4&basis=3`, - Sample output + ```py { "Tag":"Accrued Interest", @@ -1737,12 +1743,13 @@ Add-function-and-endpoint-to-calculate-lump-sum-mutual-fund-investment } ``` +# GET # Endpoint --> '/mortrage' -# GET # Endpoint --> '/mortrage' Required Paramenters --> princial:int,interest_rate:float,years:int,down_payment:int,property_tax_rate:float,insurance_rate:float Sample request --> http://127.0.0.1:8000/mortrages?princial=200000&interest_rate=4.5&years=45&down_payment=50000&property_tax_rate=1.3&insurance_rate=0.5 Sample Output + ```py { "Monthly Payment": 648.4110284532501, @@ -1755,10 +1762,12 @@ Sample Output ``` ## GET ## Endpoint --> '/social_securities' + Required Parameters --> birth_date:str,earnings:int,retirement_age:int Sample request --> http://127.0.0.1:8000/social_securities?birth_date=10-08-2002&earnings=250000&retirement_age=70 Sample Output + ```py [ "The monthly benefits are 20833.333333333332 and future benefits are 55349.83286723857" @@ -1768,6 +1777,7 @@ Sample Output **GET** `/calculate_net_profit_margin` -Required parameters: `revenue`, `cost_of_goods_sold`, `operating_expenses`, `other_expenses`, `interest`, `taxes` -Sample Output + ```py { "Tag":"Net Profit Margin", @@ -1785,6 +1795,7 @@ Sample Output **GET** `/calculate_expected_return_of_portfolio` -Required parameters: `no_of_investments`, `weight_of_investment`, `rate_of_return` -Sample Output + ```py { "Tag": "Expected Return of Portfolio", @@ -1797,10 +1808,10 @@ Sample Output ``` - **GET** `/calculate_sharpe_ratio_function` -Required parameters: `returns`, `risk_free_rate` -Sample Output + ```py { @@ -1814,6 +1825,7 @@ Sample Output **GET** `/calculate_post_tax_return_percentage` -Required parameters: `tax_rate_percentage`, `annual_net_income`, `initial_cost_of_investment` -Sample Output + ```py { "Tag" : "Post Tax Return Percentage", @@ -1829,6 +1841,7 @@ Sample Output - Required parameters :`base`,`jb`,`stock`,`pb`,`bonus`,`ptax`,`deduction` - Sample output + ```py { @@ -1841,14 +1854,14 @@ Sample Output "tax percentage":15, "any additional deduction":0, "ctc calculated":2040000.0 - + } ``` **GET** `/loan_to_value_ratio` -- Required parameters : `loan_amount`, `value_of_collateral` +- Required parameters : `loan_amount`, `value_of_collateral` - Sample output ```py @@ -1863,6 +1876,7 @@ Sample Output **GET** `/calculate_treynor_ratio_function` -Required parameters: `returns`, `risk_free_rate`,`beta` -Sample Output + ```py { "Tag": "Treynor Ratio", @@ -1876,6 +1890,7 @@ Sample Output - Required parameters - Sample output + ```py { "Tag":"Free Cash Flow to Equity", @@ -1916,7 +1931,7 @@ Sample Output **GET** `/capital_gains_yield` -- Required parameters : `inital_price`, `price_after_first_period` +- Required parameters : `inital_price`, `price_after_first_period` - Sample output ```py @@ -1927,18 +1942,20 @@ Sample Output "Capital Gains Yield": 10%, } ``` - + **GET** `/macaulay-duration` + - Required parameters : `face_value`, - `coupon_rate`, - `dt`, - `month`, - `year`, - `coupon_frequency`, - `discount_rate`, + `coupon_rate`, + `dt`, + `month`, + `year`, + `coupon_frequency`, + `discount_rate`, -- Sample Request: `GET`, `http://localhost:8000/calculate_macaulay_duration?face_value=1000.0&coupon_rate=0.06&dt=19&month=6&year=2026&coupon_frequency=2&discount_rate=0.06`, +- Sample Request: `GET`, `http://localhost:8000/calculate_macaulay_duration?face_value=1000.0&coupon_rate=0.06&dt=19&month=6&year=2026&coupon_frequency=2&discount_rate=0.06`, - Sample output + ```py { { @@ -1958,6 +1975,7 @@ Sample Output **GET** `/calculate_financial_leverage` -Required parameters: `total_assets`, `total_liabilities`, `short_term_debt`, `long_term_debt` -Sample Output + ```py { "Tag" : "Calculate financial leverage", @@ -1973,6 +1991,7 @@ Sample Output **GET** `/portfolio_return_monte_carlo` -Required parameters: `principal`, `expected_return_range_start`,`expected_return_range_end`, `volatility_range_start`,`volatility_range_end`, `num_simulations` -Sample Output + ```py { 'Tag': 'Portfolio Return Monte Carlo', @@ -2034,6 +2053,22 @@ Sample Output "Capitalization Rate": 6.16% } ``` + +**GET** `/modified_internal_rate_of_return` + +- Required parameters : 'ending_cash_flow','initial_cash_flow', 'number_of_periods' +- Sample output + +```py +{ + "Tag": "Modified internal rate of return", + "Ending cash flow": 500000, + "Initial cash flow": -300000, + "Number of periods": 5, + "Modified internal rate of return": f"12.04%", +} +``` + **POST** `/capm` - Request body : `{ @@ -2084,6 +2119,7 @@ Sample Output "profit": 1560.8, "cost_price": 7500.4 }` + ```py { "Tag": "Profit Percentage", @@ -2103,6 +2139,7 @@ Sample Output "non_cash_charges": 25000.00 }` - Sample output + ```py { "Tag": "Defensive Interval Ratio", @@ -2115,7 +2152,7 @@ Sample Output "Daily Operational Expenses": 753.42, "Defensive Interval Ratio": 92.90 } -``` +``` **POST** `/loss_percent` @@ -2132,7 +2169,8 @@ Sample Output "Cost Price": 7500.47, "Loss Percentage": 6.67, } -``` +``` + **POST** `/rate_return_calculator` - Request body : `{ @@ -2252,6 +2290,8 @@ Sample Output } ``` + + **POST** `/ppf_calculator` - Request body : `{ diff --git a/Readme.md b/Readme.md index 2a11c976..61a96bed 100644 --- a/Readme.md +++ b/Readme.md @@ -66,7 +66,7 @@ Welcome to FinTech API, our powerful API is designed to simplify your life by of ## ✨ Contributing Roadmap - Go through the [CONTRIBUTING.md](https://github.com/Clueless-Community/fintech-api/blob/main/CONTRIBUTING.md) file, where all the guidelines have been mentioned that will guide you to make your contribution. - - Do checkout the [project workflow](https://github.com/Clueless-Community/fintech-api/blob/main/CONTRIBUTING.md#project-worflow) section. + - Do checkout the [project workflow](https://github.com/Clueless-Community/fintech-api/blob/main/CONTRIBUTING.md#project-workflow) section. Join our growing community of developers who have already discovered the power of FinTech APIzap and contribute to the project's ambition to empower users with the ability to handle financial tasks efficiently. @@ -75,10 +75,15 @@ Join our growing community of developers who have already discovered the power o This project is a part of these Open Source Programs -- [Diversion 2K33](https://diversion.tech/) +- [Diversion 2K33](https://diversion.tech/) +- [GSSoC 2K33](https://gssoc.girlscript.tech/) ## ✨ Thank You for Your Contribution! +Thanks a lot for spending your time helping fintech-api grow. Thanks a lot! Keep rocking 🍻 +

+ +

diff --git a/helpers/functions.py b/helpers/functions.py index 8e3f734a..1f2ad552 100644 --- a/helpers/functions.py +++ b/helpers/functions.py @@ -2055,7 +2055,15 @@ def average_payment_period(beginning_accounts_payable: float, ending_accounts_pa app = average_accounts_payable / (total_credit_purchases / 365) return app -# Function to Calculate PPF +# Function to calculate Modified Internal Rate of Return (MIRR) + +def calculate_modified_internal_rate_of_return(ending_cash_flow: float, + initial_cash_flow: float, + number_of_periods: int): + mirr = ((ending_cash_flow / initial_cash_flow) ** (1 / number_of_periods)) - 1 + return mirr*100 + + #Function to Calculate PPF def ppf_calculator(depos:int, tenure:int, diff --git a/main.py b/main.py index 69315f2c..8be2f270 100644 --- a/main.py +++ b/main.py @@ -135,12 +135,14 @@ 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 +from validators.request_validators import SimpleInterestRateRequest, calculatePension, compoundInterest, futureSip, paybackPeriod, capmRequest, DebtServiceCoverageRatio, futureValueOfAnnuity, futureValueOfAnnuityDue, ProfitPercentage, LossPercentage, DefensiveIntervalRatio, CashConversionCycle, RateofReturn, financialAssestRatio, PriceElasticity, PolicyPremium, AveragePaymentPeriod, ModifiedInternalRateOfReturn from tasks.financialAssestRatio import financial_assest_ratio from tasks.PriceElasticity import calculate_price_elasticity from tasks.average_payment_period import average_payment_period_task +from tasks.modified_internal_rate_of_return import calculate_modified_internal_rate_of_return_task from tasks.PPFCalculator import ppf_calculator + # Creating the app app = FastAPI( title="FinTech API", @@ -271,8 +273,9 @@ def index(): "/portfolio_return_monte_carlo":"Calculates Portfolio returns based on Monte Carlo Simulation", "/profit_percent": "Calculates the profit percentage", "/loss_percent": "Calculates the loss percentage", - "/average_payment_period": "Calculate Average Payment Period a metric that allows a business to see how long it takes on average to pay its vendors." - "/ppf_calculator": "Calculates Public Provident Fund(PPF)" + "/average_payment_period": "Calculate Average Payment Period a metric that allows a business to see how long it takes on average to pay its vendors.", + "/modified_internal_rate_of_return": "Calculate modified internal rate of return", + "/ppf_calculator": "Calculates Public Provident Fund(PPF)", }, } @@ -1860,6 +1863,22 @@ def debt_service_coverage_ratio(request: DebtServiceCoverageRatio): request.tax_rate, request.principal) + +@app.post( + "/modified_internal_rate_of_return", + tags=["mirr"], + description="Calculate Modified Internal Rate of Return (MIRR)", +) +def calculate_modified_internal_rate_of_return( + request: ModifiedInternalRateOfReturn +): + return calculate_modified_internal_rate_of_return_task( + request.ending_cash_flow, + request.initial_cash_flow, + request.number_of_periods, + ) + + #Endpoint to calculate profit percentage @app.post( "/profit_percent", diff --git a/tasks/modified_internal_rate_of_return.py b/tasks/modified_internal_rate_of_return.py new file mode 100644 index 00000000..ba019f06 --- /dev/null +++ b/tasks/modified_internal_rate_of_return.py @@ -0,0 +1,20 @@ +from helpers import functions +from fastapi import HTTPException, status + +def calculate_modified_internal_rate_of_return_task(ending_cash_flow: float, + initial_cash_flow: float, + number_of_periods: int +): + try: + mirr = functions.calculate_modified_internal_rate_of_return( + ending_cash_flow, initial_cash_flow, number_of_periods + ) + return { + "Tag": "Modified internal rate of return", + "Ending cash flow": ending_cash_flow, + "Initial cash flow": initial_cash_flow, + "Number of periods": number_of_periods, + "Modified internal rate of return": f"{mirr}%", + } + except: + return HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR) \ No newline at end of file diff --git a/tests/test_main.py b/tests/test_main.py index 6c44a0b6..ee036849 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1423,3 +1423,20 @@ def test_loan_to_value_ratio(): "Loan to Value Ratio": "91066.66666666666%" } + +def test_modified_internal_rate_of_return(): + response = client.get( + "http://127.0.0.1:8000/modified_internal_rate_of_return?initial_cash_flow=-300000&ending_cash_flow=500000&number_of_periods=5" + ) + assert response.status_code == status.HTTP_200_OK + + assert response.json() == { + "Tag": "Modified internal rate", + "Ending cash flow": 500000, + "Initial cash flow": -300000, + "Number of periods": 5, + "Modified internal rate of return": "12.04%", + } + + + diff --git a/validators/request_validators.py b/validators/request_validators.py index 06efcc82..83496a41 100644 --- a/validators/request_validators.py +++ b/validators/request_validators.py @@ -648,8 +648,13 @@ class AveragePaymentPeriod(BaseModel): beginning_accounts_payable: float ending_accounts_payable: float total_credit_purchases: float - + +class ModifiedInternalRateOfReturn(BaseModel): + ending_cash_flow: float + initial_cash_flow: float + number_of_periods: int + class PPFcalculator(BaseModel): depos:int tenure:int - interest:float \ No newline at end of file + interest:float