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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 22da3c52d9a592e41a0bbb03ab3653413c77bc69
4
- data.tar.gz: 4534e896315946b7753629e306002166e080d366
3
+ metadata.gz: 6b7d9f29ad69843f3ab91b37400f8d093064b8cd
4
+ data.tar.gz: 0416a3cf88e7976a8dd79e053f9e1e3af9b495c6
5
5
  SHA512:
6
- metadata.gz: 51e2555a8bc20f208132fa83fe00b124b8967f0b45d11519f6f90896730e15a658e588631a492d0cc6428e55e94c13276965e3d3573637569400b642c86bba99
7
- data.tar.gz: 1f4a74c8f96d605f607e4e630ec848ba1f2f90aab86fa90134fb8eeae22a5c22f608436247b3e7a65108260e7e40936522c840cbe37f1629d4ef8afaa6407bcd
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
- first_seed_price = 10000
27
+ first_price = 1000
28
28
 
29
- StockPriceImitation::Generator.new(step, first_seed_price).execute
29
+ StockPriceImitation::Generator.new(step, first_price).execute
30
30
  #=>
31
31
  # [
32
- # {:opening_price=>4159.493944357897, :closing_price=>4569.307745093309, :low_price=>3505.808433389255, :high_price=>5912.357228503945},
33
- # {:opening_price=>3541.7376008768974, :closing_price=>3887.9262834566866, :low_price=>3328.361828447127, :high_price=>5535.742136147374},
34
- # {:opening_price=>9048.18367848711, :closing_price=>8573.694158336206, :low_price=>8082.212918461541, :high_price=>9735.473910738032},
35
- # {:opening_price=>5117.8471523358085, :closing_price=>7558.560742729045, :low_price=>3466.6265172827384, :high_price=>8218.548256191063},
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
  ```
@@ -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(step_count, first_seed_price=1000)
5
- @step_count = step_count
6
- @first_seed_price = first_seed_price
7
- @bell = RandomBell.new(mu: 0.0, range: 0.0..2.0)
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
- prices_by(seed_prices)
9
+ generate!
10
+ @ticks
14
11
  end
15
12
 
16
13
  private
17
14
 
18
- def seed_prices
19
- @seeds = []
20
-
21
- @step_count.times.each do |i|
15
+ def generate!
16
+ @tick_count.times.each do |i|
22
17
  if i == 0
23
- @seeds << @first_seed_price
24
- else
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
- def prices_by(seed_prices)
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
- class Step
40
- def initialize(seed_price, volatility)
41
- bell = RandomBell.new
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
- def closing_price
62
- to_zero_if_negative (rand low_price..high_price)
63
- end
30
+ def generate_tick(previous_price)
31
+ to_zero_if_negative(previous_price + increase)
32
+ end
64
33
 
65
- def to_zero_if_negative(number)
66
- if number < 0
67
- return 0
68
- end
34
+ def increase
35
+ @first_tick_price * rand(0..0.1) * [-1,1].sample
36
+ end
69
37
 
70
- number
38
+ def to_zero_if_negative(number)
39
+ if number < 0
40
+ return 0
71
41
  end
72
42
 
73
- def to_hash
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
@@ -1,3 +1,3 @@
1
1
  module StockPriceImitation
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -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
- step_count = 10
7
+ tick_count = 10
8
8
 
9
- assert generator.new(step_count).class == generator
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
- @step_count = 100
15
+ @tick_count = 100
16
16
  @first_price = 1000
17
17
 
18
- @generator = StockPriceImitation::Generator.new(@step_count, @first_price)
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 step_count' do
27
- assert @price_movement.size == @step_count
26
+ it 'length is tick_count' do
27
+ assert @price_movement.size == @tick_count
28
28
  end
29
29
 
30
- it 'a step is a hash' do
31
- @price_movement.each do |step|
32
- assert step.is_a? Hash
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.values.all?{|v| v >= 0 }
41
+ assert price >= 0
60
42
  end
61
43
  end
62
44
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stock_price_imitation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shinya131