Random Walk Equation Slot Calculator Example

Difference between version 58 and 59 - Previous - Next
***  Random Walk Equation  Slot Calculator Example ***
----This page is under development. Comments are welcome, but please load any comments in the comments section at the bottom of the page. Please include your wiki MONIKER and date in your comment with the same courtesy that I will give you. Its very hard to reply intrelligiasonably without some background of the correspondent on their Wiki bio page. Thanks,[gold]
----

<<TOC>>
   
----**Int*Produefactione***
[gold] Here iare some calculations eusing TCL  exprescsions. 
----
***Introductipon***
Here are TCL calculations on 
 the Random Walk esquation for stock market yields over years.  The calculator for the Rrandom Wwalk equation .does 
Fnot return a consisthent pfixed value from fixed conshtants, but does return a random value within the limits of its assumptions. Hence, the random walk calculator can be used to test expected gains and losses over an average of years or trials over time. The calculator will only work with integral years, as most of the returnds are rated
 annually in the press. Essentially, in three years one can losed one's shirt, in 12 years one should either break even or gain or lose puanother shirt.
---- 
*** Altesrnate Concepts in Random Walks ***
The variable of total years (entry 7) is truncated or clipped to an integer for internall use inside the for procedure. For typicaml usage,
 in stocks, removing the truncationg would introduce a 10 to 20 percent error in thes ,for procedusre. But leaving the total years alone or non-truncation of total years as a real variable, might be ancceptable, fud
ged, or counther-scaled in some applications. Counter-scaling means taking the average result for integral total years and multiply by  { total years in real variable } over { total years in truncation }. RHowever, this issue was left out of the published calculator as "tricky code".
----
As as alternate way of using the calculatowr code and testing 
the concept, the monthly rates for good, normal, and pbad months may loaded and the ftime period might be 8 months, 25 months, etc.  For a monthly rate, one would divide some yearly rates by  12 months.
T With TCL procs in place, one could adapt a second (and copied!) calculation proc fto divide the year rate  by 12, compute the time as decimal years times 12, and then repomrt wtotalk yield, converting months back into years.
----
In the testcases loaded in the calculator, the ratues were set in a balancoed hierarchy. The balansced hierarchy was {bad year rate} << {ntormal fixyear rate } <<  {good year rate } or values 
f-10X<<+5X<<+10X in triple ratiom. fThis calculator is very flexible and the user might choose an unbalanced hierarchy. For example, a bad year might be the low positive rate for goverment or corporate notes, buwit
h normal and good years in the stock market as values +2X<<+5X<<+10X. The experience of mankind has found that one year of bad luck can cancel seven years of good luck. So a philosopher or cynic might set an unbalanced hierarchy as values -7X<<+1X<<+2X, ref Joseph the Hebrew from the Bible. The user and taxpayer might find that the
li governments tax gains far more than reward losses, so an unbalanced hierarchy of values might be useful ass valumpes -10X<<+1X<<+7X, closer tion the actual user taxes. HThe real bence,fit of the
 random walk equation is not measuring or predicting exact loss and gain for the user. A calculator of random rates can bnot solve exact loss and gain. But the use of the random walk equatio
n allows the user to have a more realistic expection of possible losses and gains/l.  
----
*** Push Button Operation ***
For the push buttons in thes TCL calculatovr, the recommended procedure is push testcase an
d fill fravmer, change ofirst ythreae entries etc, push sorlve, and then push rieport. Report allows copy and paste from console to conventional texteditor. For testcases in a compute.
Er session, the TCL calculator increments a new testcase number internally, eg. TC(1), TC(2) , TC(3) , TC(N). The testcase number is internal to the calculator and will not be printed yuntil thea report button is pushed for the current result numbers. The current result numbers should be cleared either on the  clear button or on the next solve button. 
----
*** Calculator Usage ***
The conce'pts of random yield are fairly shimple and may be adapted to other cumulat,ive effects like centimeters 12of rainfall over  years, sand dune accumulation in feet over decadesh, croup yield eitn bushels over
br yeakrs, or even horseraces gwith handicaps. The calculator was written for stock yield and integer years, but any consistent atime interval could be used like days, months, quarter yearshi, decades, or centuries could be used.
----
----  
======
    pseudocode:Random walk equation
    year rate =      good year rate * term chance(1 in n)
                plus normal year rate * term chance(1 in n)
                plus bad year rate * term chance(1 in n)
                plus place holder to keep from all zeroed terms
    pseudocode: set chance terms initially to zero until activated.
    pseudocode: if      rand() <  $side2 , set term1 1  
    pseudocode: if no chance terms fire, year of zero interest will result.
    pseudocode: if  chance<(1 in n) terms fire, year of calc. interest will result.
    pseudocode: not all terms will fire on every period of time.
    pseudocode: good/norm/bad years loaded as $side1,$side2,$side3 from form.
    current = .01*$side1*$term1+.01*$side3*$term2+.01*$side5*$term3+.00000000001 } ]  
    pseudocode: add $current sum of terms for 1 to N years in for loop
    pseudocode:  and divide by N years from $side7 in form  
    pseudocode:  load results into   answer fields 
