Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
100% portfolio allocation may result in negative cash

I wanted to get some clarification on order_target_percent(). I read the help page for it and I thought it made sense however the results I got in this test seems to contradict my understanding. I assumed that if I ordered an allocation of 1.0 I would get the maximum amount of stocks I could afford with the cash in my portfolio. However I buy $13000 more stock than I can afford, then order the same percent so I assumed nothing would change, but I actually sell stock so I am only $50 in debt.

How does order_target_percent actually calculate how much stock to buy? My initial assumption was
num_of_stocks = round_down(portfolio_cash*allocation_percent / stock_market_price)
but this wouldn't allow for negative cash (assuming allocation_percent <=1)

*PS This algo is just for exploratory purposes, and obviously is a terrible strategy

3 responses

Maybe I can clarify the questions around the order_target_percent method. First the comment "I assumed that if I ordered an allocation of 1.0 I would get the maximum amount of stocks I could afford with the cash in my portfolio." . This isn't exactly correct. Assume one has $1000 in existing positions of stock and $2000 in cash. The total portfolio value would therefore be $3000. Consider the following code

security_to_order = sid(4151)  
order_target_percent(security_to_order, 1.0)

This will place a single order of 'security_to_order' for 100% of the portfolio value or $3000. Notice it's NOT 100% of the cash but 100% of total portfolio.

"How does order_target_percent actually calculate how much stock to buy? " It works something like this pseudocode

num_of_shares = round_down(portfolio_value * allocation_percent / last_minute_price)

A couple of other comments. The order_target_percent places an order to adjust a position to a target percent of the current portfolio value. If the position doesn't already exist, this is equivalent to placing a new order. If the position does exist, this is equivalent to placing an order for the difference between the target percent and the current percent.

Hope that helps.

Disclaimer

The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by Quantopian. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. No information contained herein should be regarded as a suggestion to engage in or refrain from any investment-related course of action as none of Quantopian nor any of its affiliates is undertaking to provide investment advice, act as an adviser to any plan or entity subject to the Employee Retirement Income Security Act of 1974, as amended, individual retirement account or individual retirement annuity, or give advice in a fiduciary capacity with respect to the materials presented herein. If you are an individual retirement or other investor, contact your financial advisor or other fiduciary unrelated to Quantopian about whether any given investment idea, strategy, product or service described herein may be appropriate for your circumstances. All investments involve risk, including loss of principal. Quantopian makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances.

This helped, thank you for the response! But one part still doesnt make sense to me: my total allocation summed to 1.0, but I still bought more than 100% of my portfolio value (I am referring to my first trade so my portfolio before = $10,000,000 cash and $0 securities). The answer might just be a rounding error since $13000 would represent an over allocation of ~0.1%. I know that is a small percentage but I don't see why that pseudocode wouldn't be the preferred method as I would have guessed that most people would want order_target_percent to error on the side of safety (not leverage) unless otherwise stated. If this is the case then, the reason my portfolio changed from -13,000 to -50 in debt could be because my securities devalued, therefore lowering my portfolio value which would cause that over allocation to be a slightly larger percent which could have caused it to sell stock. Just a theory.

"I still bought more than 100% of my portfolio value"

The order_target_percent method calculates the number of shares to purchase based upon the current price. It then places a market order for these shares. If the price happens to be higher when the order actually fills then those shares will cost more. If the shares cost more it will take more cash to purchase these shares. The portfolio cash may then go negative.

One can view how orders are actually filled by looking at the backtest 'activity' tab. Looking at positions one can see, in this case, that the first fill of 87404 shares of JNJ have a unit price of 114.60. This is the average fill price. However, the order_target_percent method calculated the number of shares to order based upon the current price at the time the order was placed. That price was 114.41. If it filled at that price (87404 x 114.41 = 9999891.64) the net portfolio would be positive. However, since it filled at a higher price, the net portfolio value is negative.

Basically, since one can't predict the actual fill price, one can't exactly know how much a specific order will cost. It may cost more to fill than one expected. This is true in real life trading too. The only way to guarantee one doesn't pay more than expected is to use limit orders.