Пример #1
0
        public InterestRate CreateInterestRate(Instrument instrument, int maturity, InterestRateTenorType maturityType)
        {
            lock (objLock)
            {
                if (!(instrument.InstrumentType == InstrumentType.Deposit || instrument.InstrumentType == InstrumentType.InterestRateSwap))
                {
                    throw new Exception("Instrument is not an Interest Rate");
                }

                string            searchString = "ID = " + instrument.ID;
                string            targetString = null;
                DataTable         table        = Database.DB["Quant"].GetDataTable(_interestRateTableName, targetString, searchString);
                DataRowCollection rows         = table.Rows;

                if (rows.Count == 0)
                {
                    DataRow r = table.NewRow();
                    r["ID"]           = instrument.ID;
                    r["Maturity"]     = maturity;
                    r["MaturityType"] = (int)maturityType;
                    rows.Add(r);
                    Database.DB["Quant"].UpdateDataTable(table);

                    return(InterestRate.FindInterestRate(instrument));
                }
                throw new Exception("InterestRate Already Exists");
            }
        }
Пример #2
0
        public void AddCashFlow(double rate, InterestRateTenorType frequencyType, int frequency, InterestRateTenorType maturityType, int maturity, DayCountConvention dayCount)
        {
            // Console.WriteLine("Add Cashflow:" + rate + " " + frequencyType + " " + frequency + " " + maturityType + " " + maturity + " " + dayCount);
            DateTime expiryDate = new DateTime();

            switch (maturityType)
            {
            case InterestRateTenorType.Daily:
                expiryDate = _startDate.AddActualDays(maturity, TimeSeries.DateSearchType.Next).DateTime;
                break;

            case InterestRateTenorType.Weekly:
                expiryDate = _startDate.AddActualDays(maturity * 7, TimeSeries.DateSearchType.Next).DateTime;
                break;

            case InterestRateTenorType.Monthly:
                expiryDate = _startDate.AddMonths(maturity, TimeSeries.DateSearchType.Next).DateTime;
                break;

            case InterestRateTenorType.Yearly:
                expiryDate = _startDate.AddYears(maturity, TimeSeries.DateSearchType.Next).DateTime;
                break;

            default:
                break;
            }

            CashFlowRate cf = new CashFlowRate(frequencyType, frequency, maturityType, maturity, dayCount, rate);

            if (!_cashFlows.ContainsKey(expiryDate))
            {
                _cashFlows.Add(expiryDate, cf);
            }
        }
Пример #3
0
 public CashFlowRate(InterestRateTenorType frequencyType, int frequency, InterestRateTenorType maturityType, int maturity, DayCountConvention dayCount, double rate)
 {
     this._frequencyType = frequencyType;
     this._frequency     = frequency;
     this._maturityType  = maturityType;
     this._maturity      = maturity;
     this._dayCount      = dayCount;
     this._rate          = rate;
 }
Пример #4
0
        public InterestRateSwap FindInterestRateSwap(InterestRate instrument)
        {
            lock (objLock)
            {
                if (_swaps.ContainsKey(instrument.ID))
                {
                    return(_swaps[instrument.ID]);
                }

                if (instrument.InstrumentType != InstrumentType.InterestRateSwap)
                {
                    throw new Exception("Instrument is not an Interest Rate Swap");
                }

                string    tableName    = _interestRateSwapTableName;
                string    searchString = "ID = " + instrument.ID;
                string    targetString = null;
                DataTable table        = Database.DB["Quant"].GetDataTable(tableName, targetString, searchString);

                DataRowCollection rows = table.Rows;
                if (rows.Count == 0)
                {
                    return(null);
                }

                DataRow r = rows[0];

                int floatFrequency = GetValue <int>(r, "FloatFrequency");
                InterestRateTenorType floatFrequencyType      = (InterestRateTenorType)GetValue <int>(r, "FloatFrequencyType");
                DayCountConvention    floatDayCountConvention = (DayCountConvention)GetValue <int>(r, "FloatDayCountConvention");
                int fixedFrequency = GetValue <int>(r, "FixedFrequency");
                InterestRateTenorType fixedFrequencyType      = (InterestRateTenorType)GetValue <int>(r, "FixedFrequencyType");
                DayCountConvention    fixedDayCountConvention = (DayCountConvention)GetValue <int>(r, "FixedDayCountConvention");
                int effective = GetValue <int>(r, "Effective");

                InterestRateSwap swap = new InterestRateSwap(instrument, floatFrequency, floatFrequencyType, floatDayCountConvention, fixedFrequency, fixedFrequencyType, fixedDayCountConvention, effective);

                _swaps.Add(swap.ID, swap);
                if (_mainTables.ContainsKey(swap.ID))
                {
                    _mainTables[swap.ID] = table;
                }
                else
                {
                    _mainTables.Add(swap.ID, table);
                }

                return(swap);
            }
        }
