sqa 0.0.7 → 0.0.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,63 @@
1
+ # lib/sqa/indicator/predict_next_values.rb
2
+
3
+ module SQA
4
+ end
5
+
6
+ class SQA::Indicator; class << self
7
+
8
+ def predict_next_values(array, predictions)
9
+ result = []
10
+
11
+ array.each_cons(2) do |a, b|
12
+ # TODO: take 3 at a time. compare 3rd
13
+ # prediction. Generate an average delta
14
+ # between predicted and actual. Return
15
+ # the prediction as a range???
16
+ result << b + (b - a)
17
+ end
18
+
19
+ if predictions > 0
20
+ (1..predictions).each do |_|
21
+ last_two_values = result.last(2)
22
+ delta = last_two_values.last - last_two_values.first
23
+ next_value = last_two_values.last + delta
24
+ result << next_value
25
+ end
26
+ end
27
+
28
+ result.last(predictions)
29
+ end
30
+ alias_method :pnv, :predict_next_values
31
+
32
+
33
+ # Returns a forecast for future values based on the near past
34
+ #
35
+ # When I wrote this I was thinking of hurricane forecasting and how
36
+ # the cone of probability gets larger the further into the future
37
+ # the forecast goes. This does not produce that kind of probability
38
+ # cone; but, that was hwat I was thinking about
39
+ #
40
+ # array is an Array - for example historical price data
41
+ # predictions is an Integer for how many predictions into the future
42
+ #
43
+ def pnv2(array, predictions)
44
+ result = []
45
+ last_inx = array.size - 1 # indexes are zero based
46
+
47
+ predictions.times do |x|
48
+ x += 1 # forecasting 1 day into the future needs 2 days of near past data
49
+
50
+ # window is the near past values
51
+ window = array[last_inx-x..]
52
+
53
+ high = window.max
54
+ low = window.min
55
+ midpoint = (high + low) / 2.0
56
+
57
+ result << [high, midpoint, low]
58
+ end
59
+
60
+ result
61
+ end
62
+
63
+ end; end
data/lib/sqa/strategy.rb CHANGED
@@ -54,4 +54,12 @@ class SQA::Strategy
54
54
  end
55
55
  end
56
56
 
57
+ require_relative 'strategy/common'
58
+ require_relative 'strategy/consensus'
59
+ require_relative 'strategy/ema'
60
+ require_relative 'strategy/mp'
61
+ require_relative 'strategy/mr'
62
+ require_relative 'strategy/random'
63
+ require_relative 'strategy/rsi'
64
+ require_relative 'strategy/sma'
57
65
 
data/lib/sqa/version.rb CHANGED
@@ -1,7 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'sem_version'
4
+ require 'sem_version/core_ext'
5
+
3
6
  module SQA
4
- module Version
5
- VERSION = "0.0.7"
7
+ VERSION = "0.0.9"
8
+
9
+ class << self
10
+ def version
11
+ @@version ||= VERSION.to_version
12
+ end
6
13
  end
7
14
  end
