book
Checkout our new book! Hands on AI Trading with Python, QuantConnect, and AWS Learn More arrow

Optimization Management

Read Optimization

Introduction

Read an optimization.

Request

Optimization ID for the optimization we want to read. The /optimizations/read API accepts requests in the following format:

ReadOptimizationRequest Model - Request to read a optimization from a project.
optimizationId string
required
example: O-401d3d40b5a0e9f8c46c954a303f3ddd

Optimization ID for the optimization we want to read.
Example
{
  "optimizationId": "O-401d3d40b5a0e9f8c46c954a303f3ddd"
}

Responses

The /optimizations/read API provides a response in the following format:

200 Success

ReadOptimizationResponse Model - Response received when reading an optimization.
optimization Optimization object
Response received when launching an optimization job.
success boolean
Indicate if the API request was successful.
errors string Array
List of errors with the API call.
Example
{
  "optimization": {
    "optimizationId": "O-401d3d40b5a0e9f8c46c954a303f3ddd",
    "snapshotId": "string",
    "projectId": 23456789,
    "name": "string",
    "status": "New",
    "nodeType": "O2-8",
    "parallelNodes": 4,
    "criterion": {
      "target": "TotalPerformance.PortfolioStatistics.SharpeRatio",
      "extremum": "max or min",
      "targetValue": 1
    },
    "runtimeStatistics": "string",
    "constraints": [
      {
        "target": "TotalPerformance.PortfolioStatistics.SharpeRatio",
        "operator": "greater",
        "targetValue": 1
      }
    ],
    "parameters": [
      {
        "name": "rsi_period",
        "min": 10,
        "max": 20,
        "step": 1,
        "minStep": 1
      }
    ],
    "backtests": ,
    "strategy": "QuantConnect.Optimizer.Strategies.GridSearchOptimizationStrategy",
    "requested": "2021-11-26T15:18:27.693Z",
    "optimizationTarget": "string",
    "gridLayout": [
      "object"
    ],
    "outOfSampleMaxEndDate": "string",
    "outOfSampleDays": 0
  },
  "success": true,
  "errors": [
    "string"
  ]
}
Optimization Model - Response received when launching an optimization job.
optimizationId string
example: O-401d3d40b5a0e9f8c46c954a303f3ddd

Optimization ID.
snapshotId string
Snapshot iD of this optimization.
projectId string
required
example: 23456789

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
example: O2-8

Optimization node type. Options : ['O2-8', 'O4-12', 'O8-16']
parallelNodes integer
example: 4

Number of parallel nodes for optimization.
criterion OptimizationTarget object
/.
runtimeStatistics string object
Dictionary representing a runtime banner/updating statistics for the optimization.
constraints OptimizationConstraint Array
Optimization constraints.
parameters OptimizationParameter Array
Optimization parameters.
backtests object
Dictionary of optimization backtests.
strategy string
example: QuantConnect.Optimizer.Strategies.GridSearchOptimizationStrategy

Optimization strategy.
requested string($date-time)
Optimization requested date and time.
optimizationTarget string
Statistic to be optimized.
gridLayout object Array
List with grid charts representing the grid layout.
outOfSampleMaxEndDate string
End date of out of sample data.
outOfSampleDays integer
Number of days of out of sample days.
Example
{
  "optimizationId": "O-401d3d40b5a0e9f8c46c954a303f3ddd",
  "snapshotId": "string",
  "projectId": 23456789,
  "name": "string",
  "status": "New",
  "nodeType": "O2-8",
  "parallelNodes": 4,
  "criterion": {
    "target": "TotalPerformance.PortfolioStatistics.SharpeRatio",
    "extremum": "max or min",
    "targetValue": 1
  },
  "runtimeStatistics": "string",
  "constraints": [
    {
      "target": "TotalPerformance.PortfolioStatistics.SharpeRatio",
      "operator": "greater",
      "targetValue": 1
    }
  ],
  "parameters": [
    {
      "name": "rsi_period",
      "min": 10,
      "max": 20,
      "step": 1,
      "minStep": 1
    }
  ],
  "backtests": ,
  "strategy": "QuantConnect.Optimizer.Strategies.GridSearchOptimizationStrategy",
  "requested": "2021-11-26T15:18:27.693Z",
  "optimizationTarget": "string",
  "gridLayout": [
    "object"
  ],
  "outOfSampleMaxEndDate": "string",
  "outOfSampleDays": 0
}
OptimizationTarget Model
target string
example: TotalPerformance.PortfolioStatistics.SharpeRatio

Property we want to track.
extremum string
example: max or min

Defines the direction of optimization.
targetValue float
example: 1

The value of the property we want to track.
Example
{
  "target": "TotalPerformance.PortfolioStatistics.SharpeRatio",
  "extremum": "max or min",
  "targetValue": 1
}
OptimizationConstraint Model
target string
example: TotalPerformance.PortfolioStatistics.SharpeRatio

Property we want to track.
operator string
example: greater

The target comparison operation.
targetValue float
example: 1

The value of the property we want to track.
Example
{
  "target": "TotalPerformance.PortfolioStatistics.SharpeRatio",
  "operator": "greater",
  "targetValue": 1
}
OptimizationParameter Model
name string
example: rsi_period

Name of optimization parameter.
min float
example: 10

Minimum value of optimization parameter, applicable for boundary conditions.
max float
example: 20

Maximum value of optimization parameter, applicable for boundary conditions.
step float
example: 1

Movement, should be positive.
minStep float
example: 1

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
}

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)

You can also see our Videos. You can also get in touch with us via Discord.

Did you find this page helpful?

Contribute to the documentation: