Beispiel #1
0
        public static ITreeAddCmdtySettlementRule <T> WithOneFactorTrinomialTree <T>(
            [NotNull] this ITreeAddTreeFactory <T> addTreeFactory,
            TimeSeries <T, double> spotVolatilityCurve, double meanReversion, double onePeriodTimeDelta)
            where T : ITimePeriod <T>
        {
            if (addTreeFactory == null)
            {
                throw new ArgumentNullException(nameof(addTreeFactory));
            }

            return(addTreeFactory.WithTreeFactory(forwardCurve =>
                                                  OneFactorTrinomialTree.CreateTree(forwardCurve, meanReversion, spotVolatilityCurve, onePeriodTimeDelta)));
        }
Beispiel #2
0
        static void Main(string[] args)
        {
            const double meanReversion = 16.0;
            const double timeDelta     = 1.0 / 365.0;

            (TimeSeries <Day, double> forwardCurve, TimeSeries <Day, double> spotVolatility) =
                CreateForwardAndVolatilityCurves();

            TimeSeries <Day, IReadOnlyList <TreeNode> > trinomialTree = OneFactorTrinomialTree.CreateTree(forwardCurve, meanReversion, spotVolatility, timeDelta);

            Console.WriteLine($"Created a trinomial tree with {trinomialTree.Count} items, starting at {trinomialTree.Start}, ending at {trinomialTree.End}.");

            Console.WriteLine();

            Console.WriteLine("Example of iterating through the tree by date");
            Console.WriteLine();
            Console.WriteLine("Date        Price");

            int maxTreeWidth = trinomialTree[trinomialTree.Count - 1].Count;

            foreach ((Day day, IReadOnlyList <TreeNode> treeNodes) in trinomialTree)
            {
                int    numNodes    = treeNodes.Count;
                int    paddingSize = (maxTreeWidth - numNodes) * 6 / 2;
                string padding     = new String(' ', paddingSize);
                Console.WriteLine($"{day}: {padding}" + string.Join(" ", treeNodes.Select(node => node.Value.ToString("F2", CultureInfo.InvariantCulture))));
            }

            Console.WriteLine();
            Console.WriteLine("Example of traversing tree using transition links");
            Console.WriteLine();

            TreeNode treeNode = trinomialTree[0][0];
            var      random   = new Random(11);

            do
            {
                int nextMove   = random.Next(0, 3);
                var transition = treeNode.Transitions[nextMove];
                treeNode = transition.DestinationNode;
                Console.WriteLine(treeNode);
            } while (!treeNode.IsTerminalNode);

            Console.ReadKey();
        }
Beispiel #3
0
 private TimeSeries <Day, IReadOnlyList <TreeNode> > CreateTestTree()
 {
     return(OneFactorTrinomialTree.CreateTree(_forwardCurve, MeanReversion, _spotVolatility, TimeDelta));
 }
Beispiel #4
0
 public void CreateTree_MeanReversionNegative_ThrowsArgumentException()
 {
     Assert.Throws <ArgumentException>(() =>
                                       OneFactorTrinomialTree.CreateTree(_forwardCurve, -0.1, _spotVolatility, 1.0 / 365));
 }