python compounding interest - python

I'm trying to figure out how to get the interest and principal to display correctly over the years. Here is the part of my code I am having trouble with:
print ('Luke\n-----')
print ('Year\tPrincipal\tInterest\t Total')
LU_RATE = .05
YEAR = 1
Principal = 100
for YEAR in range (1,28):
# Calculating Luke's total using formula for compounding interest
Lu_Total = (Principal * ((1 + LU_RATE) ** YEAR))
# I realize it's a logical error occurring somewhere here
Lu_Interest = #I'm not sure what to code here
Lu_Principal = #And here
# Displaying the Principal, Interest, and Total over the 27
print (YEAR,'\t%.02f\t\t %.02f\t\t %.02f' %(Lu_Principal, Lu_Interest, Lu_Total))
This is what gets displayed (minus the comment symbols of course):
Luke
-----
Year Principal Interest Total
1 # # 105.00
2 # # 110.25
3 # # 115.76
4 # # 121.55
5 # # 127.63
6 # # 134.01
#etc etc....
Every equation I've tried to code had the correct Interest for year one but ends up putting the Principal as the Total. Every year past that calculates out to the wrong numbers.
It should look like:
Luke
-----
Year Principal Interest Total
1 100.00 5.00 105.00
2 105.00 5.25 110.25
3 110.25 5.51 115.76
#etc etc....
I've been working at it on and off throughout the day and just can't seem to figure it out. Thank you in advance for any help or suggestions.

This sounds like homework, so I'll be a little vague:
You have a loop. Your program executes from the top of the loop to the bottom of the loop, and then goes back and starts over at the top of the loop again.
You can change things by setting values in the bottom of the loop that will be used in the top of the loop next time.
For example, you can compute the interest based on this year's principal. You're doing that in the top of the loop.
At the bottom of the loop, after you print everything out for this year, you could change the (next year's) principal by adding (this year's) interest to it. Then 100 would become 105, etc.

And another contestant ;-)
print ('Luke\n-----')
print ('Year\tPrincipal\tInterest\t Total')
rate = .05
principal = 100.
for year in range (1, 28):
# calculate interest and total
interest = principal * rate
total = principal + interest
# displaying this year's values
print(year,'\t%.02f\t\t %.02f\t\t %.02f' %(principal, interest, total))
# next year's principal == this year's total
principal = total
produces
Luke
-----
Year Principal Interest Total
1 100.00 5.00 105.00
2 105.00 5.25 110.25
3 110.25 5.51 115.76
4 115.76 5.79 121.55
# ... etc ...

Here is what I did:
print ('Luke\n-----')
print ('Year\tPrincipal\tInterest\t Total')
LU_RATE = .05
YEAR = 1
Principal = 100
Prev_Principal = 100 #added to store previous year principal
for YEAR in range (1,28):
# Calculating Luke's total using formula for compounding interest
Lu_Total = (Principal * ((1 + LU_RATE) ** YEAR))
Lu_Interest = Lu_Total - Prev_Principal
Lu_Principal = Lu_Total - Lu_Interest
Prev_Principal = Lu_Total
# Displaying the Principal, Interest, and Total over the 27
print (YEAR,'\t%.02f\t\t %.02f\t\t %.02f' %(Lu_Principal, Lu_Interest, Lu_Total))

There may be another way to do this, but I think you have a few issues. One is that you need to base your "total" calculation (where you're multiplying the principal by the 1+rate ** year) on the original principal value, and you need to keep this value separate from the rest of the calculations.
So you can work with two names like p0 and pN, where p0 represents the initial principal at year 0, and pN represents the original principal PLUS accrued interest at year N, then we reassign pN at the end of the loop.
r = .05
p0, pN = 100, p0
for y in range(1,5):
total = p0 * ((1+r)**y)
i = total - pN
print (y,'\t%.02f\t\t %.02f\t\t %.02f' %(pN, i, total))
pN = total
The output is as you expect:

Related

How to calculate mortgage with a floating rate that compounds monthly

I am solving this problem where im given a floating rate of 5.1 that increases .1 every month. (5.1, 5.2 ... 5.9, 6%)
It also compounds monthly. Im given an initial loan of 200,000. Monthly payments of 1000 and im trying to solve how much they owe every month.
I am using Pandas Series to hold the increasing rate. Im having difficulty creating a function that will help. Any suggestions would be appreciated.
This is what I have.
`
df = pd.DataFrame(51*np.ones(100) + np.arange(100))
df = df.rename(columns={0:'monthly rate'})
df['monthly rate'] = df['monthly rate'] /10/100 /12
df['monthly payment'] = 1000
df['interest due'] = df['monthly rate'] * 200000
df['mortgage decreasing'] = df['interest due'] - df['monthly payment']
`
This is where I get confused. So we start with 200,000. And it decreases each month, and then that decrease we calculate the new interest due using that new amount. So its like one involved the other and im not sure how to put that into code.
I think where im going wrong is in the calculating interest due portion. Since in that code I am multiplying the rate by the initial loan value, instead of the values of each month. Im just unsure how to solve that.
Just in plain Python you can simulate it like this:
loan = 200000
interest = 0.051
payment = 1000
interest_change = 0.001
month = 1
while month < 37:
# In real life banks calculates interest per day, not 1/12 of year
month_interest = loan * interest/12
new_loan = loan+month_interest-payment
print ("%s: %.2f \t +%.2f (%.2f %%) \t-%s \t -> %.2f " % (month,loan,month_interest, interest*100, payment, new_loan))
loan = new_loan
interest += interest_change
month += 1
if loan < 0:
break

python code how to use the last result as a parameter in a loop

I am noob in python so pls be patient:
The problem:
Principal = P
Annual Drawings = D
Inflation rate = F
interest rate = i
years = n
I would like to have a function:
YearEndBal(P,D,F,i,n):
ny = 0
for years in range(n):
ny += 1
Drawings = D*(1 + F)**ny
From here I Do not how to create a loop/code so that
YearEndBal = YearEndBal - Drawings
First year = P*(1 + i) - Drawings
Not sure from here how to proceed.
where the Annual Drawing are subtracted from the YearEndBal for each year:
I am stuck at how to keep a loop of a running YearEndBal. This is very easy in excel.
Desired output of the python function:
YR Principal Int. Income Drawings Y/E Principal
1 200000 5000 15750 189250 16537.5

Pandas dataframe trading gain/loss

Dataframe
(Disregard the two index columns)
level_0
index
Year
Month
Day
Open
High
Low
Close
Volume
Length
Polarity
Sentiment_Negative
Sentiment_Neutral
Sentiment_Positive
Target_variable
Predicted
0
0
0
2020
1
19
8941.45
9164.36
8620.08
8706.25
3.42173e+10
937.167
0.0884653
0
0
1
0
0
1
1
1
2020
1
18
8927.21
9012.2
8827.33
8942.81
3.23378e+10
1177.5
0.176394
0
0
1
1
1
2
2
2
2020
1
17
8725.21
8958.12
8677.32
8929.04
3.63721e+10
1580
0.216762
0
0
1
0
0
3
3
3
2020
1
16
8812.48
8846.46
8612.1
8723.79
3.1314e+10
1336.33
0.182707
0
0
1
0
0
Description
The value of the target_variable is 1 if todays closing price is greater than yesterdays closing price
The value of the target_variable is 0 if todays closing price is less than yesterdays closing price
The predicted value is the output of my classifier.
Problem
I need to run some code that tracks how much money is gained if I invest when the classifier tells me to invest
I have started to code this
credit = 10000
for index, row in df.iterrows():
if row["Predicted"] == 1:
#print(row["Percentage_diff"])
credit = credit - 100
credit = credit + (100 * row["Percentage_diff"])
print(credit)
The idea is that I start off with a balance of 10,000 and invest 100 every time the classifier signals to. The only problem is that when I lose 8000 credits. Is the code correct and the classifier is very poor?
Or have I made an error in the code?
I am not a trading expert, so I assume that every day the classifier tells you to trade, you will buy with the opening price and sell with the close price.
You can start by calculating the percentage of profit or loss when the classifier tells you to trade. You can do that by subtracting the closing price from the opening and dividing it by the opening price.
df["perc_diff"] = (df["Close"] - df["Open"])/df["open"]
Of course, this will be negative when the classifier is wrong. To compute the cumulative profits/losses, all you want to do is to iteratively add/subtract your profit/loss to your capital. This means at a day with a profit/loss percentage of r, if you invest x dollars, your new credit is (1+r)*x. So a simple for loop can do it like that:
credit = 1 # your capital
for label, row in df.iterrows():
credit = (1 + row["Predicted"] * r) * row["perc_diff"]
print(credit)
Edit to address your updated problem:
If you want to specify an amount to invest rather than all your capital, then you can use this:
credit = 1 # your capital
to_invest = 0.1 # money to invest
for label, row in df.iterrows():
# update invest
invest_update = (1 + row["Predicted"] * row["perc_diff"]) * to_invest
credit = credit - to_invest + invest_update
print(credit)
The last two lines can be combined into one line:
credit = credit + row["Predicted"] * row["perc_diff"] * to_invest
I think the code is correct, and if you lose, then it is probably due to poor performance from your classifier, but this should be evident from your evaluation of the model (like accuracy and precision metrics). Also, if it is a classifier that is not made for time series (e.g. logistic regression), then it is very reasonable that it performs poorly.
Solution
df["Percentage_diff"] = (df["Close"] - df["Open"])/df["Open"]
credit = 10000
for index, row in df.iterrows():
if row["Predicted"] == 1:
#print(row["Percentage_diff"])
credit = credit - 100
credit = credit + ((100 * row["Percentage_diff"]) + 100)
print(credit)
This was the solution thanks to Ahmed.
If I start with an original balance of 10000 every time the classifier signals to invest I invest 100 dollars at opening and withdraw at close this calculates the balance.

Automatically calculating percentage and store into variables

I am currently on a demographic project.
I have data from 3 different countries and their birth statistics in each month.
My question:
I want to calculate the percentage people born in each month and plot it for each country. (x = Month, y = Percentage born)
Therefore, I want to calculate the percentages first.
I want to do this per iteration over all months to improve my code. So far:
EU = df2["European Union - 28 countries (2013-2020)"]
CZE = df2["Czechia"]
GER = df2["Germany including former GDR"]
EU_1 = EU[1] / EU[0] *100
EU_2 = EU[2] / EU[0] *100
etc.
for each month and 3 countries.
How can I calculate all automatically by changing Country [i] and store every value separately (Function, for loop?)
Thank you very much!
You could do something like this:
EU = df2["European Union - 28 countries (2013-2020)"]
monthly_percentages = [num_born / EU[0] * 100 for num_born in EU[1:]]
Assuming that the first element of EU is the total births that year and the rest are the births per each month. If you wanted to do all the countries automatically, you could loop through each country and calculate the birth percentage for each month, then store it somewhere. It would look something like:
country_birth_percentages = []
for country in countries:
country_birth_percentages.append([num_born / country[0] * 100 for num_born in country[1:]])

How can I write a python program to calculate the monthly interest rate but display yearly outputs?

Write a program that calculates and prints the balance of a loan over time. The program must ask user for the following (in order):
The amount of the loan, i.e. principal (float).
The annual interest rate as a fraction of 1.0 (float).
The monthly payment amount that the user has arbitrarily chosen (float; the amount is not calculated).
The term of the loan in years (int).
The loan is principal-and-interest and the program simulates paying a fixed amount off the loan every month. The interest is calculated monthly before the fixed payment.
Note that the program must calculate principal and interest changes monthly but only prints an update every year. For this question, it's fine for the balance to go negative.
Running the program should look exactly like the following:
Principal? 100000
Interest rate? 0.055
Monthly repayment? 1000.00
Term in years? 5
Year Opening Closing
0 100,000.00 93,333.62
1 93,333.62 86,291.20
2 86,291.20 78,851.53
3 78,851.53 70,992.21
4 70,992.21 62,689.55
The output must be formatted to 2 decimal places and alignment as shown.. The numbers are 11 characters wide, with comma separators and two decimal places. I wrote the below program but I am not getting the required output:
principal = float(input('Principal? '))
interest = float(input('Interest rate? '))
payment = float(input('Monthly repayment? '))
Term = int(input('Term in years? '))
payment = 1000
n = 1
p = 0
opening = principal
m_opening = 0
m_closing = 0
rate = 0
closing = 0
i=0
year = 0
m = 0
print(f'Year Opening Closing')
for i in range (Term):
if year == 0:
while n<=12:
rate = opening*interest/12
closing = opening - (payment-rate)
opening = closing
n = n+1
m = closing
opening = principal
print(f' {year:2} {opening:11,.2f} {closing:11,.2f}')
year = year+1
else:
n=1
while n<=12:
rate = opening*interest/12
closing = opening - (payment-rate)
opening = closing
n = n+1
print(f' {year:2} {opening:11,.2f} {closing:11,.2f}')
year = year+1
My output is coming as below:
Principal? 100000
Interest rate? 0.055
Monthly repayment? 1000
Term in years? 5
Year Opening Closing
0 100,000.00 93,333.62
1 93,333.62 93,333.62
2 86,291.20 86,291.20
3 78,851.53 78,851.53
4 70,992.21 70,992.21
You need to keep the opening of the year after the first year, of not you are modificating opening variable each time. Also you dont need m = closing and opening = principal. Find below slighly modificated working code.
principal = float(input('Principal? '))
interest = float(input('Interest rate? '))
payment = float(input('Monthly repayment? '))
Term = int(input('Term in years? '))
payment = 1000
n = 1
p = 0
opening = principal
m_opening = 0
m_closing = 0
rate = 0
closing = 0
i = 0
year = 0
m = 0
print(f'Year Opening Closing')
for i in range(Term):
if year == 0:
while n <= 12:
rate = opening * interest / 12
closing = opening - (payment - rate)
opening = closing
n = n + 1
# m = closing
# opening = principal
print(f' {year:2} {principal:11,.2f} {closing:11,.2f}')
year = year + 1
else:
n = 1
yearOpening = closing
while n <= 12:
rate = opening * interest / 12
closing = opening - (payment - rate)
opening = closing
n = n + 1
print(f' {year:2} {yearOpening:11,.2f} {closing:11,.2f}')
year = year + 1
Output:
Hope that helps!

Categories

Resources