Пример #5
0
        public override void Initialize()
        {
            if (Initialized)
            {
                return;
            }

            _amount    = this[DateTime.Now, -(int)MemoryType.Amount, TimeSeriesRollType.Last];
            _startDate = DateTime.FromOADate((long)this[DateTime.Now, -(int)MemoryType.StartDate, TimeSeriesRollType.Last]);
            _endDate   = DateTime.FromOADate((long)this[DateTime.Now, -(int)MemoryType.EndDate, TimeSeriesRollType.Last]);
            _frequency = (InterestRateTenorType)this[DateTime.Now, -(int)MemoryType.Frequency, TimeSeriesRollType.Last];

            base.Initialize();
        }
Пример #6
0
 public InterestRateSwap(InterestRate rate,
                         int floatFrequency,
                         InterestRateTenorType floatFrequencyType,
                         DayCountConvention floatDayCountConvention,
                         int fixedFrequency,
                         InterestRateTenorType fixedFrequencyType,
                         DayCountConvention fixedDayCountConvention,
                         int effective)
     : base(rate, rate.Maturity, rate.MaturityType)
 {
     this._floatFrequency          = floatFrequency;
     this._floatFrequencyType      = floatFrequencyType;
     this._floatDayCountConvention = floatDayCountConvention;
     this._fixedFrequency          = fixedFrequency;
     this._fixedFrequencyType      = fixedFrequencyType;
     this._fixedDayCountConvention = fixedDayCountConvention;
     this._effective = effective;
 }
Пример #7
0
        public InterestRate FindInterestRate(Instrument instrument)
        {
            lock (objLock)
            {
                if (_rates.ContainsKey(instrument.ID))
                {
                    return(_rates[instrument.ID]);
                }

                if (instrument.InstrumentType == InstrumentType.Deposit || instrument.InstrumentType == InstrumentType.InterestRateSwap)
                {
                    string    tableName    = _interestRateTableName;
                    string    searchString = "ID = " + instrument.ID;
                    string    targetString = null;
                    DataTable table        = Database.DB["Quant"].GetDataTable(tableName, targetString, searchString);

                    DataRowCollection rows = table.Rows;
                    if (rows.Count == 0)
                    {
                        return(null);
                    }

                    DataRow r        = rows[0];
                    int     maturity = GetValue <int>(r, "Maturity");
                    InterestRateTenorType maturityType = (InterestRateTenorType)GetValue <int>(r, "MaturityType");

                    InterestRate rate = new InterestRate(instrument, maturity, maturityType);

                    _rates.Add(instrument.ID, rate);
                    if (_mainTables.ContainsKey(instrument.ID))
                    {
                        _mainTables[instrument.ID] = table;
                    }
                    else
                    {
                        _mainTables.Add(instrument.ID, table);
                    }

                    return(rate);
                }

                throw new Exception("Instrument is not an Interest Rate");
            }
        }
Пример #8
0
 public static InterestRate CreateInterestRate(Instrument instrument, int maturity, InterestRateTenorType maturityType)
 {
     return(Factory.CreateInterestRate(instrument, maturity, maturityType));
 }
Пример #9
0
 public static InterestRateSwap CreateInterestRateSwap(InterestRate instrument, int floatFrequency, InterestRateTenorType floatFrequencyType, DayCountConvention floatDayCount, int fixedFrequency, InterestRateTenorType fixedFrequencyType, DayCountConvention fixedDayCount, int effective)
 {
     return(Factory.CreateInterestRateSwap(instrument, floatFrequency, floatFrequencyType, floatDayCount, fixedFrequency, fixedFrequencyType, fixedDayCount, effective));
 }
Пример #10
0
 public InterestRate(Instrument instrument, int maturity, InterestRateTenorType maturityType)
     : base(instrument)
 {
     this._maturity     = maturity;
     this._maturityType = maturityType;
 }
Пример #11
0
        public InterestRateSwap CreateInterestRateSwap(InterestRate instrument, int floatFrequency, InterestRateTenorType floatFrequencyType, DayCountConvention floatDayCount, int fixedFrequency, InterestRateTenorType fixedFrequencyType, DayCountConvention fixedDayCount, int effective)
        {
            lock (objLock)
            {
                if (instrument.InstrumentType != InstrumentType.InterestRateSwap)
                {
                    throw new Exception("Instrument is not an Interest Rate Swap");
                }

                string            searchString = null;// "Name LIKE '" + name + "'";
                string            targetString = null;
                DataTable         table        = Database.DB["Quant"].GetDataTable(_interestRateSwapTableName, targetString, searchString);
                DataRowCollection rows         = table.Rows;


                var lrows = from lrow in new LINQList <DataRow>(rows)
                            where (int)lrow["ID"] == instrument.ID
                            select lrow;

                if (lrows.Count() == 0)
                {
                    DataRow r = table.NewRow();
                    r["ID"]                      = instrument.ID;
                    r["FloatFrequency"]          = floatFrequency;
                    r["FloatFrequencyType"]      = (int)floatFrequencyType;
                    r["FloatDayCountConvention"] = (int)floatDayCount;
                    r["FixedFrequency"]          = fixedFrequency;
                    r["FixedFrequencyType"]      = (int)fixedFrequencyType;
                    r["FixedDayCountConvention"] = (int)fixedDayCount;
                    r["Effective"]               = effective;
                    rows.Add(r);
                    Database.DB["Quant"].UpdateDataTable(table);

                    return(FindInterestRateSwap(instrument));
                }
                throw new Exception("InterestRateSwap Already Exists");
            }
        }
Пример #12
0
        private void _addCashFlow(CashFlowRate cashFlow)
        {
            // Console.WriteLine("Add Cashflow:" + cashFlow.Rate + " " + cashFlow.MaturityType + " " + cashFlow.Maturity + " " + cashFlow.FrequencyType + " " + cashFlow.Frequency + " " + cashFlow.DayCount);

            double rate = cashFlow.Rate;
            InterestRateTenorType frequencyType = cashFlow.FrequencyType;
            int frequency = cashFlow.Frequency;
            InterestRateTenorType maturityType = cashFlow.MaturityType;
            int maturity = cashFlow.Maturity;
            DayCountConvention dayCount = cashFlow.DayCount;

            BusinessDay expiryDate = null;

            switch (maturityType)
            {
            case InterestRateTenorType.Daily:
                expiryDate = _startDate.AddActualDays(maturity, TimeSeries.DateSearchType.Next);
                //expiryDate = _startDate.AddActualDays(maturity, BusinessDaySearchType.Next);
                break;

            case InterestRateTenorType.Weekly:
                expiryDate = _startDate.AddActualDays(maturity * 7, TimeSeries.DateSearchType.Next);
                //expiryDate = _startDate.AddActualDays(maturity * 7, BusinessDaySearchType.Next);
                break;

            case InterestRateTenorType.Monthly:
                expiryDate = _startDate.AddMonths(maturity, TimeSeries.DateSearchType.Next);
                //expiryDate = _startDate.AddMonths(maturity, BusinessDaySearchType.Next);
                break;

            case InterestRateTenorType.Yearly:
                expiryDate = _startDate.AddYears(maturity, TimeSeries.DateSearchType.Next);
                //expiryDate = _startDate.AddYears(maturity, BusinessDaySearchType.Next);
                break;

            default:
                break;
            }

            BusinessDay runningDate = _startDate;

            if (frequencyType == maturityType && frequency == maturity)
            {
                double t  = expiryDate.YearsBetween(_startDate, dayCount);
                double pv = 1 / (1 + rate * t);
                t = expiryDate.YearsBetween(_startDate, DayCountConvention.Act365);
                _zeroRates.TryAdd(t, -Math.Log(pv) / t);
            }
            else
            {
                int    counter = 1;
                double pvs     = 0;
                double PV      = 0;
                double t       = 0;

                bool        flag         = true;
                BusinessDay previousDate = _startDate;

                while (flag)
                {
                    previousDate = runningDate;
                    if (frequencyType == InterestRateTenorType.Daily)
                    {
                        runningDate = runningDate.AddBusinessDays(frequency * counter);
                    }
                    else if (frequencyType == InterestRateTenorType.Weekly)
                    {
                        runningDate = _startDate.AddActualDays(7 * frequency * counter, TimeSeries.DateSearchType.Next);
                    }
                    //runningDate = _startDate.AddActualDays(7 * frequency * counter, BusinessDaySearchType.Next);
                    else if (frequencyType == InterestRateTenorType.Monthly)
                    {
                        runningDate = _startDate.AddMonths(frequency * counter, TimeSeries.DateSearchType.Next);
                    }
                    //runningDate = _startDate.AddMonths(frequency * counter, BusinessDaySearchType.Next);
                    else if (frequencyType == InterestRateTenorType.Yearly)
                    {
                        runningDate = _startDate.AddYears(frequency * counter, TimeSeries.DateSearchType.Next);
                    }
                    //runningDate = _startDate.AddYears(frequency * counter, BusinessDaySearchType.Next);

                    flag = (runningDate.DateTime < expiryDate.DateTime);

                    if (flag)
                    {
                        counter++;
                        t    = runningDate.YearsBetween(previousDate, dayCount);
                        pvs += rate * t * PresentValue(runningDate.YearsBetween(_startDate, DayCountConvention.Act365));
                        t    = expiryDate.YearsBetween(runningDate, dayCount);
                        PV   = (1 - pvs) / (1 + rate * t);
                    }
                }


                t = expiryDate.YearsBetween(_startDate, DayCountConvention.Act365);
                double zeroRate = -Math.Log(PV) / t;
                _zeroRates.TryAdd(t, zeroRate);
            }
        }
