Market Configurations#
The market configuration allows an extensive configuration of multiple bidding options.
A full list of configurations and explanation of the assume.common.market_objects.MarketConfig()
is given here.
market config item
description
market_id
string name
product_type
energy or capacity or heat
market_products
list of available products to be traded
opening_hours
recurrence rule of openings
opening_duration
time delta
market mechanism
name of method used for clearing
maximum_bid_price
max allowed bidding price
minimum_bid_price
min allowed bidding price
maximum_bid_volume
the largest valid volume for a single bid
additional_fields
list of additional fields to base bid
volume_tick
step increments of volume
price_tick
step increments of price
volume_unit
string for visualization of volume
price_unit
string for visualization of price
supports_get_unmatched
boolean
maximum_gradient
max allowed change between bids
eligible_obligations_lambda
function checking if agent is allowed to trade here
param_dict
additional dict with params for grid and other configs
Here, a description of all options and the usage is given.
The opening_hours is a recurrence rule which defines when the market is open. The opening_duration is a timedelta which defines how long the market is open. This can be used to leave time for negotiation in the agents. The market_mechanism is the name of the clearing method used for this market, and is mapped to the actual clearing_function in the initialization. The minimum_bid_price, maximum_bid_price and maximum_bid_volume are constraints for bids. All Bids of the sent orderbook are rejected and not considered for clearing if one or more are not in these bounds. An agent receives a “Rejected” message if this is the case. The additional_fields is a list of additional fields which are used to base the bid on. The price_tick and volume_tick is the step increment of volume, which ensures that only integers are used for calculation. The price_unit and volume_unit are strings for visualization of price. The supports_get_unmatched is a boolean which defines if the market supports the handle_get_unmatched method, which allows agents to look into the current market orderbook, as it is the case, mostly on continuous markets. The maximum_gradient is the maximum allowed change between bids from one hour to the next one - only relevant if the count of market products is greater than 1.
Most important, the market_products are a list of MarketProduct objects.
MarketProduct#
Each assume.common.market_objects.MarketProduct()
contains the three information:
duration (a relative timedelta or recurrency rule)
count (how many consecutive products are available for trading)
first_delivery (a relative timedelta of the first delivery in relation to market start)
only_hours (tuple of hours from which this product is available, on multi day products)
For example, if the duration is 1 hour, the count is 4 and first_delivery is 2 hours, then a market which opens at 12:00 will have the following products:
14:00 - 15:00
15:00 - 16:00
16:00 - 17:00
17:00 - 18:00
It then makes sense to reschedule the market clearing all 4 hours, but it would also be possible to schedule the same clearing interval an hour later too, which would look like this:
gantt title Market Schedule Simple count 4 dateFormat YYY-MM-DD HH:mm axisFormat %H:%M section First Bidding00 EOM :a1, 2019-01-01 12:00, 1h Delivery01 EOM :2019-01-01 14:00, 1h Delivery02 EOM :2019-01-01 15:00, 1h Delivery03 EOM :2019-01-01 16:00, 1h Delivery04 EOM :2019-01-01 17:00, 1h section Second Bidding10 EOM :a2, 2019-01-01 13:00, 1h Delivery11 EOM :2019-01-01 15:00, 1h Delivery12 EOM :2019-01-01 16:00, 1h Delivery13 EOM :2019-01-01 17:00, 1h Delivery14 EOM :2019-01-01 18:00, 1h
Please note, Trade Convention#
In our market trading system, we follow this convention for representing the volume and price of trades in any market:
- Volume Representation:
The sign of the volume indicates the direction of the trade:
Positive Volume: Indicates that the volume is being sold to the market.
Negative Volume: Indicates that the volume is being bought from the market.
Price Representation: - The price of a trade can be negative and positive. - The price does not change based on the direction of the trade (Providing energy/power or procurring energy/power) but potentially the financial flow. - Positive Volume and Positive Price: Indicates that electricity is sold to the market, and money is received for it. - Positive Volume and Negative Price: Indicates that electricity is sold to the market, but money has to be paid for it. - Negative Volume and Positive Price: Indicates that electricity is bought from the market, and money is paid for it. - Negative Volume and Negative Price: Indicates that electricity is bought from the market, and money is received for it.
This convention ensures clarity and consistency in how trades are represented and interpreted within the market. By using positive and negative volumes to indicate the direction of trades, we can easily distinguish between buying and selling activities while maintaining a straightforward and unambiguous pricing structure.
Example Configuration - CRM Market#
An example of a EOM and CRM market is shown here. It is possible to trade at the EOM and sell positive capacity on the CRM too:
markets_config:
EOM:
operator: EOM_operator
product_type: energy
start_date: 2019-01-01 01:00
products:
- duration: 1h
count: 1
first_delivery: 1h
opening_frequency: 1h
opening_duration: 1h
market_mechanism: pay_as_clear
CRM_pos:
operator: CRM_operator
product_type: capacity_pos
start_date: 2019-01-01 00:00
products:
- duration: 4h
count: 1
first_delivery: 2h
opening_frequency: 4h
opening_duration: 30m
market_mechanism: pay_as_bid
Due to the configuration of the market opening frequency and duration, the timetable for the opening and closing of the markets, as well as the delivery periods are shown below
gantt title Market Schedule dateFormat YYY-MM-DD HH:mm axisFormat %H:%M section EOM Bidding01 EOM :a1, 2019-01-01 01:00, 1h Delivery01 EOM :2019-01-01 01:00, 1h Bidding02 EOM :a2, 2019-01-01 02:00, 1h Delivery02 EOM :2019-01-01 02:00, 1h Bidding03 EOM :a3, 2019-01-01 03:00, 1h Delivery03 EOM :2019-01-01 03:00, 1h Bidding04 EOM :a4, 2019-01-01 04:00, 1h Delivery04 EOM :2019-01-01 04:00, 1h section CRM Bidding CRM :crm01, 2019-01-01 00:00, 30m Delivery CRM :crm02, 2019-01-01 01:00, 4h Bidding CRM :crm03, 2019-01-01 04:00, 30m Delivery CRM :crm04, 2019-01-01 05:00, 4h