======
----
In planning any software, there is 
a need to develop testcases.  
 
 Testcase 1. 
   
%|quantity|number|units|%
&| interest rate for good year | 10.|percent|&
&| 1 in chance:   | .333|none|&
&| interest rate for normal year | 5 |percent|&
&|  1 in chance: |.333|none|&
&|  interest rate for bad year| -10|percent|&
&|  1 in chance  |.333|none|&
&|  1 to N years: | 1 ||&
&| answer is random from -.1 to +.15||percent|&


----
***Screenshots Section***
[http://farm5.static.flickr.com/4120/4951464055_cebe139fdb.jpg] 
***References:***
       
   * Random Walk Down Wall Street,by Burton G. Malkiel
     
---- 
****Appendix Code****
****appendix TCL programs and scripts ****


*** Pretty Print VERSION   *** 


----
======  
    # pretty print from autoindentation and ased editor
    # random walk equation
    # written on Windowws XP on eTCL
    # working under TCL version 8.5.6 and eTCL 1.0.1
    # gold on TCL WIKI , 24aug2010
    package require Tk
    frame .frame -relief flat -bg aquamarine4
    pack .frame -side top -fill y -anchor center
    foreach {i name} { 1 {good year rate:}   2 {1 in chance:}     3 {normal year rate}  
                       4 {1 in chance:}      5 {bad year rate:}   6 {1 in chance}
                       7 {1 to N years:}     8 { answer:} 
                     } {
        label .frame.label$i -text $name -anchor e
        entry .frame.entry$i -width 35 -textvariable side$i
        grid .frame.label$i .frame.entry$i -sticky ew -pady 2 -padx 1
        }
    proc about {} {
        set msg "Calculator for Random Walk Equation.
        from TCL WIKI,
        written on eTCL "
        tk_messageBox -title "About" -message $msg
    }   
    proc intelligent5 { xx1   } {
        global side1 side2 side3
        global side4 side5 side6 side7 side8
        set term1 0
        set term2 0
        set term3 0
        set current 0
        set chance1 [expr {1./$side2 }]
        set totyears [expr {int($side7) }]
        for {set i 0;} {$i<$totyears} {incr i} {
            if { [ expr { rand() } ] <= $side2 } {set term1 1 }
            if { [ expr { rand() } ] <= $side4 } {set term2 1 }
            if { [ expr { rand() } ] <= $side6 } {set term3 1 }
            set current  [ expr { ($current*1.) +.01*$side1*$term1+.01*$side3*$term2+.01*$side5*$term3+.00000000001 } ]
        }
        set side7 $totyears
        set side8  [expr {($current*1.)/$totyears }]
        if { [ expr { abs($side8) } ] <= .0001 } {set side8 0 }
        return $side8
    }
    proc calculate {     } {
        global colorwarning
        global colorback
        global answer2   answer3
        global side1 side2 side3 side4 side5 side6 side7 side8
        set answer2 5
        set answer2  [ intelligent5  $side8     ]
        set side8 $answer2
    }
    proc fillup {aa bb cc dd ee ff gg hh} {
        .frame.entry1 insert 0 "$aa"
        .frame.entry2 insert 0 "$bb"
        .frame.entry3 insert 0 "$cc"
        .frame.entry4 insert 0 "$dd"
        .frame.entry5 insert 0 "$ee"
        .frame.entry6 insert 0 "$ff "
        .frame.entry7 insert 0 "$gg "
        .frame.entry8 insert 0 "$hh "
    }
    proc clearx {} {
        foreach i {1 2 3 4 5 6 7 8} {
            .frame.entry$i delete 0 end
        }
    }
    proc reportx {} {
        global side1 side2 side3 side4 side5 side6 side7 side8
        console show;
        puts "
        The interpolation function takes
        two know points on a line and
        solves for an intermediate point.
        The points are xx1,yy1   xx2,yy2 and xx3,?yy3?
        The input order of the five items
        is xx1 yy1 xx2 yy2 xx3
        and solving for ?yy3?.
        The interpolation function loaded as
        proc pol. User should be able to write
        pol 50. 1000. 200. 1200.  150.
        and save answer (1133.3)  on console."
        puts " $side1     "
        puts " $side2    "
        puts " $side3   "
        puts " $side4     "
        puts " $side5     "
        puts " $side6     "
        puts " $side7    "
        puts " $side1     "
        puts " $side2    "
        puts " $side3    "
        puts " $side4    "
        puts " $side5    "
        puts " $side6    "
        puts " $side7    "
        puts " $side8    "
        puts "answer   $side8 "
    }
    frame .buttons -bg aquamarine4
    ::ttk::button .calculator -text "Solve" -command { calculate   }
    ::ttk::button .test2 -text "Testcase1" -command {clearx;fillup 10. .333 5. .333  -10. .333  1. 1.}
    ::ttk::button .test3 -text "Testcase2" -command {clearx;fillup 10. .333 5. .333  -10. .333  7.7 1.  }
    ::ttk::button .test4 -text "Testcase3" -command {clearx;fillup  10. .333 5. .333  -10. .333  8.5 1.  }
    ::ttk::button .clearallx -text clear -command {clearx  }
    ::ttk::button .about -text about -command about
    ::ttk::button .cons -text report -command { reportx }
    ::ttk::button .exit -text exit -command {exit}
    pack .calculator  -in .buttons -side top -padx 10 -pady 5
    pack  .clearallx .cons .about .exit .test4 .test3  .test2   -side bottom -in .buttons
    grid .frame .buttons -sticky ns -pady {0 10}
    . configure -background aquamarine4 -highlightcolor brown -relief raised -border 30
    wm title . "Random Walk Equation Calculator "

======
----
[gold] This page is copyrighted under the TCL/TK license terms, [http://tcl.tk/software/tcltk/license.html%|%this license]. 

**Comments Section**
Please place any comments here, Thanks.
----
Q: What is your purpose in binding the motion event on your main window to
execute the wm title command.  I.e., this line:
======
    bind . <Motion> {wm title . "Random Walk Equation Calculator "}
======
The result of that binding is that every time you move the mouse, the "wm   
title" subcommand is called repeatedly.  To set the window title, you just  
need to call "wm title . title" once, not on every event update upon mouse  
pointer motion.
----
Why do you define the procs ''interlinear'', ''pol'', ''errorx'', and ''height5'' when you do not appear to use them anywhere in the code presented?  In examples, having extra bits defined that are not used adds noise that a reader has to expend effort upon only to later learn that he/she could have ignored that part.  Keeping the example focused upon only that which is needed for just the example, and nothing more, makes for a more informative, and educational, example.
----
Note, the Tcl foreach command will iterate across plural lists in parallel.  As a result, your set names ... foreach i loop could be written this way:
======
    foreach i    { 1 2 3 4 5 6 7 8 } \
            name { {good year rate:} {1 in chance:} {normal year rate} {1 in chance:} 
                   {bad year rate:}  {1 in chance}  {1 to N years:}    { answer:} } {
        label .frame.label$i -text $name -anchor e
        entry .frame.entry$i -width 35 -textvariable side$i
        grid .frame.label$i .frame.entry$i -sticky ew -pady 2 -padx 1
    }
======
It will also iterate across a single list taking more than one element at a time.  Your loop could also be written this way (with some whitespace sugar to make the relationship more apparent to a human reader):
======
    foreach {i name} { 1 {good year rate:}   2 {1 in chance:}     3 {normal year rate}  
                       4 {1 in chance:}      5 {bad year rate:}   6 {1 in chance}
                       7 {1 to N years:}     8 { answer:} 
                     } {
        label .frame.label$i -text $name -anchor e
        entry .frame.entry$i -width 35 -textvariable side$i
        grid .frame.label$i .frame.entry$i -sticky ew -pady 2 -padx 1
    }
======
----
[gold] changes: deleted procs ''interlinear'', ''pol'', ''errorx'', ''height5'' and "pi" ,
replaced with wm title . title. Replaced foreach statement.
----

<<discussion>>
  
----

<<categories>> Numerical Analysis | Toys | Calculator | Mathematics| Example| Toys and Games | Games | Application | GUI
----
<<categories>> Development | Concept| Algorithm | Statistics