From 93c517952aae52fae443eecb444ac32105114dfd Mon Sep 17 00:00:00 2001 From: Subho Ghosh <93722719+ighoshsubho@users.noreply.github.com> Date: Sun, 23 Jul 2023 18:11:15 +0530 Subject: [PATCH 1/7] Updated CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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. | ``` From 472abf2424cc99973af8674f19387631de87d955 Mon Sep 17 00:00:00 2001 From: Ritik Raj Date: Sun, 23 Jul 2023 22:24:50 +0530 Subject: [PATCH 2/7] added mirr endpoint --- ENDPOINTS.md | 104 +++++++++++++++------- helpers/functions.py | 7 ++ main.py | 23 ++++- tasks/modified_internal_rate_of_return.py | 20 +++++ tests/test_main.py | 17 ++++ validators/request_validators.py | 7 +- 6 files changed, 143 insertions(+), 35 deletions(-) create mode 100644 tasks/modified_internal_rate_of_return.py diff --git a/ENDPOINTS.md b/ENDPOINTS.md index 356104ed..60532765 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 : `{ @@ -2250,4 +2288,4 @@ Sample Output "Average Accounts Payable": 102500, "Average Payment Period": "33.7days", } -``` \ No newline at end of file +``` diff --git a/helpers/functions.py b/helpers/functions.py index 5c84c479..8425d51e 100644 --- a/helpers/functions.py +++ b/helpers/functions.py @@ -2055,3 +2055,10 @@ def average_payment_period(beginning_accounts_payable: float, ending_accounts_pa app = average_accounts_payable / (total_credit_purchases / 365) return app +# 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 \ No newline at end of file diff --git a/main.py b/main.py index e387738b..0091d5c4 100644 --- a/main.py +++ b/main.py @@ -139,6 +139,8 @@ 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 + # Creating the app app = FastAPI( @@ -270,7 +272,8 @@ 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." + "/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", }, } @@ -1858,6 +1861,24 @@ def debt_service_coverage_ratio(request: DebtServiceCoverageRatio): request.tax_rate, request.principal) + +@app.get( + "/modified_internal_rate_of_return", + tags=["mirr"], + description="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 +): + return calculate_modified_internal_rate_of_return_task( + ending_cash_flow, + initial_cash_flow, + 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 cd4f5867..100c2d77 100644 --- a/validators/request_validators.py +++ b/validators/request_validators.py @@ -647,4 +647,9 @@ class PriceElasticity(BaseModel): class AveragePaymentPeriod(BaseModel): beginning_accounts_payable: float ending_accounts_payable: float - total_credit_purchases: float \ No newline at end of file + total_credit_purchases: float + +class ModifiedInternalRateOfReturn(BaseModel): + ending_cash_flow: float + initial_cash_flow: float + number_of_periods: int \ No newline at end of file From 3b5c58c110f713275628c7737ff3b3850876b157 Mon Sep 17 00:00:00 2001 From: VIVEK SATI Date: Tue, 25 Jul 2023 17:19:20 +0530 Subject: [PATCH 3/7] docs: Updated Readme.md --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 2a11c976..f34aed31 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. From a90f65a449c1fdd1058850f6562ad19b509a48f8 Mon Sep 17 00:00:00 2001 From: VIVEK SATI Date: Tue, 25 Jul 2023 17:31:13 +0530 Subject: [PATCH 4/7] docs: Added GSSoC 2K33 in open-source programs section --- Readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 2a11c976..8e3e86ec 100644 --- a/Readme.md +++ b/Readme.md @@ -75,7 +75,8 @@ 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! From 42ec88c70fd9dcc454753c82de0378bcefef236d Mon Sep 17 00:00:00 2001 From: VIVEK SATI Date: Tue, 25 Jul 2023 23:30:33 +0530 Subject: [PATCH 5/7] feat: added dynamic contributors section --- Readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Readme.md b/Readme.md index 01c4ecf8..61a96bed 100644 --- a/Readme.md +++ b/Readme.md @@ -80,6 +80,10 @@ This project is a part of these Open Source Programs ## ✨ Thank You for Your Contribution! +Thanks a lot for spending your time helping fintech-api grow. Thanks a lot! Keep rocking 🍻 +

+ +

From 2dcc760d3bac7fdd5774d1ba45c2ea4d8c260733 Mon Sep 17 00:00:00 2001 From: Subho Ghosh <93722719+ighoshsubho@users.noreply.github.com> Date: Fri, 28 Jul 2023 23:19:50 +0530 Subject: [PATCH 6/7] Updated main.py --- main.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/main.py b/main.py index 0091d5c4..6f5d0c97 100644 --- a/main.py +++ b/main.py @@ -1862,20 +1862,18 @@ def debt_service_coverage_ratio(request: DebtServiceCoverageRatio): request.principal) -@app.get( +@app.post( "/modified_internal_rate_of_return", tags=["mirr"], description="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 + request: ModifiedInternalRateOfReturn ): return calculate_modified_internal_rate_of_return_task( - ending_cash_flow, - initial_cash_flow, - number_of_periods, + request.ending_cash_flow, + request.initial_cash_flow, + request.number_of_periods, ) From 418dfc9cc40aa45d2640c5368b1b4974e74a9320 Mon Sep 17 00:00:00 2001 From: Subho Ghosh <93722719+ighoshsubho@users.noreply.github.com> Date: Fri, 28 Jul 2023 23:21:37 +0530 Subject: [PATCH 7/7] Updated main.py --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index 6f5d0c97..e54df323 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 +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