# d3fc-random-data Components for generating random data series based on stochastic processes. [Main D3FC package](https://github.com/d3fc/d3fc) ## Installing ```bash npm install @d3fc/d3fc-random-data ``` ## API Reference ### Financial The random financial data generator component generates open-high-low-close-volume financial data. Prices are calculated using the [geometric Brownian motion generator](#geometric-brownian-motion). ```javascript import { randomFinancial, randomSkipWeekends } from 'd3fc-random-data'; const generator = randomFinancial() .startDate(new Date(2016, 0, 1)) .startPrice(100) .filter(randomSkipWeekends); generator(4); // [ // { // date: 2016-01-01T00:00:00.000Z, // open: 100, // high: 100.37497903455065, // low: 99.9344064016257, // close: 100.13532170178823, // volume: 974 // }, // { // date: 2016-01-04T00:00:00.000Z, // open: 100.2078374019404, // high: 100.55251268471399, // low: 99.7272105851512, // close: 99.7272105851512, // volume: 992 // }, // { // date: 2016-01-05T00:00:00.000Z, // open: 99.7272105851512, // high: 101.06403178230532, // low: 99.7272105851512, // close: 101.00200313600685, // volume: 835 // }, // { // date: 2016-01-06T00:00:00.000Z, // open: 101.00200313600685, // high: 101.41129520567128, // low: 100.50311227829566, // close: 100.5536971451326, // volume: 1021 // } // ] ``` # fc.**randomFinancial**() Constructs a new financial data generator. # *randomFinancial*(*points*) Run the generator. Returns an array with *points* number of objects with `date`, `open`, `high`, `low`, `close` and `volume` properties. # *randomFinancial*.**startDate**([*value*]) If *value* is specified, sets the start date to the specified `Date` object and returns this generator instance. If *value* is not specified, returns the current start date, which defaults to the value of `new Date()` when the generator was constructed. # *randomFinancial*.**startPrice**([*value*]) If *value* is specified, sets the start price to the specified number and returns this generator instance. If *value* is not specified, returns the current start price, which defaults to `100`. # *randomFinancial*.**interval**([*value*]) If *value* is specified, sets the time increment to the specified [d3 time interval](https://github.com/d3/d3-time#intervals) and returns this generator instance. If *value* is not specified, returns the current interval, which defaults to `d3_time.timeDay`. # *randomFinancial*.**intervalStep**([*value*]) If *value* is specified, sets the number of intervals that returned points should have dates offset by to the specified integer number and returns this generator instance. If *value* is not specified, returns the current number of intervals, which defaults to `1`. Internally, this value is supplied to the *step* argument of an interval's [offset function](https://github.com/d3/d3-time#interval_offset). # *randomFinancial*.**steps**([*value*]) Get/Set the number of [steps used by the geometric Brownian motion simulation](#gbm_steps) per *intervalStep* number of intervals. A higher number gives a slower, but higher resolution simulation. # *randomFinancial*.**mu**([*value*]) Get/Set the [drift used by the geometric Brownian motion simulation](#gbm_mu). # *randomFinancial*.**sigma**([*value*]) Get/Set the [volatility used by the geometric Brownian motion simulation](#gbm_sigma). # *randomFinancial*.**random**([*value*]) Get/Set the [random function used by the geometric Brownian motion simulation](#rgbm_random). # *randomFinancial*.**unitInterval**([*value*]) If *value* is specified, sets the time interval used for units of *mu* and *sigma* to the specified [d3 time interval](https://github.com/d3/d3-time#intervals) and returns this generator instance. If *value* is not specified, returns the current interval, which defaults to `d3_time.timeYear`. # *randomFinancial*.**unitIntervalStep**([*value*]) If *value* is specified, sets the integer number of intervals used for units of *mu* and *sigma* to the specified number and returns this generator instance. If *value* is not specified, returns the current interval, which defaults to `1`. For example, to have trading year units of *mu* and *sigma* rather than calendar year, set *unitIntervalStep* to `252` and *unitInterval* to `d3_time.timeDay`. # *randomFinancial*.**volume**([*value*]) If *value* is specified, sets the function used return a point's volume to the specified function and returns this generator instance. Can be specified as either a function mapping an output object to a number, or a number. If *value* is not specified, returns the current volume, which defaults to a function sampling integers from a normal distribution centred around `1000`. # *randomFinancial*.**filter**([*value*]) If *value* is specified, sets the filter function to the specified function and returns this generator instance. Only output objects `d` for which `filter(d)` returns `true` will be included in the output array. If *value* is not specified, returns the current filter function, which defaults to `(d) => true`. To skip weekends, supply the pre-defined filter `fc_random_data.skipWeekends`. ### Financial Stream Use the streaming interface to have successive calls to generate data keep track of the latest date and price. ```javascript import { randomFinancial } from 'd3fc-random-data'; const generator = randomFinancial() .startDate(new Date(2016, 0, 1)) .startPrice(100); const stream = generator.stream(); let data = []; data.push(stream.next()); // data.length -> 1 data = data.concat(stream.take(2)); // data.length -> 3 data = data.concat(stream.until(d => d.date > new Date(2016, 0, 10))); // data.length -> 10 ``` # *randomFinancial*.**stream**() Constructs a new stream from an existing financial data generator instance. # *stream*.**next**() Returns a single output object with date incremented from the latest returned output object's date according to the generator instance's *interval* and *intervalStep* properties, or with *startDate* if this is the first call. # *stream*.**take**(number) Returns an array of length *number* of output objects, each object with date incremented according to the generator instance's *interval* and *intervalStep* properties, starting with the latest returned output objects's incremented date, or with *startDate* if this is the first call. # *stream*.**until**(comparison) Returns the array of objects constructed by repeatedly generating a single output object with date incremented according to the generator instance's *interval* and *intervalStep* properties until a generated object satisfies the condition of the supplied comparison function, appending to the output array only if the condition is not satisfied. ### Geometric Brownian Motion The geometric Brownian motion component creates a series of values based on the [Geometric Brownian Motion](https://en.wikipedia.org/wiki/Geometric_Brownian_motion) stochastic process. ``` javascript import { randomGeometricBrownianMotion } from 'd3fc-random-data'; const generator = randomGeometricBrownianMotion() .steps(10); generator(10); // [ // 10, // 10.272847363463436, // 10.423881104466574, // 10.629316182766384, // 10.7209321393133, // 10.773722182206432, // 10.229636144307582, // 10.225282323984114, // 10.488138829847468, // 10.428118194568341, // 10.848822656937935 // ] ``` # fc.**randomGeometricBrownianMotion**() Constructs a new geometric Brownian motion generator. # *randomGeometricBrownianMotion*(*start*) Returns an array of price values following a geometric Brownian motion with the set drift and volatility, given a starting price of *start*. The first array value is the supplied start price, followed by *steps* number of values corresponding to the simulated price value at the end of each step. # *randomGeometricBrownianMotion*.**mu**([*value*]) If *value* is specified, sets the percentage drift per period to the specified number and returns this generator instance. If *value* is not specified, returns the current drift, which defaults to `0.1`. # *randomGeometricBrownianMotion*.**sigma**([*value*]) If *value* is specified, sets the percentage volatility per period to the specified number and returns this generator instance. If *value* is not specified, returns the current volatility, which defaults to `0.1`. # *randomGeometricBrownianMotion*.**period**([*value*]) If *value* is specified, sets the interval length to the specified number of periods and returns this generator instance. If *value* is not specified, returns the current interval length, which defaults to `1`. *randomGeometricBrownianMotion*.**steps**([*value*]) If *value* is specified, sets the number of discrete steps to divide the interval into to the specified number and returns this generator instance. If *value* is not specified, returns the current number of steps, which defaults to `20`. *randomGeometricBrownianMotion*.**random**([*value*]) If *value* is specified, sets the function used for generating random numbers with a normal (Gaussian) distribution to the specified function and returns this generator instance. If *value* is not specified, returns the current random function, which defaults to [`d3_random.randomNormal`](https://github.com/d3/d3-random#randomNormal).