blue-sky
blue-sky

Reputation: 53826

Calculating returns with trading costs

This perhaps is an over simplification of calculating trading returns while including trading costs. I've made some assumptions - the commission for investing and extracting an investment is 1% and 2% respectively. The commissions do not change over the trading period which in this case is 5 time steps. I've used Python code to perform the calculations.

Set of positive and negative percentage changes in price for a given asset over 5 time steps is {0.031% , 0.00121% , 0.0231% , -0.0213% , -0.0121%}.

The commission to enter an investment is 1% of the invested amount, the commission to exit an investment is 2% of the current value of the invested amount.

If I invest 1 euro in this asset, is the following correct?

1.

The final investment amount if I do not trade the investment until $t=5$ is: the final percentage change amount at $t=5$ which is 'initial invested amount' + '% change' - 'commission to enter' - 'commission to exit', therefore:

initial_investment_amt = 1

comission_in_amt = 1

comission_out_amt = 2

price_change = -.0121

return_amt = (initial_investment_amt + (price_change / 100)) - (comission_in_amt / 100) - (comission_out_amt / 100) = 0.97 which represents a loss of 1 - .97 = .03

2.

The final investment amount if I trade the investment at each time step until $t=5$ is:

initial_investment_amt = 1

comission_in_amt = 1

comission_out_amt = 2

price_change = .031

return_amt_1 = (initial_investment_amt + (price_change / 100)) - (comission_in_amt / 100) - (comission_out_amt / 100)

price_change = .00121

return_amt_2 = (return_amt_1 + (price_change / 100)) - (comission_in_amt / 100) - (comission_out_amt / 100)

price_change = .0231

return_amt_3 = (return_amt_2 + (price_change / 100)) - (comission_in_amt / 100) - (comission_out_amt / 100)

price_change = -.0213

return_amt_4 = (return_amt_3 + (price_change / 100)) - (comission_in_amt / 100) - (comission_out_amt / 100)

price_change = -.0121

return_amt_5 = (return_amt_4 + (price_change / 100)) - (comission_in_amt / 100) - (comission_out_amt / 100)

print(return_amt_1)
print(return_amt_2)
print(return_amt_3)
print(return_amt_4)
print(return_amt_5)

prints :

0.97031
0.9403220999999999
0.9105530999999999
0.8803400999999998
0.8502190999999998

which represents a loss of $1 - 0.85 = 0.15$.

Upvotes: 0

Views: 954

Answers (2)

SteveB
SteveB

Reputation: 78

Both the commissions and price changes are given as percentages. This means that immediately after investment the amount in the account is:

initial_investment_amt*(1-commission_in_amt/100)

The _amt suffix is perhaps confusing but commission is stated as % in the question.

After the first investment period the account has the amount:

initial_investment_amt*(1-commission_in_amt/100)*(1-price_change/100)

And finally after exit the client receives:

initial_investment_amt*(1-commission_in_amt/100)(1-price_change/100)(1-commission_out_amt/100)

I think the pattern is clear so you just insert more price_changes for a lengthier investment and if you disinvest and reinvest you'll have a lot more commission to pay. Hope this is OK - sorry no code - but it seems clearer like this and uses the question notation.

Upvotes: 1

Jack Fleeting
Jack Fleeting

Reputation: 24930

First, I have to respectfully disagree with your conclusion for case 1:

The final investment amount if I do not trade the investment until $t=5$ is: the final percentage change amount at $t=5$ which is 'initial invested amount' + '% change' - 'commission to enter' - 'commission to exit

The correct formula for the final value, I believe, is

((initial investment amount - commission to enter) * (1 + % change)) - commission-to-exit. The main difference being the fact that the commission to enter/investment fee is taken out of circulation before the return on investment can be earned. This makes for a significant difference over time.

Assuming I'm correct, below is the code I propose. I took the liberty of changing some of the terminology for ease of reference, but you can obviously change it to whatever suits you:

p_changes = [0.03100, 0.00121, 0.02310, 0.02130, -0.01210]
initial_investment_amt = 100 #I used a larger initial investment; otherwise, the fees would have eaten you alive...
invest_fee = 1
sell_fee = 2

def periodic_ret(amount,change,reinv):

    if reinv == 0:
        if ind + 1 == 1: #for the initial period
            forward = (amount-invest_fee)*(1+change)      
        if ind +1 == len(p_changes): #for the final period
            forward = (amount*(1+change))-sell_fee
        else:
            forward = (amount*(1+change))
    else:
        forward = (amount-invest_fee)*(1+change)-sell_fee
    print(forward)
    return forward    

for i in range(len(p_changes)):
    reinv = 1 #1 if an invest and sell fee are paid each period, or 0, if an invest fee is paid once upfront and sell fee is paid once at the end
    if i == 0: #for the initial period
        cur = periodic_ret(initial_investment_amt, p_changes[0], reinv)
    else:
        cur = periodic_ret(cur,p_changes[i], reinv)

Output (w/ reinv = 1):

100.06899999999999
97.18887348999998
96.41083646761896
95.44308728437926
91.30032592823827

Upvotes: 1

Related Questions