API request failed: Unrecognized parameter startDt

I cant get rid of this error: API request failed: Unrecognized parameter "startDt"

I have run the !pip install --upgrade p123api # Install p123api if missing



try:
    client = p123api.Client(api_id='XXX', api_key='XXX')  # Your ID and Key

    rankings = [
        "Optimize System - Copy(2078)190424udob300n-40-48",
        "Optimize System - Copy(2078)190424udob300n-40-47",
        "Optimize System - Copy(2078)190424udob300n-40-46",
    ]  # Liste med dine rankingsystemer

    for ranking in rankings:
        result = client.screen_backtest(
            {
                'screen': {
                    'type': 'stock',  # Stock or ETF
                    'universe': '1. Pareto - US CANADA volumfilter',
                    'maxNumHoldings': 25,  # 0 for all
                    'method': 'long',  # long, short, long/short, hedged
                    'currency': 'USD',  # USD, CAD, CHF, EUR, GBP, NOK, PLN, SEK, TRY
                    'benchmark': 'iwm',
                    'ranking': ranking,
                    'startDt': "2021-01-01",  # Bruker 'StartDt'
                    'EndDt': "2021-06-30",    # Bruker 'EndDt'
                    'pitMethod': 'Prelim',  # Prelim eller Complete
                    'precision': 2,  # 2, 3, 4
                    'transPrice': 3,  # 1 - Next Open, 4 - Next Close, 3 - Next Average of Hi and Low
                    'slippage': 0.25,
                    'longWeight': 100,
                    'rankTolerance': 5,
                    'rebalFreq': 'Every Week',  # Every Week, Every Month
                    'riskStatsPeriod': "Monthly"  # Monthly, Weekly, Daily
                }
            })
        print(f"Ranking: {ranking}\nResult: {result}\n")
except p123api.ClientException as e:
    print(e)

You're mixing the screen definition parameters with the backtest specific ones. You just need to take some of them (like startDt, endDt, slippage, etc) out of the screen object.
Check out the screen backtest section of our API Wrapper KB here:

Thank you!! That worked.

This was the final code:

import pandas as pd

try:
    client = p123api.Client(api_id='XXX', api_key='XXX')  # Your ID and Key

    rankings = [
        "Optimize System - Copy(2078)190424udob300n-40-48",
        "Optimize System - Copy(2078)190424udob300n-40-47",
        "Optimize System - Copy(2078)190424udob300n-40-46",
        "Optimize System - Copy(2078)190424udob300n-40-45",
        "Optimize System - Copy(2078)190424udob300n-40-44",
        "Optimize System - Copy(2078)190424udob300n-40-43",
        "Optimize System - Copy(2078)190424udob300n-40-42",
        "Optimize System - Copy(2078)190424udob300n-40-41",
        "Optimize System - Copy(2078)190424udob300n-40-40",
        "Optimize System - Copy(2078)190424udob300n-40-39",
        "Optimize System - Copy(2078)190424udob300n-40-38",
        "Optimize System - Copy(2078)190424udob300n-40-37",
        "Optimize System - Copy(2078)190424udob300n-40-36",
        "Optimize System - Copy(2078)190424udob300n-40-35",
        "Optimize System - Copy(2078)190424udob300n-40-34",
        "Optimize System - Copy(2078)190424udob300n-40-33",
        "Optimize System - Copy(2078)190424udob300n-40-32",
        "Optimize System - Copy(2078)190424udob300n-40-31",
        "Optimize System - Copy(2078)190424udob300n-40-30",
        "Optimize System - Copy(2078)190424udob300n-40-29",
        "Optimize System - Copy(2078)190424udob300n-40-28",
        "Optimize System - Copy(2078)190424udob300n-40-27"
    ]  # Liste med dine rankingsystemer

    all_stats = []

    for ranking in rankings:
        result = client.screen_backtest(
            {
                'startDt': "2010-01-01",
                'endDt': "2024-05-30",
                'pitMethod': 'Prelim',  # Prelim or Complete
                'precision': 2,  # 2, 3, 4
                'transPrice': 3,  # 1 - Next Open, 4 - Next Close, 3 - Next Average of Hi and Low
                'slippage': 0.25,
                'longWeight': 100,
                'rankTolerance': 5,
                'rebalFreq': 'Every Week',  # Every Week, Every Month
                'riskStatsPeriod': "Monthly",  # Monthly, Weekly, Daily
                'screen': {
                    'type': 'stock',  # Stock or ETF
                    'universe': '1. Pareto - US CANADA volumfilter',
                    'maxNumHoldings': 25,  # 0 for all
                    'method': 'long',  # long, short, long/short, hedged
                    'currency': 'USD',  # USD, CAD, CHF, EUR, GBP, NOK, PLN, SEK, TRY
                    'benchmark': 'iwm',
                    'ranking': ranking,
                    'rules': []
                }
            })

        stats = result['stats']

        # Flatten the nested dictionary for easier display in a single row
        flattened_stats = {'Ranking': ranking}
        for key, value in stats.items():
            if isinstance(value, dict):
                for sub_key, sub_value in value.items():
                    flattened_stats[f"{key}_{sub_key}"] = sub_value
            else:
                flattened_stats[key] = value

        all_stats.append(flattened_stats)

    df = pd.DataFrame(all_stats)
    print(df.to_string(index=False))

except p123api.ClientException as e:
    print(e)