Optimization Management
Create Optimization
Request
Project, compile and optimization parameters for launching an optimization job. The /optimizations/create
API accepts requests in the following format:
CreateOptimizationRequest Model - Request to create an optimization job. | |
---|---|
projectId | integer Project ID of the project the optimization belongs to. |
name | string Name of the optimization. |
target | string Target of the optimization. |
targetTo | string Target extremum of the optimization. |
targetValue | float Optimization target value. |
strategy | string Optimization strategy. |
compileId | string Optimization compile ID. |
parameters | OptimizationParameter Array Optimization parameters. |
constraints | OptimizationConstraint Array Optimization constraints. |
estimatedCost | float Estimated cost for optimization. |
nodeType | string Enum Optimization node type. Options : ['O2-8', 'O4-12', 'O8-16'] |
parallelNodes | integer Number of parallel nodes for optimization. |
Example |
{ "projectId": 23456789, "name": "Mia First Optimization Job", "target": "TotalPerformance.PortfolioStatistics.SharpeRatio", "targetTo": "\'max\' or \'min\'", "targetValue": 1, "strategy": "QuantConnect.Optimizer.Strategies.GridSearchOptimizationStrategy", "compileId": "c0edc6-49048b", "parameters": [ { "name": "rsi_period", "min": 10, "max": 20, "step": 1, "minStep": 1 } ], "constraints": [ { "target": "TotalPerformance.PortfolioStatistics.SharpeRatio", "operator": "greater", "targetValue": 1 } ], "estimatedCost": 10, "nodeType": "O2-8", "parallelNodes": 4 } |
OptimizationParameter Model | |
---|---|
name | string Name of optimization parameter. |
min | float Minimum value of optimization parameter, applicable for boundary conditions. |
max | float Maximum value of optimization parameter, applicable for boundary conditions. |
step | float Movement, should be positive. |
minStep | float Minimal possible movement for current parameter, should be positive. Used by Strategies.EulerSearchOptimizationStrategy to determine when this parameter can no longer be optimized. |
Example |
{ "name": "rsi_period", "min": 10, "max": 20, "step": 1, "minStep": 1 } |
OptimizationConstraint Model | |
---|---|
target | string Property we want to track. |
operator | string The target comparison operation. |
targetValue | float The value of the property we want to track. |
Example |
{ "target": "TotalPerformance.PortfolioStatistics.SharpeRatio", "operator": "greater", "targetValue": 1 } |
Responses
The /optimizations/create
API provides a response in the following format:
200 Success
ListOptimizationResponse Model - Response received when listing optimizations of a project. | |
---|---|
optimizations | CreateOptimizationResponse Array Collection of summarized optimization objects. |
success | boolean Indicate if the API request was successful. |
errors | string Array List of errors with the API call. |
Example |
{ "optimizations": [ { "optimizationId": "O-401d3d40b5a0e9f8c46c954a303f3ddd", "projectId": 23456789, "name": "string", "status": "New", "nodeType": "O2-8", "criterion": { "target": "TotalPerformance.PortfolioStatistics.SharpeRatio", "extremum": "max or min", "targetValue": 1 }, "created": "2021-11-26T15:18:27.693Z", "psr": 0, "sharpeRatio": 0, "trades": 0, "cloneId": 0, "outOfSampleDays": 0, "outOfSampleMaxEndDate": "2021-11-26T15:18:27.693Z", "parameters": [ "object" ] } ], "success": true, "errors": [ "string" ] } |
CreateOptimizationResponse Model - Response received when launching an optimization job. | |
---|---|
optimizationId | string Optimization ID. |
projectId | integer Project ID of the project the optimization belongs to. |
name | string Name of the optimization. |
status | string Enum Status of the optimization. Options : ['New', 'Aborted', 'Running', 'Completed'] |
nodeType | string Enum Optimization node type. Options : ['O2-8', 'O4-12', 'O8-16'] |
criterion | OptimizationTarget object /. |
created | string($date-time) Date when this optimization was created. |
psr | number Price-sales ratio stastic. |
sharpeRatio | number Sharpe ratio statistic. |
trades | integer Number of trades. |
cloneId | integer ID of project, were this current project was originally cloned. |
outOfSampleDays | integer Number of days of out of sample days. |
outOfSampleMaxEndDate | string($date-time) End date of out of sample data. |
parameters | object Array Parameters used in this optimization. |
Example |
{ "optimizationId": "O-401d3d40b5a0e9f8c46c954a303f3ddd", "projectId": 23456789, "name": "string", "status": "New", "nodeType": "O2-8", "criterion": { "target": "TotalPerformance.PortfolioStatistics.SharpeRatio", "extremum": "max or min", "targetValue": 1 }, "created": "2021-11-26T15:18:27.693Z", "psr": 0, "sharpeRatio": 0, "trades": 0, "cloneId": 0, "outOfSampleDays": 0, "outOfSampleMaxEndDate": "2021-11-26T15:18:27.693Z", "parameters": [ "object" ] } |
OptimizationTarget Model | |
---|---|
target | string Property we want to track. |
extremum | string Defines the direction of optimization. |
targetValue | float The value of the property we want to track. |
Example |
{ "target": "TotalPerformance.PortfolioStatistics.SharpeRatio", "extremum": "max or min", "targetValue": 1 } |
401 Authentication Error
UnauthorizedError Model - Unauthorized response from the API. Key is missing, invalid, or timestamp is too old for hash. | |
---|---|
www_authenticate | string Header |
Examples
The following example demonstates creating, reading, updating, deleting, aborting and listing backtests of a project through the cloud API.
from base64 import b64encode from hashlib import sha256 from time import time from requests import get, post BASE_URL = 'https://www.quantconnect.com/api/v2/' # You need to replace these with your actual credentials. # You can request your credentials at https://www.quantconnect.com/settings/ # You can find our organization ID at https://www.quantconnect.com/organization/ USER_ID = 0 API_TOKEN = '____' ORGANIZATION_ID = '____' def get_headers(): # Get timestamp timestamp = f'{int(time())}' time_stamped_token = f'{API_TOKEN}:{timestamp}'.encode('utf-8') # Get hased API token hashed_token = sha256(time_stamped_token).hexdigest() authentication = f'{USER_ID}:{hashed_token}'.encode('utf-8') authentication = b64encode(authentication).decode('ascii') # Create headers dictionary. return { 'Authorization': f'Basic {authentication}', 'Timestamp': timestamp } # Authenticate to verify credentials response = post(f'{BASE_URL}/authenticate', headers = get_headers()) print(response.json()) # -------------------- # The project ID of the project to manage an optimization job project_id = 12345678 ### Estimate Optimization Cost # Send a POST request to the /optimizations/estimate endpoint to estimate cost response = post(f'{BASE_URL}/optimizations/estimate', headers=get_headers(), json={ "projectId": project_id, # ID of the project "name": f"Optimization_{compileId[:5]}", # Name of the optimization (using compile ID prefix) "target": "TotalPerformance.PortfolioStatistics.SharpeRatio", # Optimization target metric "targetTo": "max", # Direction to optimize (maximize) "targetValue": None, # Specific target value (None for max/min) "strategy": "QuantConnect.Optimizer.Strategies.GridSearchOptimizationStrategy", # Optimization strategy "compileId": compile_id, # Compilation ID for the optimization "parameters[0][key]": "ema_fast", # First parameter key "parameters[0][min]": 100, # Minimum value for first parameter "parameters[0][max]": 200, # Maximum value for first parameter "parameters[0][step]": 50, # Step size for first parameter "parameters[1][key]": "ema_slow", # Second parameter key "parameters[1][min]": 200, # Minimum value for second parameter "parameters[1][max]": 300, # Maximum value for second parameter "parameters[1][step]": 50, # Step size for second parameter "constraints": [{ # Constraints for the optimization "target": "TotalPerformance.PortfolioStatistics.SharpeRatio", "operator": "greater", "target-value": 1 }] }) # Parse the JSON response into python managable dict result = response.json() # Check if the request was successful and print the estimated cost if result['success']: print("Optimization Cost Estimated Successfully:") print(result) ### Create Optimization # Send a POST request to the /optimizations/create endpoint to create an optimization response = post(f'{BASE_URL}/optimizations/create', headers=get_headers(), json={ "projectId": project_id, # ID of the project "name": f"Optimization_{compileId[:5]}", # Name of the optimization "target": "TotalPerformance.PortfolioStatistics.SharpeRatio", # Optimization target "targetTo": "max", # Direction to optimize "targetValue": None, # Specific target value "strategy": "QuantConnect.Optimizer.Strategies.GridSearchOptimizationStrategy", # Strategy "compileId": compile_id, # Compilation ID "parameters[0][key]": "ema_fast", # First parameter key "parameters[0][min]": 100, # Minimum value "parameters[0][max]": 200, # Maximum value "parameters[0][step]": 50, # Step size "parameters[1][key]": "ema_slow", # Second parameter key "parameters[1][min]": 200, # Minimum value "parameters[1][max]": 300, # Maximum value "parameters[1][step]": 50, # Step size "constraints": [{ # Constraints "target": "TotalPerformance.PortfolioStatistics.SharpeRatio", "operator": "greater", "target-value": 1 }], "estimatedCost": 10, # Estimated cost of optimization "nodeType": "O2-8", # Node type for optimization "parallelNodes": 4 # Number of parallel nodes }) # Parse the JSON response into python managable dict result = response.json() # Extract the optimization ID from the response optimization_id = result['optimizations'][0]['optimizationId'] # Check if the request was successful and print the result if result['success']: print("Optimization Created Successfully:") print(result) ### Update Optimization # Send a POST request to the /optimizations/update endpoint to update the optimization response = post(f'{BASE_URL}/optimizations/update', headers=get_headers(), json={ "optimizationId": optimization_id, # ID of the optimization to update "name": f"Optimization_{optimizationId[:5]}" # New name for the optimization }) # Parse the JSON response into python managable dict result = response.json() # Check if the request was successful and print the result if result['success']: print("Optimization Updated Successfully:") print(result) ### Read Optimization # Prepare data payload to read optimization details payload = { "optimizationId": optimization_id # ID of the optimization to read } # Send a POST request to the /optimizations/read endpoint to get details response = post(f'{BASE_URL}/optimizations/read', headers=get_headers(), json=payload) # Parse the JSON response into python managable dict result = response.json() # Check if the request was successful and print the details if result['success']: print("Optimization Details:") print(result) ### Abort Optimization # Prepare data payload to abort the optimization payload = { "optimizationId": optimization_id # ID of the optimization to abort } # Send a POST request to the /optimizations/abort endpoint to abort response = post(f'{BASE_URL}/optimizations/abort', headers=get_headers(), json=payload) # Parse the JSON response into python managable dict result = response.json() # Check if the request was successful and print the result if result['success']: print("Optimization Aborted Successfully:") print(result) ### Delete Optimization # Prepare data payload to delete the optimization payload = { "optimizationId": optimization_id # ID of the optimization to delete } # Send a POST request to the /optimizations/delete endpoint to delete response = post(f'{BASE_URL}/optimizations/delete', headers=get_headers(), json=payload) # Parse the JSON response into python managable dict result = response.json() # Check if the request was successful and print the result if result['success']: print("Optimization Deleted Successfully:") print(result) ### List Optimizations # Prepare data payload to list optimizations payload = { "projectId": project_id # ID of the project } # Send a POST request to the /optimizations/list endpoint to list optimizations response = post(f'{BASE_URL}/optimizations/list', headers=get_headers(), json=payload) # Parse the JSON response into python managable dict result = response.json() # Check if the request was successful and print the list if result['success']: print("List of Optimizations:") print(result)