In [1]:
import numpy as np
import matplotlib.pyplot as plt

In [2]:
samples = 2000
depth   = 20

In [3]:
class TradeGenerator:
    def __init__(self, count=10000):
        self.count = count
        self.value = 100
        self.ema = self.value
        self.trend = np.random.uniform()

        self.spike_rate = 0.80 + 0.2*np.random.uniform()
        self.cycle_rate = 0.80 + 0.2*np.random.uniform()
        self.trend_rate = 0.80 + 0.2*np.random.uniform()
        
    def __iter__(self):
        while self.count > 0:
            self.count -= 1
        
            self.value += np.random.normal() + self.trend

            # spike
            if np.random.uniform() > self.spike_rate:
                self.value += (np.random.uniform() - 0.5)*0.3 * self.value

            # cycling
            ratio = 0.95
            self.ema = ratio * self.ema + (1.0 - ratio) * self.value            
            if np.random.uniform() > self.cycle_rate:
                self.trend = (self.ema - self.value) / (np.random.uniform() * 20 + 10)
            
            # re-trending
            if np.random.uniform() > self.trend_rate:
                # trend change
                self.trend = np.random.normal() 
                
            if self.value < 0.0:
                self.value = 1.0

            yield(self.value)

In [5]:
x = [i for i in TradeGenerator()]
plt.plot(x)
plt.show()



In [ ]:


In [ ]: