portfolio

package
v0.0.0-...-2a4c2d2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 12, 2024 License: MIT Imports: 23 Imported by: 14

README

GoCryptoTrader Backtester: Portfolio package

Build Status Software License GoDoc Coverage Status Go Report Card

This portfolio package is part of the GoCryptoTrader codebase.

This is still in active development

You can track ideas, planned features and what's in progress on our GoCryptoTrader Kanban board.

Join our slack to discuss all things related to GoCryptoTrader! GoCryptoTrader Slack

Portfolio package overview

The portfolio is one of the most critical packages in the GoCryptoTrader Backtester. It is responsible for making sure that all orders, simulated or otherwise are within all defined risk and sizing rules defined in the config. The portfolio receives three kinds of events to be processed: OnSignal, OnFill and Update

The following steps are taken for the OnSignal function:

  • Retrieve previous iteration's holdings data
  • If a buy order signal is received, ensure there are enough funds
  • If a sell order signal is received, ensure there are any holdings to sell
  • If any other direction, return
  • The portfolio manager will then size the order according to the exchange asset currency pair's settings along with the portfolio manager's own sizing rules
    • In the event that the order is to large, the sizing package will reduce the order until it fits that limit, inclusive of fees.
    • When an order is sized under the limits, an order event cannot be raised an no order will be submitted by the exchange
    • The portfolio manager's sizing rules override any CurrencySettings' rules if the sizing is outside the portfolio manager's
  • The portfolio manager will then assess the risk of the order, it will compare existing holdings and ensures that if an order is placed, it will not go beyond risk rules as defined in the config
  • If the risk is too high, the order signal will be changed to CouldNotBuy, CouldNotSell or DoNothing
  • If the order is deemed appropriate, the order event will be returned and appended to the event queue for the exchange event handler to run and place the order

The following steps are taken for the OnFill function:

  • Previous holdings are retrieved and amended with new order information.
    • The stats for the exchange asset currency pair will be updated to reflect the order and pricing
  • The order will be added to the compliance manager for analysis in future events or the statistics package

The following steps are taken for the Update function:

  • The Update function is called when orders are not placed, this allows for the portfolio manager to still keep track of pricing and holding statistics, while not needing to process any orders
Please click GoDocs chevron above to view current GoDoc information for this package

Contribution

Please feel free to submit any pull requests or suggest any desired features to be added.

When submitting a PR, please abide by our coding guidelines:

  • Code must adhere to the official Go formatting guidelines (i.e. uses gofmt).
  • Code must be documented adhering to the official Go commentary guidelines.
  • Code must adhere to our coding style.
  • Pull requests need to be based on and opened against the master branch.

Donations

If this framework helped you in any way, or you would like to support the developers working on it, please donate Bitcoin to:

bc1qk0jareu4jytc0cfrhr5wgshsq8282awpavfahc

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type BasicPNLResult

type BasicPNLResult struct {
	Currency currency.Code
	Time     time.Time
	PNL      decimal.Decimal
}

BasicPNLResult holds the time and the pnl of a position

type Handler

type Handler interface {
	OnSignal(signal.Event, *exchange.Settings, funding.IFundReserver) (*order.Order, error)
	OnFill(fill.Event, funding.IFundReleaser) (fill.Event, error)
	GetLatestOrderSnapshotForEvent(common.Event) (compliance.Snapshot, error)
	GetLatestOrderSnapshots() ([]compliance.Snapshot, error)
	ViewHoldingAtTimePeriod(common.Event) (*holdings.Holding, error)
	SetHoldingsForTimestamp(*holdings.Holding) error
	UpdateHoldings(data.Event, funding.IFundReleaser) error
	GetPositions(common.Event) ([]futures.Position, error)
	TrackFuturesOrder(fill.Event, funding.IFundReleaser) (*PNLSummary, error)
	UpdatePNL(common.Event, decimal.Decimal) error
	GetLatestPNLForEvent(common.Event) (*PNLSummary, error)
	CheckLiquidationStatus(data.Event, funding.ICollateralReader, *PNLSummary) error
	CreateLiquidationOrdersForExchange(data.Event, funding.IFundingManager) ([]order.Event, error)
	GetLatestHoldingsForAllCurrencies() []holdings.Holding
	Reset() error
	SetHoldingsForEvent(funding.IFundReader, common.Event) error
	GetLatestComplianceSnapshot(string, asset.Item, currency.Pair) (*compliance.Snapshot, error)
}

Handler contains all functions expected to operate a portfolio manager

type IPNL

type IPNL interface {
	GetUnrealisedPNL() BasicPNLResult
	GetRealisedPNL() BasicPNLResult
	GetCollateralCurrency() currency.Code
	GetDirection() gctorder.Side
	GetPositionStatus() gctorder.Status
}

IPNL defines an interface for an implementation to retrieve PNL from a position

type PNLSummary

type PNLSummary struct {
	Exchange           string
	Asset              asset.Item
	Pair               currency.Pair
	CollateralCurrency currency.Code
	Offset             int64
	Result             futures.PNLResult
}

PNLSummary holds a PNL result along with exchange details

func (*PNLSummary) GetCollateralCurrency

func (p *PNLSummary) GetCollateralCurrency() currency.Code

GetCollateralCurrency returns the collateral currency

func (*PNLSummary) GetDirection

func (p *PNLSummary) GetDirection() gctorder.Side

GetDirection returns the direction

func (*PNLSummary) GetExposure

func (p *PNLSummary) GetExposure() decimal.Decimal

GetExposure returns the position exposure

func (*PNLSummary) GetPositionStatus

func (p *PNLSummary) GetPositionStatus() gctorder.Status

GetPositionStatus returns the position status

func (*PNLSummary) GetRealisedPNL

func (p *PNLSummary) GetRealisedPNL() BasicPNLResult

GetRealisedPNL returns a basic struct containing realised PNL

func (*PNLSummary) GetUnrealisedPNL

func (p *PNLSummary) GetUnrealisedPNL() BasicPNLResult

GetUnrealisedPNL returns a basic struct containing unrealised PNL

type Portfolio

type Portfolio struct {
	// contains filtered or unexported fields
}

Portfolio stores all holdings and rules to assess orders, allowing the portfolio manager to modify, accept or reject strategy signals

func Setup

func Setup(sh SizeHandler, r risk.Handler, riskFreeRate decimal.Decimal) (*Portfolio, error)

Setup creates a portfolio manager instance and sets private fields

func (*Portfolio) CheckLiquidationStatus

func (p *Portfolio) CheckLiquidationStatus(ev data.Event, collateralReader funding.ICollateralReader, pnl *PNLSummary) error

CheckLiquidationStatus checks funding against position and liquidates and removes funding if position unable to continue

func (*Portfolio) CreateLiquidationOrdersForExchange

func (p *Portfolio) CreateLiquidationOrdersForExchange(ev data.Event, funds funding.IFundingManager) ([]order.Event, error)

CreateLiquidationOrdersForExchange creates liquidation orders, for any that exist on the same exchange where a liquidation is occurring

func (*Portfolio) GetLatestComplianceSnapshot

func (p *Portfolio) GetLatestComplianceSnapshot(exchangeName string, a asset.Item, cp currency.Pair) (*compliance.Snapshot, error)

GetLatestComplianceSnapshot returns the latest compliance snapshot for a given exchange, asset, pair

func (*Portfolio) GetLatestHoldingsForAllCurrencies

func (p *Portfolio) GetLatestHoldingsForAllCurrencies() []holdings.Holding

GetLatestHoldingsForAllCurrencies will return the current holdings for all loaded currencies this is useful to assess the position of your entire portfolio in order to help with risk decisions

func (*Portfolio) GetLatestOrderSnapshotForEvent

func (p *Portfolio) GetLatestOrderSnapshotForEvent(ev common.Event) (compliance.Snapshot, error)

GetLatestOrderSnapshotForEvent gets orders related to the event

func (*Portfolio) GetLatestOrderSnapshots

func (p *Portfolio) GetLatestOrderSnapshots() ([]compliance.Snapshot, error)

GetLatestOrderSnapshots returns the latest snapshots from all stored pair data

func (*Portfolio) GetLatestPNLForEvent

