qc 0.6.4 → 0.6.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d0cb176bf152cc5f9c94cbbe344ba7f724c6503d
4
- data.tar.gz: f1f9bbd5f2d1a6b33ed77fd4362f0ef6d1e689ac
3
+ metadata.gz: 1b3de9ffca9f64dac8e90c931b22dbd2ee65ebbb
4
+ data.tar.gz: 32cb8921e13c021e4e080d3713ca0575bea8227e
5
5
  SHA512:
6
- metadata.gz: eee0a5275880c927c8b0f571fd5f685cb880c7ff2caf05dfc23474b7dc3002c6ad8508b4a98679335f918dc2f0472165be28f7a03a6e365e807e6905d94d01ac
7
- data.tar.gz: 95db6807ab2d0089082372c6f9179438b8e4ea969078570fe71fc371c9bd00d68ae0b60396397b4ab65be9e43b8ec256fef6ea7258d4de9d43141f5c3a3552b1
6
+ metadata.gz: 742b76cb7db38f4c993375e2a6df7976882fa5843fa88c6a1c042d7005ded194c545775393e109c91e6eb75468114720ebc6cd9408b6ac01e7b473d1ab2d0720
7
+ data.tar.gz: fa133d6dddfe1d70fcd697027cc82081857d82b25f255f6ffe2566fbb20b0f828b8992c6125ba9dbb59467d731c1cb8fb374ae65c99214f8f6eb97b4d0f0d9d9
@@ -0,0 +1,15 @@
1
+ # Qc Changelog
2
+
3
+ ## 6.0.4
4
+
5
+ - Removes `awesome-print` dependency #2
6
+ - Adds option to ignore files in `.qc/settings.yml` #4
7
+
8
+ ## 6.0.5
9
+
10
+ - Wait for the backtest to finish when running `qc backtest`
11
+ - Shows summary of performance statistics after running backtest
12
+
13
+
14
+
15
+
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qc (0.6.4)
4
+ qc (0.6.5)
5
5
  rest-client (~> 2.0.2)
6
6
  vcr (~> 3.0.3)
7
7
  webmock (~> 3.1.0)
@@ -24,7 +24,7 @@ GEM
24
24
  mime-types-data (3.2016.0521)
25
25
  minitest (5.10.3)
26
26
  netrc (0.11.0)
27
- public_suffix (3.0.0)
27
+ public_suffix (3.0.1)
28
28
  rake (10.5.0)
29
29
  rest-client (2.0.2)
30
30
  http-cookie (>= 1.0.2, < 2.0)
@@ -35,7 +35,7 @@ GEM
35
35
  unf_ext
36
36
  unf_ext (0.0.7.4)
37
37
  vcr (3.0.3)
38
- webmock (3.1.0)
38
+ webmock (3.1.1)
39
39
  addressable (>= 2.3.6)
40
40
  crack (>= 0.3.2)
41
41
  hashdiff
data/lib/qc.rb CHANGED
@@ -3,6 +3,7 @@ require 'yaml'
3
3
  require 'rest-client'
4
4
  require 'json'
5
5
  require 'optparse'
6
+ require 'pp'
6
7
 
7
8
  Dir[File.join(__dir__, "qc/**/*.rb")].each { |f| require f }
8
9
 
@@ -1,18 +1,32 @@
1
1
  module Qc
2
2
  class Backtest < Struct.new(:id, :name, :completed, :progress, :result, :success)
3
3
  alias success? success
4
- alias completed? completed
5
4
 
6
5
  def error?
7
6
  !success?
8
7
  end
9
8
 
10
- def progress_in_percentage
11
- progress * 100
12
- end
13
-
14
9
  def started?
15
10
  progress > 0
16
11
  end
12
+
13
+ def completed?
14
+ completed && (error? || (success? && result && result['TotalPerformance']))
15
+ end
16
+
17
+ def to_s
18
+ description = "Backtest #{id}"
19
+ return "Backtest #{id} (not finished)" unless completed?
20
+ statistics = result['TotalPerformance']['PortfolioStatistics']
21
+ max_length = statistics.collect {|key, value| key.length}.max
22
+
23
+ description << "\n\n"
24
+ statistics.each do |key, value|
25
+ formatted_key = "#{key}: #{' ' * (max_length - key.length)}"
26
+ description << "#{formatted_key}#{value}\n"
27
+ end
28
+
29
+ description
30
+ end
17
31
  end
18
32
  end
@@ -3,9 +3,9 @@ module Qc
3
3
  DEFAULT_FILE_EXTENSIONS = 'cs,py'
4
4
  DEFAULT_IGNORED_FILES = ['AssemblyInfo.cs']
5
5
 
6
- SUPPORTED_COMMANDS =%i(login logout init push compile backtest open)
6
+ SUPPORTED_COMMANDS = %i(login logout init push compile backtest open)
7
7
  COMPILE_POLLING_DELAY_IN_SECONDS = 2
8
- BACKTEST_DELAY_IN_SECONDS = 3
8
+ BACKTEST_DELAY_IN_SECONDS = 4
9
9
 
10
10
  attr_reader :quant_connect_proxy, :options
11
11
  attr_accessor :project_settings
@@ -44,15 +44,14 @@ module Qc
44
44
  if ::File.exist?(project_settings_file)
45
45
  YAML.load(::File.open(project_settings_file))
