[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Fw: Optimal f code for Tradestation



PureBytes Links

Trading Reference Links

List

I'm sending three emails from Bob Fulks on the Omega-Tradestation list on
optimal f. He was kind enough to dig through his archives and forward these
to me. Maybe someone wants to take a crack at translating this code into
Metastock. Or maybe after you read his caveats you won't want to.

Good luck,

John Manasco
----- Original Message -----
From: Bob Fulks <bfulks@xxxxxxxxxxxx>
To: John Manasco <john@xxxxxxxxxxx>
Sent: Monday, July 10, 2000 7:59 AM
Subject: Re: Optimal f code for Tradestation


> At 7:51 PM -0400 7/9/00, John Manasco wrote:
>
> >I'm trying to get some information on optimal f to my friends on the
> >Metastock email list. I thought I saw a discussion on Realtraders that
you
> >were involved in but it may have been on the Omega list. In any event if
you
> >have saved any of those discussions I would appreciate it if you could
> >forward it to me so I can send it to the Metastock list.
>
> There were quite a few messages so I do not know which to send. Here is
the first one. Let me know if this is the one you wanted.
>
> Bob
>
>
> At 11:35 AM +0200 6/8/00, Jose Ramon Diaz Serrano wrote:
>
> >Anyone has the tradestation code for calculating the optimal f to decide
> >how many contracts trade in the next trade? thanks in advance,
>
> I posted some code to do this on January 2, 1999. It is appended below.
>
> Bob Fulks
>
> -------------
>
> At 5:42 PM -0500 1/1/99, Tom Steinke wrote:
>
> >Has anybody been able to successfully code Optimal f in TradeStation
code?
> >It seems as though it is impossible to do so, but there are people out
> >there that can program a lot better than me.
>
>
> There is an easy way to calculate Optimal_f with TradeStation. This post
> will illustrate it with an example.
>
> What Ralph Vince's Optimal_f calculation does is to compute what fraction
> of your trading account balance you should risk in each trade such that
> your account balance is the maximum possible value after taking all the
> trades specified by your trading system. He calls this the "TWR" for
> "Terminal Wealth Relative"
>
> He defines "Optimal_f" as a fraction of the biggest losing trade of the
> historical series of trades. Obviously, this fraction will be less than
1.0
> since a bet equal to your biggest losing trade will assure that you lose
> all your money on that losing trade.
>
> You can use the Optimization function of TradeStation to search for this
> optimum quite easily.
>
> However, it is a little tricky since you need to create an input to the
> trading system that you can use to run through a sequence of values with
> the Optimization procedure. But since you do not know the size of the
> largest losing trade before you run the test, you cannot search for
> Optimal_f directly.
>
> So I created a variable which I call "Leverage". This is defined as the
> dollar value of the trade as a multiple of the value of your trading
> account. It is usually greater than one when trading stocks and can be
less
> than one when trading futures.
>
> Using a "Leverage" of 1.0 means you invest your total trading account on
> each trade. This is what you would do if you used the total balance of
your
> account to buy shares of a stock, leaving no cash in the trading account.
>
> Using a leverage of 2.0 means that you borrow an amount equal to your
> trading account and invest two times the value of your account on each
> trade. In the example below, the Optimal_f occurs with a leverage of about
> 5.4 which means you would be borrowing 4.4 times the value of your trading
> account to trade.
>
> To demonstrate this I used a simple trading system that buys the daily SPX
> cash index on Monday at the Open and exits on Friday at the Close. The
> dollar value of each Monday's trade is equal to the size of the trading
> account at the end of the previous week multiplied by the "Leverage"
input.
>
> We can then optimize this system for the value of "Leverage" that results
> in the highest "Total Net Profit". Then we can calculate the value of
> Optimal_f from the resulting system performance parameters. The attached
> chart shows the graph from the optimization report resulting from
> optimizing on "leverage" over the range of 1 to 9. The curve is not
> perfectly smooth because TradeStation rounds the number of shares traded
to
> an integer number. (The code for this system is appended below and
attached
> as an ELA file.)
>
> Two "modes" of operation are provided based upon an input parameter:
>
>   > Mode = 0
>
>     The "Unequalized" mode assumes the following relationship:
>
>         Trading_account / Shares = a constant for all trades
>                                     = Biggest_Loss / Optimal_F
>
>     This is the case most often mentioned in the books. In this example,
>     the value of about 5.3 for "Leverage" resulted in the maximum
>     net profit of about $23,600. This corresponds to an Optimal_f of
>     about 0.31 (See the print log). It gives the same results as all
>     three of the methods described in Vince's, "Portfolio Management
>     Formulas", Chapter 4.
>
>   > Mode = 1
>
>     The "Equalized" mode assumes the following relationship:
>
>         (Trading_account / Shares) * (Initial_share_price / Share_Price)
>                             = a constant for all trades
>                             = Biggest_Loss / Optimal_F
>
>     This case is described in Ralph Vince's book, "The Mathematics of
>     Money Management" page 83. (I understand from private correspondences
>     with Ralph that it is also covered in more detail in his latest book.)
>
> In this example, the value of about 6.4 for "Leverage" resulted in the
> maximum net profit of about $28,500. This corresponds to an Optimal_f of
> about 0.29 (See the print log)
>
> The usual problem with trading at Optimal_f is the drawdowns. It
> mathematically will result in the highest return IF THE FUTURE STATISTICS
> OF THE MARKET YOU ARE TRADING ARE EQUAL TO THOSE OF THE PAST. This is a
big
> assumption for most people.
>
> This example illustrates this fact in a crude way. This trading system is
> sort of like a buy/hold system for an S&P index fund (except for
weekends).
> To trade at Optimal_f, for an account size of $20,000 you would need to
> borrow about $100,000 and buy about $120,000 worth of an S&P index fund.
> Would anybody you know want to buy/hold the S&P for the past year with
that
> kind of leverage?
>
> The system/market has a Sharpe Ratio of about 0.6 (bad) with an annualized
> return of 130% (great) but with a standard deviation of returns of 220%
> (terrible). So the peaks and valleys of the equity curve would be
enormous.
>
> Hope this has been useful.
>
> Bob Fulks
>
> ---------
>
> { *******************************************************************
>
>    System:       _Optimal_f_Demo
>
>    Last Edit:    12/27/98
>
>    Coded By:     Bob Fulks
>
>   Description: This system buys on the open on Mondays and exits
>      on the close of Fridays. The size of each trade is determined
>      by the size of the trading account times the input called
>      "Leverage". No correction was made for Monday/Friday holidays.
>
>   Inputs:
>
>      Leverage - This is the input used to iterate through the
>        sequence of values using the TradeStation Optimization
>        operation. Optimize for Total Net Profit. This results in
>        the conditions for Optimal_f.
>
>        Use the value = 0 (zero) to force the system to trade one
>        share for all trades. This can be used to create the series
>        of trades requires to calculate Optimal_f by the methods
>        in Vince's books.
>
>      PrntMode - Set to zero for no detail, Set > zero for detail.
>
>      Mode - Set to zero to optimize by the "Unequalized" method. This
>        sets the parameters based upon the price at the first trade
>        and lets the actual leverage vary as required. The results
>        duplicate the methods described by Vince in his books. It
>        trades one share of stock for each:
>
>             Biggest_loss_per_share / Optimal_f
>
>        we have in our account. (This value is a constant for all
>        trades.) The actual leverage used will vary with each trade.
>
>        Set to non-zero to use the "Equalized" method. This dynamically
>        adjusts the shares traded on each bar while holding the
>        leverage constant over all bars. This method is described by
>        Vince in is 1992 book, page 83. The leverage used will be a
>        constant for all trades.
>
> ********************************************************************}
>
> Input:Leverage(1),  {Leverage used}
>      PrntMode(0),   {PrintMode: No detail = 0, Detail > 0}
>      Mode(0);       {Unequalized = 0, Equalized method <> 0}
>
> Vars:Value(20000),  {Beginning value of trading account}
>      NetValue(0),   {Net value of trading account every bar}
>      Invest(0),     {Amount invested on each trade}
>      TShares(0),    {Number of shares/contracts bought each trade}
>      PrPerShare(0), {Profit per share}
>      OptF(0),       {Optimal_f calculated}
>      SClose(0),     {Close on first Friday}
>      BLoss(0),      {Biggest loss per share}
>      ActLever(0),   {Actual leverage used on each trade}
>      First(TRUE);   {True on first Friday only}
>
> if CurrentBar = 1 and Leverage = 0 then Value = Close * BigPointValue;
>
> NetValue = Value + NetProfit + OpenPositionProfit;
>
> if DayOfWeek(Date) = 5 then begin
>
>   {Calculate SClose on first trade}
>   if Mode = 0 then begin
>      if First then begin
>         SClose = Close;
>         First = FALSE;
>      end;
>   end else SClose = Close;
>
>   ExitLong at Close;
>
>   {Calculate biggest loss per share}
>   if TShares <> 0 then PrPerShare = PositionProfit(0) / TShares;
>   BLoss   = iff(PrPerShare < BLoss, PrPerShare, BLoss);
>
>   {Calculate number of shares to buy}
>   Invest = iff(NetValue >= 0, Leverage * NetValue, 0);
>   TShares = iff(Leverage = 0, 1, Round(Invest/SClose,0));
>   Buy TShares shares next bar at market;
>
>   if PrntMode > 0 then begin
>      if NetValue <> 0 then ActLever = TShares * Close / NetValue;
>      Print("  ", Date:6:0, " B", Close:5:2, NetValue:8:0, Invest:8:0,
>      TShares:5:0, PrPerShare:6:2, BLoss:4:2, ActLever:4:2, "  ");
>   end;
> end;
>
> {Calculate & print Optimal_f from performance data}
> if LastBarOnChart then begin
>   OptF = -Leverage * BLoss / SClose;
>   Print(Leverage:4:3, NetProfit:8:0, BLoss:4:2, Close:5:2, OptF:3:4);
> end;
>

Attachment Converted: "f:\eudora\attach\%OPTF.ELA"

Attachment Converted: "f:\eudora\attach\OPTF2.ELA"

Attachment Converted: "f:\eudora\attach\Leverage2.gif"