data/lib/sqa/web.rb ADDED
@@ -0,0 +1,159 @@
1
+ # lib/sqa/command/web.rb
2
+
3
+ require 'tty-option'
4
+
5
+
6
+ module SQA
7
+ class Web < CLI
8
+ include TTY::Option
9
+
10
+ command "web"
11
+
12
+ desc "Run a web server"
13
+
14
+ example "Set working directory (-w)",
15
+ " sqa web --port 4567 --data-dir /path/to/dir/ ubuntu pwd"
16
+
17
+ example <<~EOS
18
+ Do Something
19
+ sqa web
20
+ EOS
21
+
22
+ argument :image do
23
+ required
24
+ desc "The name of the image to use"
25
+ end
26
+
27
+ keyword :restart do
28
+ default "no"
29
+ permit %w[no on-failure always unless-stopped]
30
+ desc "Restart policy to apply when a container exits"
31
+ end
32
+
33
+ flag :detach do
34
+ long "--detach"
35
+ desc "Run container in background and print container ID"
36
+ end
37
+
38
+ option :name do
39
+ required
40
+ long "--name string"
41
+ desc "Assign a name to the container"
42
+ end
43
+
44
+ option :port do
45
+ arity one_or_more
46
+ long "--port integer"
47
+ default 4567
48
+ desc "The port where the web app will run"
49
+ end
50
+
51
+
52
+ def initialize
53
+ # TODO: make it happen
54
+ end
55
+ end
56
+ end
57
+
58
+ __END__
59
+
60
+
61
+ #!/usr/bin/env ruby
62
+ # experiments/sinatra_examples/svg_viewer.rb
63
+ # builds on md_viewer.rb
64
+
65
+ require 'sinatra'
66
+ require 'kramdown'
67
+ require 'nenv'
68
+
69
+ # class MdViewer < Sinatra::Application
70
+
71
+ # Set the directory location
72
+ set :markdown_directory, Nenv.home + '/Downloads'
73
+
74
+ # Sinatra route to show a markdown file as html
75
+ get '/md/:filename' do
76
+ # Get the file name from the URL parameter
77
+ filename = params[:filename]
78
+
79
+ # Check if the file exists in the specified directory
80
+ if File.file?(File.join(settings.markdown_directory, filename))
81
+ # Read the markdown file
82
+ markdown_content = File.read(File.join(settings.markdown_directory, filename))
83
+
84
+ # Convert the markdown to HTML using kramdown
85
+ converted_html = Kramdown::Document.new(markdown_content).to_html
86
+
87
+ # Display the generated HTML
88
+ content_type :html
89
+ converted_html
90
+ else
91
+ # File not found error
92
+ status 404
93
+ "File not found: #{filename} in #{markdown_directory}"
94
+ end
95
+ end
96
+
97
+
98
+ # Sinatra route to show a markdown file as html
99
+ get '/svg/:filename' do
100
+ # Get the file name from the URL parameter
101
+ filename = params[:filename]
102
+
103
+ # Check if the file exists in the specified directory
104
+ if File.file?(File.join(settings.markdown_directory, filename))
105
+ # Read the svg file
106
+ svg_content = File.read(File.join(settings.markdown_directory, filename))
107
+
108
+ # Convert the svg to HTML
109
+ converted_html = <<~HTML
110
+ <!DOCTYPE html>
111
+ <html>
112
+ <head>
113
+ <meta charset="utf-8">
114
+ <meta name="viewport" content="width=device-width, initial-scale=1">
115
+ <title>#{filename}</title>
116
+ </head>
117
+ <body>
118
+ #{svg_content}
119
+ </body>
120
+ </html>
121
+ HTML
122
+
123
+ # Display the generated HTML
124
+ content_type :html
125
+ converted_html
126
+ else
127
+ # File not found error
128
+ status 404
129
+ "File not found: #{filename} in #{markdown_directory}"
130
+ end
131
+ end
132
+
133
+
134
+
135
+
136
+ # end
137
+
138
+ # Start the Sinatra app
139
+ # run MdViewer
140
+
141
+
142
+ __END__
143
+
144
+ ruby myapp.rb [-h] [-x] [-q] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
145
+
146
+ Options are:
147
+
148
+ -h # help
149
+ -p # set the port (default is 4567)
150
+ -o # set the host (default is 0.0.0.0)
151
+ -e # set the environment (default is development)
152
+ -s # specify rack server/handler (default is puma)
153
+ -q # turn on quiet mode for server (default is off)
154
+ -x # turn on the mutex lock (default is off)
155
+
156
+
157
+
158
+
159
+
data/lib/sqa.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # lib/sqa.rb
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require 'active_support'
@@ -5,11 +6,11 @@ require 'active_support/core_ext/string'
5
6
  require 'daru'
6
7
  require 'date'
7
8
  require 'descriptive_statistics'
8
- require 'mixlib/cli'
9
- require 'mixlib/config'
10
9
  require 'nenv'
11
10
  require 'pathname'
12
- require "version_gem"
11
+
12
+ require_relative "sqa/version"
13
+
13
14
 
14
15
  unless defined?(HOME)
15
16
  HOME = Pathname.new(Nenv.home)
@@ -17,59 +18,64 @@ end
17
18
 
18
19
 
19
20
  module SQA
20
- Signal = {
21
- hold: 0,
22
- buy: 1,
23
- sell: 2
24
- }.freeze
25
-
26
- Trend = {
27
- up: 0,
28
- down: 1
29
- }.freeze
30
-
31
- Swing = {
32
- valley: 0,
33
- peak: 1,
34
- }.freeze
35
-
36
- module Config
37
- extend Mixlib::Config
38
- config_strict_mode true
39
-
40
- default :data_dir, HOME + "sqa_data"
41
- default :plotting_library, :gruff # TODO: use svg-graph
42
- default :lazy_update, false
43
- default :portfolio_filename, "portfolio.csv"
44
- default :trades_filename, "trades.csv"
45
-
46
- default :log_level, :info
47
- default :config_file, "~/.sqa.rb"
21
+ class << self
22
+ @@config = nil
48
23
 
49
- end
24
+ def init(argv=ARGV)
25
+ if argv.is_a? String
26
+ argv = argv.split()
27
+ end
50
28
 
51
- def self.init
52
- SQA::CLI.new.run if defined? SQA::CLI
53
29
 
54
- Config.config_file = Pathname.new homify(Config.config_file)
30
+ # Ran at SQA::Config elaboration time
31
+ # @@config = Config.new
55
32
 
56
- Config.from_file(Config.config_file)
33
+ if defined? CLI
34
+ CLI.run(argv)
35
+ else
36
+ # There are no real command line parameters
37
+ # because the sqa gem is be required within
38
+ # the context of a larger program.
39
+ end
57
40
 
58
- Config.data_dir = Pathname.new homify(Config.data_dir)
41
+ Daru.lazy_update = config.lazy_update
42
+ Daru.plotting_library = config.plotting_library
59
43
 
60
- Daru.lazy_update = Config.lazy_update
61
- Daru.plotting_library = Config.plotting_library
44
+ if config.debug? || config.verbose?
45
+ debug_me{[
46
+ :config
47
+ ]}
48
+ end
62
49
 
