Skip to content

flūmine


flumine is an open-source, event-based trading framework for sports betting, designed to simplify the development and execution of betting strategies on betting exchanges. flumine provides efficient handling of data streams, risk management, and execution capabilities.

join betcode slack group (2k+ members!)

Tested on Python 3.8, 3.9, 3.10, 3.11 and 3.12.

installation

$ pip install flumine

flumine requires Python 3.8+

setup

Get started...

import betfairlightweight
from flumine import Flumine, clients

trading = betfairlightweight.APIClient("username")
client = clients.BetfairClient(trading)

framework = Flumine(
    client=client,
)

Example strategy:

from flumine import BaseStrategy
from flumine.order.trade import Trade
from flumine.order.order import LimitOrder, OrderStatus
from flumine.markets.market import Market
from betfairlightweight.filters import streaming_market_filter
from betfairlightweight.resources import MarketBook


class ExampleStrategy(BaseStrategy):
    def start(self, flumine) -> None:
        print("starting strategy 'ExampleStrategy'")

    def check_market_book(self, market: Market, market_book: MarketBook) -> bool:
        # process_market_book only executed if this returns True
        if market_book.status != "CLOSED":
            return True

    def process_market_book(self, market: Market, market_book: MarketBook) -> None:
        # process marketBook object
        for runner in market_book.runners:
            if runner.status == "ACTIVE" and runner.last_price_traded < 1.5:
                trade = Trade(
                    market_id=market_book.market_id,
                    selection_id=runner.selection_id,
                    handicap=runner.handicap,
                    strategy=self,
                )
                order = trade.create_order(
                    side="LAY", order_type=LimitOrder(price=1.01, size=2.00)
                )
                market.place_order(order)

    def process_orders(self, market: Market, orders: list) -> None:
        for order in orders:
            if order.status == OrderStatus.EXECUTABLE:
                if order.size_remaining == 2.00:
                    market.cancel_order(order, 0.02)  # reduce size to 1.98
                if order.order_type.persistence_type == "LAPSE":
                    market.update_order(order, "PERSIST")
                if order.size_remaining > 0:
                    market.replace_order(order, 1.02)  # move


# Add your strategy to the framework
framework.add_strategy(
    ExampleStrategy(
        market_filter=streaming_market_filter(
            event_type_ids=["7"],
            country_codes=["GB"],
            market_types=["WIN"],
        )
    )
)

# Start the trading framework
framework.run()

Danger

By default flumine will try to prevent coding errors which result in flash crashes and burnt fingers but use at your own risk as per the MIT license.

Recommendation is not to remove the trading controls and carry out extensive testing before executing on live markets, even then only use new strategies on an account with a small balance (transfer balance to games wallet).

Features

  • Streaming
  • Multiple strategies
  • Order execution
  • Paper trading
  • Simulation
  • Event simulation (multi market)
  • Middleware and background workers to enable Scores / RaceCard / InPlayService

Dependencies

flumine relies on these libraries:

  • betfairlightweight - Betfair API support
  • tenacity - Used for connection retrying (streaming)
  • python-json-logger - JSON logging
  • requests - HTTP support