market_data_faker 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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: []