domokane / FinancePy

A Python Finance Library that focuses on the pricing and risk-management of Financial Derivatives, including fixed-income, equity, FX and credit derivatives.
GNU General Public License v3.0
2.08k stars 315 forks source link

Bond Portfolio Object for Strategy Analysis #32

Open domokane opened 3 years ago

domokane commented 3 years ago

Create object that contains a portfolio of bonds Calculate duration, convexity and price Pricing from discount curve object

quantinsights commented 2 years ago

Hi @domokane is this issue still open? I am currently reading Schreve's book and am interested to actively contribute to FinancePy and strengthen my technical skills.

domokane commented 2 years ago

Yes. You're welcome to to do it. Let me know how it goes. Best D

DominicHong commented 1 year ago

Hi @domokane Is the product.bonds.bond_portfolio.py for this issue? It's not implemented yet. So the goal of this issue is to implement the bond_portfolio.py?

domokane commented 1 year ago

Exactly. If you wish to have a go, be my guest. Ultimate idea would be to have a portfolio object that you can use to analyse multi-bonds for hedging and scenario analysis and curve fitting.

DominicHong commented 1 year ago

I am thinking about a method of computing the profit of a Bond given the inital ytm and final ytm. It should look like this:

def get_profit(self, initial_date, end_date, begin_ytm, end_ytm):

It adds all the cashflow during the period and calculate the simple return and compounded return. Where should I put this method?

sagayev commented 1 year ago

I also would like to work on this. But before that someone with more strategic view should implement base bond class and other bonds should inherit from that base. Base bond class should have at least the following attributes "Currency" "Issue Date" "Interest Accrues" - sometimes it can be later or before than issue date "Maturity Date" "Floater Formula" "Security identifier" -- at least ISIN

Then the Portfolio class should have a base currency. If I implement, for example,
if not bondWeights:

calculate the sum of bond dirty prices

#calculate weight of each bond
#return ndarray bondWights

if in the future there will be multicurrency portfolio, the code will need to change again.

@domokane please let me know if should ignore these challenges and work on portfolio class right away.

DominicHong commented 1 year ago

Hi @sagayev, product.bonds.Bond is the base class you want, except for the Security Identifier attribute. However, all types of bonds are implemented individually, not by inheritance. Domokane prefered this way for simplicity. What's Floater Formula by the way?

domokane commented 1 year ago

Hi - I am not against refactoring the code to have a bond base class. I prefered to keep it separate for the specific case of a zero coupon bond. But if the benefits outweigh the cost then I am happy to reconsider.