46
46
  else
47
- build_fresh_project_settings
47
+ create_project_settings
48
48
  end
49
49
  end
50
50
 
51
- def build_fresh_project_settings
51
+ def create_project_settings
52
52
  Qc::ProjectSettings.new.tap do |project_settings|
53
53
  project_settings.ignored_files = DEFAULT_IGNORED_FILES
54
54
  end
55
-
56
55
  end
57
56
 
58
57
  def logged_in?
@@ -190,19 +189,18 @@ module Qc
190
189
  backtest = quant_connect_proxy.create_backtest project_settings.project_id, project_settings.last_compile_id, "backtest-#{project_settings.last_compile_id}"
191
190
  puts "Backtest for compile #{project_settings.last_compile_id} sent to the queue with id #{backtest.id}"
192
191
  open_results_in_quant_connect if options.open_results
193
-
192
+ puts "Waiting for backtest to start..."
193
+ last_completed_percentage = nil
194
194
  begin
195
- if backtest.started?
196
- puts "Waiting for backtest to finish (#{backtest.progress_in_percentage}\% completed)..."
197
- else
198
- puts "Waiting for backtest to start..."
195
+ if last_completed_percentage != backtest.progress
196
+ puts "Completed: #{backtest.progress}%..."
199
197
  end
198
+ last_completed_percentage = backtest.progress
200
199
  backtest = quant_connect_proxy.read_backtest project_settings.project_id, backtest.id
201
- sleep BACKTEST_DELAY_IN_SECONDS if backtest.completed?
200
+ sleep BACKTEST_DELAY_IN_SECONDS unless backtest.completed?
202
201
  end while !backtest.completed?
203
202
 
204
- puts "Backtest finished" if backtest.success?
205
- puts "Backtest failed" if backtest.error?
203
+ show_backtest_results(backtest)
206
204
 
207
205
  project_settings.last_backtest_id = backtest.id
208
206
  save_project_settings
@@ -210,6 +208,12 @@ module Qc
210
208
  backtest.success?
211
209
  end
212
210
 
211
+ def show_backtest_results(backtest)
212
+ puts "Backtest finished" if backtest.success?
213
+ puts "Backtest failed" if backtest.error?
214
+ puts backtest.to_s
215
+ end
216
+
213
217
  def valid_login?
214
218
  quant_connect_proxy.valid_login?
215
219
  end
@@ -232,12 +236,12 @@ module Qc
232
236
  projects = quant_connect_proxy.list_projects
233
237
  puts "Select the project you want to associate with this directory"
234
238
  projects.each.with_index do |project, index|
235
- puts "[#{index+1}] - #{project.name}"
239
+ puts "[#{index + 1}] - #{project.name}"
236
240
  end
237
241
  index = ask_for_value "Project number?"
238
242
  index = index.to_i
239
- if index >=1 && index < projects.length + 1
240
- projects[index-1]
243
+ if index >= 1 && index < projects.length + 1
244
+ projects[index - 1]
241
245
  else
242
246
  puts "Invalid value (please type a number between #{1} and #{projects.length})"
243
247
  ask_for_project
@@ -276,7 +280,7 @@ module Qc
276
280
  end
277
281
 
278
282
  def fetch_all_files
279
- Dir["**/*.{#{project_settings.file_extensions}}"].reject{|file| ignore_file?(file) }
283
+ Dir["**/*.{#{project_settings.file_extensions}}"].reject {|file| ignore_file?(file)}
280
284
  end
281
285
 
282
286
  def ignore_file?(file)
@@ -72,10 +72,9 @@ module Qc
72
72
  end
73
73
 
74
74
  def read_backtest(project_id, backtest_id)
75
- response = perform_request :get, '/backtests/read', params: {projectId: project_id, compileId: backtest_id}
75
+ response = perform_request :get, '/backtests/read', params: {projectId: project_id, backtestId: backtest_id}
76
76
  validate_response! response
77
- found_backtest_json = response.backtests.find{|backtest_json| backtest_json['backtestId'] == backtest_id}
78
- create_backtest_from_json_response(OpenStruct.new({success: response.success}.merge(found_backtest_json)))
77
+ create_backtest_from_json_response(response)
79
78
  end
80
79
 
81
80
  private
@@ -1,3 +1,3 @@
1
1
  module Qc
2
- VERSION = "0.6.4"
2
+ VERSION = "0.6.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jorge Manrubia
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-03 00:00:00.000000000 Z
11
+ date: 2017-12-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -119,6 +119,7 @@ files:
119
119
  - ".gitignore"
120
120
  - ".ruby-version"
121
121
  - ".travis.yml"
122
+ - Changelog.md
122
123
  - Gemfile
123
124
  - Gemfile.lock
124
125
  - LICENSE.txt
@@ -130,7 +131,6 @@ files:
130
131
  - bin/console
131
132
  - bin/qc
132
133
  - bin/setup
133
- - changelog.md
134
134
  - lib/qc.rb
135
135
  - lib/qc/backtest.rb
136
136
  - lib/qc/cli.rb
@@ -1,9 +0,0 @@
1
- # Qc Changelog
2
-
3
- ## 6.0.4
4
-
5
- - Removes `awesome-print` dependency #2
6
- - Adds option to ignore files in `.qc/settings.yml` #4
7
-
8
-
9
-