stock_price_imitation 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +35 -6
- data/bin/price-imi +1 -11
- data/lib/stock_price_imitation/generator.rb +24 -61
- data/lib/stock_price_imitation/version.rb +1 -1
- data/test/test_generator.rb +10 -28
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b7d9f29ad69843f3ab91b37400f8d093064b8cd
|
4
|
+
data.tar.gz: 0416a3cf88e7976a8dd79e053f9e1e3af9b495c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48c8ca93b7557b48fe08709a0f16be88bcc72ab3a760486409f3c87397543d9ed43e63ae331af1736458fd6267f31cdf4008505b5dbd86556bee81d51b83d252
|
7
|
+
data.tar.gz: b9788c3a948a082f345d578d8309efabb02ef349b40da31f981e6846d63562250e1111ac846aa31d0d0770e1b0f52c0172aa4d17fd22a795ac5747c99f8c428d
|
data/README.md
CHANGED
@@ -24,15 +24,44 @@ Or install it yourself as:
|
|
24
24
|
require 'stock_price_imitation'
|
25
25
|
|
26
26
|
step = 100
|
27
|
-
|
27
|
+
first_price = 1000
|
28
28
|
|
29
|
-
StockPriceImitation::Generator.new(step,
|
29
|
+
StockPriceImitation::Generator.new(step, first_price).execute
|
30
30
|
#=>
|
31
31
|
# [
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
35
|
-
#
|
32
|
+
# 1000,
|
33
|
+
# 938.3100086235717,
|
34
|
+
# 981.4231014813671,
|
35
|
+
# 1007.3571568991346,
|
36
|
+
# 1029.2902431426667,
|
37
|
+
# 982.9669793828307,
|
38
|
+
# 929.9509085392571,
|
39
|
+
# 939.4320731877888,
|
40
|
+
# 896.687366210831,
|
41
|
+
# 854.1886746209568,
|
42
|
+
# 939.2926430659182,
|
43
|
+
# 1003.6951479776594,
|
44
|
+
# 982.4217723833527,
|
45
|
+
# 983.7855205021697,
|
46
|
+
# 903.1200400198854,
|
47
|
+
# 928.4857252941681,
|
48
|
+
# 919.9919046908392,
|
49
|
+
# 844.3172053278877,
|
50
|
+
# 818.9004760309148,
|
51
|
+
# 769.859737021469,
|
52
|
+
# 811.597212604147,
|
53
|
+
# 868.6645681205346,
|
54
|
+
# 842.275187071378,
|
55
|
+
# 792.9731650742258,
|
56
|
+
# 703.4481384978214,
|
57
|
+
# 791.1553991795175,
|
58
|
+
# 803.8125730300483,
|
59
|
+
# 861.6376677943115,
|
60
|
+
# 929.5894987271124,
|
61
|
+
# 986.6277941318276,
|
62
|
+
# 972.3996383854002,
|
63
|
+
# 1034.2098291866168,
|
64
|
+
# 1122.192642359364,
|
36
65
|
# ...
|
37
66
|
# ]
|
38
67
|
```
|
data/bin/price-imi
CHANGED
@@ -8,14 +8,4 @@ step = ARGV.first.to_i if !ARGV.empty?
|
|
8
8
|
first_seed_price = 1000
|
9
9
|
|
10
10
|
prices = StockPriceImitation::Generator.new(step, first_seed_price).execute
|
11
|
-
|
12
|
-
if prices.empty?
|
13
|
-
exit(0)
|
14
|
-
end
|
15
|
-
|
16
|
-
header = prices.first.keys.join("\t")
|
17
|
-
puts header
|
18
|
-
|
19
|
-
prices.each do |price|
|
20
|
-
puts price.values.map{|p|p.round(2)}.join("\t")
|
21
|
-
end
|
11
|
+
puts prices
|
@@ -1,82 +1,45 @@
|
|
1
|
-
require 'random_bell'
|
2
|
-
|
3
1
|
class StockPriceImitation::Generator
|
4
|
-
def initialize(
|
5
|
-
@
|
6
|
-
@
|
7
|
-
@
|
8
|
-
|
9
|
-
@steps = []
|
2
|
+
def initialize(tick_count, first_tick_price=1000)
|
3
|
+
@tick_count = tick_count
|
4
|
+
@first_tick_price = first_tick_price
|
5
|
+
@ticks = []
|
10
6
|
end
|
11
7
|
|
12
8
|
def execute
|
13
|
-
|
9
|
+
generate!
|
10
|
+
@ticks
|
14
11
|
end
|
15
12
|
|
16
13
|
private
|
17
14
|
|
18
|
-
def
|
19
|
-
@
|
20
|
-
|
21
|
-
@step_count.times.each do |i|
|
15
|
+
def generate!
|
16
|
+
@tick_count.times.each do |i|
|
22
17
|
if i == 0
|
23
|
-
|
24
|
-
|
25
|
-
previous = @seeds[i-1]
|
26
|
-
@seeds << previous + (@first_seed_price * @bell.rand * [-1,1].sample)
|
18
|
+
setup_first_tick
|
19
|
+
next
|
27
20
|
end
|
28
|
-
end
|
29
|
-
|
30
|
-
@seeds
|
31
|
-
end
|
32
21
|
|
33
|
-
|
34
|
-
seed_prices.map do |seed|
|
35
|
-
Step.new(seed, @volatility).to_hash
|
22
|
+
@ticks << generate_tick(@ticks[i-1])
|
36
23
|
end
|
37
24
|
end
|
38
25
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
@seed_price = seed_price
|
44
|
-
|
45
|
-
prices = 2.times.map{ @seed_price * bell.rand }
|
46
|
-
@low_price, @high_price = prices.sort
|
47
|
-
end
|
48
|
-
|
49
|
-
def low_price
|
50
|
-
to_zero_if_negative @low_price
|
51
|
-
end
|
52
|
-
|
53
|
-
def high_price
|
54
|
-
to_zero_if_negative @high_price
|
55
|
-
end
|
56
|
-
|
57
|
-
def opening_price
|
58
|
-
to_zero_if_negative (rand low_price..high_price)
|
59
|
-
end
|
26
|
+
def setup_first_tick
|
27
|
+
@ticks << @first_tick_price
|
28
|
+
end
|
60
29
|
|
61
|
-
|
62
|
-
|
63
|
-
|
30
|
+
def generate_tick(previous_price)
|
31
|
+
to_zero_if_negative(previous_price + increase)
|
32
|
+
end
|
64
33
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
end
|
34
|
+
def increase
|
35
|
+
@first_tick_price * rand(0..0.1) * [-1,1].sample
|
36
|
+
end
|
69
37
|
|
70
|
-
|
38
|
+
def to_zero_if_negative(number)
|
39
|
+
if number < 0
|
40
|
+
return 0
|
71
41
|
end
|
72
42
|
|
73
|
-
|
74
|
-
{
|
75
|
-
opening_price: self.opening_price,
|
76
|
-
closing_price: self.closing_price,
|
77
|
-
low_price: self.low_price,
|
78
|
-
high_price: self.high_price,
|
79
|
-
}
|
80
|
-
end
|
43
|
+
number
|
81
44
|
end
|
82
45
|
end
|
data/test/test_generator.rb
CHANGED
@@ -4,18 +4,18 @@ describe StockPriceImitation::Generator do
|
|
4
4
|
describe '#initialize' do
|
5
5
|
it 'new instance' do
|
6
6
|
generator = StockPriceImitation::Generator
|
7
|
-
|
7
|
+
tick_count = 10
|
8
8
|
|
9
|
-
assert generator.new(
|
9
|
+
assert generator.new(tick_count).class == generator
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
13
|
describe '#execute' do
|
14
14
|
before do
|
15
|
-
@
|
15
|
+
@tick_count = 100
|
16
16
|
@first_price = 1000
|
17
17
|
|
18
|
-
@generator = StockPriceImitation::Generator.new(@
|
18
|
+
@generator = StockPriceImitation::Generator.new(@tick_count, @first_price)
|
19
19
|
@price_movement = @generator.execute
|
20
20
|
end
|
21
21
|
|
@@ -23,31 +23,13 @@ describe StockPriceImitation::Generator do
|
|
23
23
|
assert @price_movement.is_a? Array
|
24
24
|
end
|
25
25
|
|
26
|
-
it 'length is
|
27
|
-
assert @price_movement.size == @
|
26
|
+
it 'length is tick_count' do
|
27
|
+
assert @price_movement.size == @tick_count
|
28
28
|
end
|
29
29
|
|
30
|
-
it 'a
|
31
|
-
@price_movement.each do |
|
32
|
-
assert
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'high is bigger than low' do
|
37
|
-
@price_movement.each do |step|
|
38
|
-
assert step[:high_price] >= step[:low_price]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'open between high and low' do
|
43
|
-
@price_movement.each do |price|
|
44
|
-
assert (price[:low_price]..price[:high_price]).include? price[:opening_price]
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'close between high and low' do
|
49
|
-
@price_movement.each do |price|
|
50
|
-
assert (price[:low_price]..price[:high_price]).include? price[:closing_price]
|
30
|
+
it 'a tick is a Float' do
|
31
|
+
@price_movement.each do |tick|
|
32
|
+
assert tick.is_a? Numeric
|
51
33
|
end
|
52
34
|
end
|
53
35
|
|
@@ -56,7 +38,7 @@ describe StockPriceImitation::Generator do
|
|
56
38
|
price_movement = generator.execute
|
57
39
|
|
58
40
|
price_movement.each do |price|
|
59
|
-
assert price
|
41
|
+
assert price >= 0
|
60
42
|
end
|
61
43
|
end
|
62
44
|
end
|