market_data_faker 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ce1b60d2eae55493edf5218671ed9f2c7044df995244cbf715b82619bfcef1e7
4
+ data.tar.gz: e1863c400e0e02da74f4af42553d3a22101455029d6ac2054f70304a1fd8d311
5
+ SHA512:
6
+ metadata.gz: 27a9c8d079c6dc5cc86653bcdc12de054bf1bf53660b3fecd8c1f476927c293ec969e88dc820d57cd5d8262c9e37feeae19963eb0923233c14af3b415a30f432
7
+ data.tar.gz: d6c28c71041cd2d9d1d76f54d2bec57e51d0f04f9502b975673d4707da45b463e901cad0b61d52c48ede35ad9aee12f1d296e187ddc46458d2c425ecd36dbf38
@@ -0,0 +1,10 @@
1
+ require "market_data_faker/version"
2
+ require "market_data_faker/random_symbol"
3
+ require "market_data_faker/quote"
4
+ require "market_data_faker/stock_exchange"
5
+ require "json"
6
+ require "iex-ruby-client"
7
+ require 'active_support/core_ext/time/zones'
8
+
9
+ Time.zone = 'UTC'
10
+
@@ -0,0 +1,19 @@
1
+ module MarketDataFaker
2
+ class Quote
3
+ def self.get(symbol=nil, fake_it=true)
4
+ if fake_it
5
+ symbol = MarketDataFaker::RandomSymbol.get
6
+ puts "fake!"
7
+ end
8
+ IEX::Resources::Quote.get(symbol)
9
+ end
10
+
11
+ def self.batch(array, fake_it=true)
12
+ batch = {}
13
+ array.each do |symbol|
14
+ batch[symbol] = MarketDataFaker::StockExchange.exchange(symbol, fake_it)
15
+ end
16
+ return batch
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ module MarketDataFaker
2
+ class RandomSymbol
3
+ ETF_SYMBOLS = ["SPY","EEM","XLF","QQQ","GDX","VXX","EWZ","UVXY","EFA","FXI","XOP","SQQQ","XLU","XLE","XLP",
4
+ "AMLP","IAU","VWO","HYG","XLK","TQQQ","XLI","IEMG","JNK","SVXY","GDXJ","DWT","JNUG","SLV",
5
+ "IYR","XLV","VEA","RSX","TZA","TLT","EWJ","TVIX","OIH","GLD","EZU","NUGT","KRE","IEFA","SMH",
6
+ "DRIP","XLB","DGAZ","LQD","FEZ","SDOW","UCO","UWT","AGG","SPXU","XHB","EWY","TBT","ITB","DBC",
7
+ "TNA","UNG","IBB","XLRE","EWC","PFF","SHY","VOO","XME","ERX"]
8
+ def self.get(type="etf")
9
+ const_name = "#{type}_symbols".upcase
10
+ RandomSymbol.const_get(const_name).sample
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,75 @@
1
+ module MarketDataFaker
2
+ class StockExchange
3
+
4
+ XETRA = ["7:00", "19:00"]
5
+ FRANKFURT = ["7:00", "19:00"]
6
+ LSE = ["8:00", "16:30"]
7
+ EURONEXT = ["8:00", "16:30"]
8
+ NYSE = ["14:30", "21:00"]
9
+ NASDAQ = ["14:30", "21:00"]
10
+
11
+ def self.is_open(stock_exchange)
12
+ opening_hours = StockExchange.const_get(stock_exchange.upcase)
13
+ opening = Time.zone.parse(opening_hours[0])
14
+ closing = Time.zone.parse(opening_hours[1])
15
+ t = Time.zone.now
16
+ weekday = t.strftime("%A")
17
+
18
+ if weekday == "Saturday" || weekday == "Sunday"
19
+ return false
20
+ elsif t.between?(opening, closing)
21
+ return true
22
+ else
23
+ return false
24
+ end
25
+ end
26
+
27
+ def self.fake_realtime(latest_price)
28
+ ask_size = rand(50..250)
29
+ bid_size = ask_size
30
+ ask_price = latest_price * (1 - Random.new.rand(0.0005))
31
+ bid_price = latest_price * (1 - Random.new.rand(0.02))
32
+ collection = {
33
+ ask_size: ask_size,
34
+ ask_price: ask_price,
35
+ bid_size: bid_size,
36
+ bid_price: bid_price
37
+ }
38
+ return collection
39
+ end
40
+
41
+ def self.exchange(symbol, fake_it=true)
42
+ collection = []
43
+ stock_exchanges = StockExchange.constants.map(&:downcase)
44
+ quote = MarketDataFaker::Quote.get(symbol, fake_it)
45
+ stock_exchanges.each do |ex|
46
+ random = 1 + (Random.new.rand(0.0035) * ([-1,1].sample))
47
+ is_open = is_open(ex.to_s)
48
+ exchange = ex.to_s
49
+ avg_volume = quote.avg_total_volume * random
50
+ latest_price = quote.latest_price * random
51
+ construct_realtime = fake_realtime(latest_price)
52
+ ask_size = (quote.iex_ask_size == 0 || quote.iex_ask_size.nil? ) ? construct_realtime[:ask_size] : quote.iex_ask_size * random
53
+ ask_price = (quote.iex_ask_price == 0 || quote.iex_ask_price.nil?) ? construct_realtime[:ask_price] : quote.iex_ask_price * random
54
+ bid_size = (quote.iex_bid_size == 0 || quote.iex_bid_size.nil?) ? construct_realtime[:bid_size] : quote.iex_bid_size * random
55
+ bid_prize = (quote.iex_bid_price == 0 || quote.iex_bid_price.nil?) ? construct_realtime[:bid_price] : quote.iex_bid_price * random
56
+ last_update = quote.iex_last_updated_t
57
+
58
+ collection << {
59
+ symbol: symbol,
60
+ exchange: exchange,
61
+ avg_volume: avg_volume,
62
+ latest_price: latest_price,
63
+ ask_size: ask_size,
64
+ ask_price: ask_price,
65
+ bid_size: bid_size,
66
+ bid_prize: bid_prize,
67
+ last_update: last_update,
68
+ is_open: is_open
69
+ }
70
+ end
71
+ return collection
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,3 @@
1
+ module MarketDataFaker
2
+ VERSION = "0.1.9"
3
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: market_data_faker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.9
5
+ platform: ruby
6
+ authors:
7
+ - luke-hawk
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-08-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: iex-ruby-client
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activesupport
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description:
84
+ email:
85
+ - market.data.gem@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - lib/market_data_faker.rb
91
+ - lib/market_data_faker/quote.rb
92
+ - lib/market_data_faker/random_symbol.rb
93
+ - lib/market_data_faker/stock_exchange.rb
94
+ - lib/market_data_faker/version.rb
95
+ homepage:
96
+ licenses:
97
+ - MIT
98
+ metadata: {}
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubyforge_project:
115
+ rubygems_version: 2.7.3
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: A simple library to fake market data for a set of stock exchanges
119
+ test_files: []