Price Series¶
The price series are divided into two groups: main and secondary price series. The structure is the same for both objects and
accepts a Txy with the prices and an optional list of doubles describing the probabilities.
The API accepts a single main price series and a list of secondary price series. Due to a restriction in the
JSON serialization library (which is hopefully resolved soon), the main price series must be provided as a vector with one element.
Input¶
The attributes for both main and secondary price series are:
series (Txy): The prices as time series data.
probabilities (std::optional<std::vector<double>>): An optional vector of probabilities associated with the price series.
Additionally for a Main price series, it is possible to provide a vector of percentiles for the water value calculations. This vector will include 0 and 100 by default in addition to the provided user values. The number of provided percentiles (together with 0 and 100) will be reflected as the second dimension of the water value matrix.
the API accepts the series in the following way:
"price_series_main": [
{
"name": <string>
"series": <TXY>
"probabilities": <Optional<number[]>>
"percentiles_for_water_values": <number[]> // Optional
}
] // list of one and only one element
"price_series_secondary": [
{
"name": <string>
"series": <TXY>
"probabilities": <Optional<number[]>>
},
{
"name": <string>
"series": <TXY>
"probabilities": <Optional<number[]>>
}
]
The series attribute is a Txy. The number of scenarios must match the number of historical years in the simulation. Further each scenario may also contain a list of price scenarios. The structure of the Series Txy will then be:
"series": {
"name": <string>,
"timestamps": [<timestamps>]
"scenarios": [
[1.0, 2.0, ... <number of price scenarios>],
[4.4, 5.5, ... <number of price scenarios>],
...,
<number of inflow scenarios>
]
}
The probabilities are optional, and can be provided as a list of doubles. The max number of probabilities are 16, and if less than 16 probabilities are provided, the remaining probabilites will be zeros.
"probabilities": [0.1, 0.2, 0.3, 0.4]
Model type¶
The global settings attribute model type (EMPS or EOPS) will influence both the allowed input and the output.
For a model type, one and only one main price series is allowed, and a list of secondary price series.
For an EOPS model type, only one main price series is allowed (no secondary price series).
If the EOPS model type is chosen, the API will use a flex script to convert the exogenous_prices.h5 into a corresponding .csv file.
Output¶
The price series will be written to exogenous_prices.h5. The probabilites will also be written to exogenous_prices.h5 under the PSANN attribute.
Additionally, a reference to the main price series will be written to all .enmd files as group 17.
If the simulation type is EOPS, the exogenous_prices.h5 will be automatically converted to .csv files.
Connecting Market Steps¶
To connect a Market Step with the price series, a category 12, or 13 market step must be used.
According to Table 2b from utkast_nye_applikasjoner_i_LTM_versjon_10.pdf (a copy provided below),
a category 12 or 13 market step will not have a price.
The model interprets a market step without price as a category 12, or 13,
and will convert it to the correct step based on the sign of the prices (positive prices will be 23, and negative prices will be 13)
Copy of Tabell 2b from utkast_nye_applikasjoner_i_LTM_versjon_10.pdf¶
Navn |
Kjøp referert tidsserie |
Salg referert tidsserie |
Fra spotmarked (eksogen prisrekke) |
Til spotmarked (eksogen prisrekke) |
Gjenkjøp referert tidsserie |
|---|---|---|---|---|---|
Kategori nummer |
10 |
11 |
12 |
13 |
14 |
Denne nye API-type kontrakt, erstatter følgende gamle type kontrakter |
1, 3, 8 |
2, 9 |
6 |
7 |
4 |
Trinnummer |
B |
B |
B |
B |
B |
Trinnavn |
B |
B |
B |
B |
B |
Eget system |
M |
M |
M |
M |
M |
Referanse til fast kontrakt |
B |
||||
Tilgjengelighet (%) |
B |
||||
Referanse til eksogen prisrekke |
B |
B |
|||
Mengde (%) |
B |
||||
Mengde (GWh) |
B |
B |
B |
B |
|
Mengde v.v.ber (GWh) |
M |
M |
|||
Pris (Valuta/enhet) |
B |
B |
B |
Market Steps¶
The exogenous prices market step functionality allows market steps in EMPS to use externally defined price series. This feature is only available in EMPS.
If a market step does not specify a fixed price directly, it is assumed to use the exogenous price functionality. In this case, the price is calculated dynamically as a combination of the main price series, an optional secondary price series, and a constant, using the following formula:
Price(t) = a * X(t) + b * Y(t) + c
Where:
X(t)is the main price series, shared across the entire model.Y(t)is the secondary price series.a,b, andcare scalar coefficients.
There is only one main price series, which is globally defined and implicitly available to all market steps. Multiple secondary price series may be defined, but each market step may reference only one of them.
Configuration Options¶
There are two supported methods for associating an exogenous price with a market step:
1. Direct Input of a 2D TXY Time Series¶
A secondary price series can be provided directly within the market step definition as a 2D TXY time series, where values depend on time and scenario.
This method does not support custom coefficients. Instead, the default values
a = 0, b = 1, and c = 0 are applied. As a result, the market step price will
exactly follow the specified secondary price series, without reference to the main
price series.
Example:
{
"market_steps": [
{
"name": "ms1",
"exogenous_price": {
"name": "price_ms1",
"timestamps": [],
"scenarios": [[]]
}
}
]
}
2. Weighted Combination of Price Series¶
Alternatively, a market step may reference an existing secondary price series by name
and define coefficients a, b, and c. This configuration enables a flexible
weighted combination of the main price series and the referenced secondary price
series.
If no coefficients are provided, the default values a = 0, b = 1, and c = 0
are applied — equivalent to using the secondary price series directly.
Example:
{
"market_steps": [
{
"name": "ms1",
"secondary_price_series_name": "spot_forecast_2025",
"price_series_coefficients": {
"a": 0.5,
"b": 0.2,
"c": 1.8
}
}
]
}
Implementation Notes¶
Each market step must either define an inline
exogenous_priceor reference a namedsecondary_price_series_name.Only one secondary price series can be connected to each market step.
The main price series is implicitly available and does not require a connection.
If neither a direct price nor an exogenous price definition is provided, the market step configuration is considered invalid.
Generated Output¶
When using the exogenous price functionality:
The market steps are assigned to categories
ENMD.prefeansetrinn12 and 13.Energy volume time series are stored in:
TidsserieData.h5.Price time series are stored in:
exogenous_prices.h5.