Пример #13
0
        public static CashFlowGroup CreateStrategy(Instrument instrument, BusinessDay initialDate, double amount, BusinessDay startDate, BusinessDay endDate, InterestRateTenorType ttype, Portfolio parent)
        {
            if (instrument.InstrumentType == InstrumentType.Strategy)
            {
                CashFlowGroup Strategy = new CashFlowGroup(instrument);
                Strategy.TimeSeriesRoll = TimeSeriesRollType.Last;
                Strategy.Amount         = amount;
                Strategy.StartDate      = startDate.DateTime;
                Strategy.EndDate        = endDate.DateTime;
                Strategy.Frequency      = ttype;

                Portfolio portfolio = null;

                if (parent != null)
                {
                    Instrument portfolio_instrument = Instrument.CreateInstrument(instrument.Name + "/Portfolio", InstrumentType.Portfolio, instrument.Name + "/Portfolio", instrument.Currency, FundingType.TotalReturn, instrument.SimulationObject);
                    portfolio = Portfolio.CreatePortfolio(portfolio_instrument, parent.LongReserve, parent.ShortReserve, parent);
                    portfolio.TimeSeriesRoll = TimeSeriesRollType.Last;

                    foreach (Instrument reserve in parent.Reserves)
                    {
                        portfolio.AddReserve(reserve.Currency, parent.Reserve(reserve.Currency, PositionType.Long), parent.Reserve(reserve.Currency, PositionType.Short));
                    }

                    if (parent.Strategy != null)
                    {
                        parent.Strategy.AddInstrument(Strategy, initialDate.DateTime);
                    }
                }
                else
                {
                    Currency main_currency = instrument.Currency;
                    //ConstantStrategy main_cash_strategy = ConstantStrategy.CreateStrategy(instrument.Name + "/" + main_currency + "/Cash", main_currency, initialDate, 1.0, instrument.SimulationObject);
                    Instrument main_cash_strategy   = Instrument.FindInstrument(main_currency.Name + " - Cash");
                    Instrument portfolio_instrument = Instrument.CreateInstrument(instrument.Name + "/Portfolio", InstrumentType.Portfolio, instrument.Name + "/Portfolio", main_currency, FundingType.TotalReturn, instrument.SimulationObject);
                    portfolio = Portfolio.CreatePortfolio(portfolio_instrument, main_cash_strategy, main_cash_strategy, parent);
                    portfolio.TimeSeriesRoll = TimeSeriesRollType.Last;
                    portfolio.AddReserve(main_currency, main_cash_strategy, main_cash_strategy);
                }


                portfolio.Strategy = Strategy;
                Strategy.GenerateCashFlows(initialDate.DateTime);

                double npv = Strategy.NPV(initialDate);

                Strategy.Startup(initialDate, npv, portfolio);
                Strategy.InitialDate = new DateTime(1990, 01, 06);

                double npv2 = Strategy.NPV(initialDate);

                // if (parent != null)
                //    parent.CreatePosition(Strategy, initialDate.DateTime, (Strategy[initialDate.DateTime] == 0.0 ? 0 : 1.0), npv2);

                if (!instrument.SimulationObject)
                {
                    Strategy.Portfolio.MasterPortfolio.Strategy.Tree.SaveNewPositions();
                    Strategy.Portfolio.MasterPortfolio.Strategy.Tree.Save();
                }

                return(Strategy);
            }
            else
            {
                throw new Exception("Instrument not a Strategy");
            }
        }
Пример #14
0
        public static CashFlowGroup CreateCashFlowGroup(string name, Currency ccy, BusinessDay initialDate, double amount, BusinessDay startDate, BusinessDay endDate, InterestRateTenorType ttype, bool simulated, Portfolio parent)
        {
            Instrument instrument = Instrument.CreateInstrument(name, InstrumentType.Strategy, name, ccy, FundingType.TotalReturn, simulated);

            return(CreateStrategy(instrument, initialDate, amount, startDate, endDate, ttype, parent));
        }