63
- nil
64
- end
50
+ nil
51
+ end
52
+
53
+ def homify(filepath)
54
+ filepath.gsub(/^~/, Nenv.home)
55
+ end
56
+
57
+ def config
58
+ @@config
59
+ end
65
60
 
66
- def self.homify(filepath)
67
- filepath.gsub(/^~/, Nenv.home)
61
+ def config=(an_object)
62
+ @@config = an_object
63
+ end
64
+
65
+ def debug?
66
+ @@config.debug?
67
+ end
68
+
69
+ def verbose?
70
+ @@config.verbose?
71
+ end
68
72
  end
69
73
  end
70
74
 
71
75
  # require_relative "patches/daru" # TODO: extract Daru::DataFrame in new gem sqa-data_frame
72
76
 
77
+ require_relative "sqa/config"
78
+ require_relative "sqa/constants"
73
79
  require_relative "sqa/data_frame"
74
80
  require_relative "sqa/errors"
75
81
  require_relative "sqa/indicator"
@@ -77,9 +83,3 @@ require_relative "sqa/portfolio"
77
83
  require_relative "sqa/strategy"
78
84
  require_relative "sqa/stock"
79
85
  require_relative "sqa/trade"
80
- require_relative "sqa/version"
81
-
82
-
83
- SQA::Version.class_eval do
84
- extend VersionGem::Basic
85
- end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dewayne VanHoozer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-19 00:00:00.000000000 Z
11
+ date: 2023-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: mixlib-cli
56
+ name: hashie
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: mixlib-config
70
+ name: nenv
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,91 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: nenv
84
+ name: tty-logger
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: tty-markdown
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: tty-option
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: tty-progressbar
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: tty-prompt
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: tty-reader
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: tty-spinner
85
169
  requirement: !ruby/object:Gem::Requirement
86
170
  requirements:
87
171
  - - ">="
@@ -95,7 +179,7 @@ dependencies:
95
179
  - !ruby/object:Gem::Version
96
180
  version: '0'
97
181
  - !ruby/object:Gem::Dependency
98
- name: version_gem
182
+ name: tty-table
99
183
  requirement: !ruby/object:Gem::Requirement
100
184
  requirements:
101
185
  - - ">="
@@ -199,6 +283,10 @@ files:
199
283
  - checksums/sqa-0.0.4.gem.sha512
200
284
  - checksums/sqa-0.0.5.gem.sha512
201
285
  - checksums/sqa-0.0.6.gem.sha512
286
+ - checksums/sqa-0.0.7.gem.sha512
287
+ - checksums/sqa-0.0.8.gem.sha512
288
+ - checksums/sqa-0.0.9.gem.sha512
289
+ - docs/.gitignore
202
290
  - docs/README.md
203
291
  - docs/average_true_range.md
204
292
  - docs/bollinger_bands.md
@@ -216,15 +304,27 @@ files:
216
304
  - docs/momentum.md
217
305
  - docs/moving_average_convergence_divergence.md
218
306
  - docs/peaks_and_valleys.md
307
+ - docs/predict_next_value.md
219
308
  - docs/relative_strength_index.md
220
309
  - docs/requirements.md
221
310
  - docs/simple_moving_average.md
222
311
  - docs/stochastic_oscillator.md
223
312
  - docs/strategy.md
224
313
  - docs/true_range.md
314
+ - lib/patches/daru.rb
315
+ - lib/patches/daru/category.rb
316
+ - lib/patches/daru/data_frame.rb
317
+ - lib/patches/daru/plotting/svg-graph.rb
318
+ - lib/patches/daru/plotting/svg-graph/category.rb
319
+ - lib/patches/daru/plotting/svg-graph/dataframe.rb
320
+ - lib/patches/daru/plotting/svg-graph/vector.rb
321
+ - lib/patches/daru/vector.rb
225
322
  - lib/sqa.rb
226
323
  - lib/sqa/activity.rb
324
+ - lib/sqa/analysis.rb
227
325
  - lib/sqa/cli.rb
326
+ - lib/sqa/config.rb
327
+ - lib/sqa/constants.rb
228
328
  - lib/sqa/data_frame.rb
229
329
  - lib/sqa/data_frame/yahoo_finance.rb
230
330
  - lib/sqa/errors.rb
@@ -244,6 +344,7 @@ files:
244
344
  - lib/sqa/indicator/momentum.rb
245
345
  - lib/sqa/indicator/moving_average_convergence_divergence.rb
246
346
  - lib/sqa/indicator/peaks_and_valleys.rb
347
+ - lib/sqa/indicator/predict_next_value.rb
247
348
  - lib/sqa/indicator/relative_strength_index.rb
248
349
  - lib/sqa/indicator/simple_moving_average.rb
249
350
  - lib/sqa/indicator/simple_moving_average_trend.rb
@@ -264,6 +365,7 @@ files:
264
365
  - lib/sqa/strategy/sma.rb
265
366
  - lib/sqa/trade.rb
266
367
  - lib/sqa/version.rb
368
+ - lib/sqa/web.rb
267
369
  homepage: https://github.com/MadBomber/sqa
268
370
  licenses:
269
371
  - MIT