Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Portfolios #37

Open
DerekTiggelaar opened this issue May 10, 2019 · 4 comments
Open

Portfolios #37

DerekTiggelaar opened this issue May 10, 2019 · 4 comments
Labels
help wanted Extra attention is needed question Further information is requested

Comments

@DerekTiggelaar
Copy link

Describe the problem.
What is the best way to represent a Portfolio that can consists of so many types of investments?

Describe the solution you'd like
I would like to leverage the concept of an Instrument to describe a Position in a gs-quant Portfolio. An Instrument is an object with industry-standard required fields that all-together describe a unique investment. Using instruments to represent positions in a portfolio will allow a gs-quant user to quickly understand how to add investments of any type to their portfolio and calculate analytics such as pricing or risk in a way that is agnostic to the portfolio's contents.

Here are a few code examples:

Example 1:

from gs_quant.session import *
from gs_quant.portfolio import GsPositionSet, GsPortfolio
from gs_quant.instrument import IRSwaption, EqOption
import matplotlib.pyplot as plt

with GsSession.get(Environment.PROD):

    positions = GsPositionSet([
        IRSwaption(PayReceive.Receive, '5y', 'USD', expirationDate='13m', strike='atm+40', notionalAmount=1e8),
        EqOption('SPX', date(2020, 12, 31), 2800, OptionType.Call, OptionStyle.European)
    ], date(2019, 05, 10))

    positions.calculate_prices('USD')

    portfolio = GsPortfolio('Derek's Example Portfolio', 'USD', [positions])
    portfolio.create_performance_report()
    portfolio.schedule_reports()
    
    performance = portfolio.get_normalized_performance()
    plt.plot(performance, label='Portfolio Performance')
    plt.show()

Example 2:

from gs_quant.session import *
from gs_quant.portfolio import GsPositionSet
from gs_quant.index import GsBasket
from gs_quant.instrument import Equity

with GsSession.get(Environment.PROD):

    positions = GsPositionSet([
        Equity('GS', 24222, AssetIdentifier.TICKER),
        Equity('AAPL', 23984, AssetIdentifier.TICKER)
    ], date(2019, 05, 10))

    positions.calculate_prices('USD')
    positions.calculate_liquidity('APEX', '.10') # 10% participation rate

    SPX = SecurityMaster.get_asset("SPX", AssetIdentifier.TICKER, asset_type=AssetType.INDEX)
    hedge = positions.hedge('Replicate Performance', universe=SPX.getUnderlyingAssetIds())

    hedge_positions = GsPositionSet(hedge.get_constituents())
    hedge_positions.calculate_liquidity('APEX', '.10') # 10% participation rate

    hedge_positions = [p for p in hedge_positions if p['adv22DayPct'] < 5.0]
    hedge_positions = [p for p in hedge_positions if p['transactionCostBps'] < 14.50]

    hedge_basket = GsBasket(
        "GSCBMARQ",
        "Basket From Hedge",
        hedge_positions,
        PublishParameters(False, False, False),
        100
    )

    hedge_basket.create()

Are you willing to contribute
Yes

Additional context
Let's build context from the ground up...

  • Position - A unique notional investment at a given point-in-time.
  • PositionSet - A set of Positions you're invested at a given point-in-time.
  • Portfolio - A set of PositionSets that you've invested in at different points in time.
@DerekTiggelaar DerekTiggelaar added help wanted Extra attention is needed question Further information is requested labels May 10, 2019
@francisg77
Copy link
Contributor

Cool stuff. I think we can drop the 'Gs' from the GsPositionSet? Definition doesn't have to be GS specific I think. Same for GsBasket.

@andrewphillipsn
Copy link
Contributor

some questions / comments on this:

  • Agree this should just be Portfolio rather than GsPortfolio
  • Equity should use the Stock class in gs_quant. we should also determine how we handle securities (e.g. is the stock position settled?
  • What's the third param to the portfolio? Looks like a list of PositionSets, but should this be something more structured? e.g. what if i add two PositionSets for the same date?
  • Perhaps we should line up the functions with instruments? e.g. price(), dollar_price(), calculate( ..metric ..)
  • Stylistically, should we allow pricing operations on PositionSet and Portfolio? interesting question. At the moment your replication flow implies that I compute historical performance for a fixed set of positions backwards through time. easier for stocks than other instruments which have complex aging
  • Not sure the report stuff is entirely intuitive at this stage. let's consult a couple more people

@nick-young-gs please also take a look!

@DerekTiggelaar
Copy link
Author

  • I agree with both of you. I'll drop the GS from GsPortfolio and GsPositionSet.
  • I was thinking that a Portfolio could only have one PositionSet per date. What would be the use-case for multiple PositionSets on a given date? It seems this would be more-so for managing a "Book" that encompasses multiple Portfolios. Implementing the concept of a Book could allow users to calculate things such as combined overall performance for a set of different Portfolios.
  • Pricing derivative positions in a portfolio (multiple dates in the past) is an interesting question that i'll revert to @nick-young-gs. But i'd assume it would be as straightforward as pricing those derivatives as of the positionDate it falls on.
  • Calculating historical performance for a spot PositionSet with derivatives backwards through time is very unclear to me. I'll also revert to @nick-young-gs on this.

@andrewphillipsn
Copy link
Contributor

  • mutliple positionsets per date would be for different position fixings / snaps. e.g. open, close, etc
  • can you touch base with @nick-young-gs to close out some of the open questions? thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed question Further information is requested
Projects
None yet
Development

No branches or pull requests

3 participants