Warning: Creating default object from empty value in /homepages/39/d161420129/htdocs/p373.net/wp/wp-content/themes/p373b/admin/functions.php on line 183
An algorithm to generate fake but realistic stock price graph data that trends

An algorithm to generate fake but realistic stock price graph data that trends

Sometimes you want to generate data. Generating random data is pretty easy, but that doesn’t represent real user behavior. Real user behavior probably follows patterns. Here is an approach to generating some data that approximates stock price fluctuations.

The below algorithm will generate a string of code that can be input into Google charts for visualization here: https://code.google.com/apis/ajax/playground/?type=visualization#line_chart

    # In order to generate a semi-realistic looking graph behavior
    # we use a sine function to generate periodic behavior(ups and downs).  In order to avoid
    # a graph that is too regular, we introduce randomness at two levels:
    # The delta between steps across the x-axis is random, but within a range(deltavariance)
    # The wavelength of the sine function is varied by randomly incrementing the index we pass
    # to the sine function(sine_index)

    yvalue = 1 # start value
    range = 100 # y-range
    deltavariance = 10 # allowable variance between changes
    sine_index, wavelength = 0, 0.33 #index into our sine function that determines whether we change direction or not
    i, maxi = 0, 100 # our counter and its maximum
    data = {sine_index => yvalue} # seed our data structure with its first value
    trend = :positive # :negative, :none # do we want the graph to trend upwards, downwards or neither
    periodmin, periodmax = 0, 0 # vars to enforce trending
    direction = 1 # start in a positive direction, -1 for negative

    while(i < maxi)

      olddirection = direction
      direction = Math.sin(sine_index).to_f
      direction = direction < 0 ? direction.floor : direction.ceil

      delta = rand(deltavariance) 
      yvalue += delta * direction

      if trend == :positive 
        yvalue = periodmin if yvalue < periodmin
        periodmin = yvalue if olddirection < direction
      elsif trend == :negative
        yvalue = periodmax if yvalue > periodmax
        periodmax = yvalue if olddirection > direction


      data[sine_index] = yvalue
      sine_index += Math.sin(rand) # Math.sin(rand) will give random numbers from -1..1
      i += 1

    code = <<-CODE
    function drawVisualization() {
      // Create and populate the data table.
      var data = google.visualization.arrayToDataTable([
        ['x', 'Cats'],

      // Create and draw the visualization.
      new google.visualization.LineChart(document.getElementById('visualization')).
          draw(data, {curveType: "function",
                      width: 500, height: 400,
                      vAxis: {maxValue: 10}}

    datastr = data.collect{|k,v|  "[#{k},#{v}]"}.join(",")
    code = code.gsub('DATASTR', datastr)
    puts code
    This entry was posted in Coding, Ruby/Rails, Technology. Bookmark the permalink. Both comments and trackbacks are currently closed.