func (p *Portfolio) GetLatestPNLForEvent(e common.Event) (*PNLSummary, error)

GetLatestPNLForEvent takes in an event and returns the latest PNL data if it exists

func (*Portfolio) GetLatestPosition

func (p *Portfolio) GetLatestPosition(e common.Event) (*futures.Position, error)

GetLatestPosition returns all futures positions for an event's exchange, asset, pair

func (*Portfolio) GetPositions

func (p *Portfolio) GetPositions(e common.Event) ([]futures.Position, error)

GetPositions returns all futures positions for an event's exchange, asset, pair

func (*Portfolio) OnFill

func (p *Portfolio) OnFill(ev fill.Event, funds funding.IFundReleaser) (fill.Event, error)

OnFill processes the event after an order has been placed by the exchange. Its purpose is to track holdings for future portfolio decisions.

func (*Portfolio) OnSignal

func (p *Portfolio) OnSignal(ev signal.Event, exchangeSettings *exchange.Settings, funds funding.IFundReserver) (*order.Order, error)

OnSignal receives the event from the strategy on whether it has signalled to buy, do nothing or sell on buy/sell, the portfolio manager will size the order and assess the risk of the order if successful, it will pass on an order.Order to be used by the exchange event handler to place an order based on the portfolio manager's recommendations

func (*Portfolio) Reset

func (p *Portfolio) Reset() error

Reset returns the portfolio manager to its default state

func (*Portfolio) SetCurrencySettingsMap

func (p *Portfolio) SetCurrencySettingsMap(setup *exchange.Settings) error

SetCurrencySettingsMap ensures a map is created and no panics happen

func (*Portfolio) SetHoldingsForEvent

func (p *Portfolio) SetHoldingsForEvent(fm funding.IFundReader, e common.Event) error

SetHoldingsForEvent re-sets offset details at the events time, based on current funding levels

func (*Portfolio) SetHoldingsForTimestamp

func (p *Portfolio) SetHoldingsForTimestamp(h *holdings.Holding) error

SetHoldingsForTimestamp stores a holding snapshot for the holding's timestamp

func (*Portfolio) TrackFuturesOrder

func (p *Portfolio) TrackFuturesOrder(ev fill.Event, fund funding.IFundReleaser) (*PNLSummary, error)

TrackFuturesOrder updates the futures tracker with a new order from a fill event

func (*Portfolio) UpdateHoldings

func (p *Portfolio) UpdateHoldings(e data.Event, funds funding.IFundReleaser) error

UpdateHoldings updates the portfolio holdings for the data event

func (*Portfolio) UpdatePNL

func (p *Portfolio) UpdatePNL(e common.Event, closePrice decimal.Decimal) error

UpdatePNL will analyse any futures orders that have been placed over the backtesting run that are not closed and calculate their PNL

func (*Portfolio) ViewHoldingAtTimePeriod

func (p *Portfolio) ViewHoldingAtTimePeriod(ev common.Event) (*holdings.Holding, error)

ViewHoldingAtTimePeriod retrieves a snapshot of holdings at a specific time period, returning an error if not found

type Settings

type Settings struct {
	BuySideSizing     exchange.MinMax
	SellSideSizing    exchange.MinMax
	Leverage          exchange.Leverage
	HoldingsSnapshots map[int64]*holdings.Holding
	ComplianceManager compliance.Manager
	Exchange          gctexchange.IBotExchange
	FuturesTracker    *futures.MultiPositionTracker
	// contains filtered or unexported fields
}

Settings holds all important information for the portfolio manager to assess purchasing decisions

func (*Settings) GetHoldingsForTime

func (s *Settings) GetHoldingsForTime(t time.Time) (*holdings.Holding, error)

GetHoldingsForTime returns the holdings for a time period, or an error holding if not found

func (*Settings) GetLatestHoldings

func (s *Settings) GetLatestHoldings() (*holdings.Holding, error)

GetLatestHoldings returns the latest holdings after being sorted by time

type SizeHandler

type SizeHandler interface {
	SizeOrder(order.Event, decimal.Decimal, *exchange.Settings) (*order.Order, decimal.Decimal, error)
}

SizeHandler is the interface to help size orders

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL