Sabtu, 18 Mei 2013

Kelompok 2

Berikut Link tugas bahasa pemrogaman tgl 19 Mei 2013
Kelompok 2
.
http://www.mediafire.com/?9rpwk8f52p236cs

berikut data ms .word
http://www.mediafire.com/view/?x7xqqo1yojiuvq4

berikut data ms.power pointnya
http://www.mediafire.com/view/?tf4az118ryv5vpo

User Defined Function

Cara Membuat User Defined Function di Excel menggunakan C# dan Visual Studio 2008 :

Langkah 1
Pertama, jalankan Visual Studio 2008 dan membuat C # proyek Class Library baru yang disebut BlackScholesAddin untuk contoh ini.

Langkah 2
Dalam file Class1.cs Anda, menghapus semua kode yang ada dan menggantinya dengan kode berikut
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using Microsoft.Win32;
  4. namespace BlackScholesAddin
  5. {
  6.     [ClassInterface(ClassInterfaceType.AutoDual)]
  7.     [ComVisible(true)]
  8.     public class Functions
  9.     {
  10.         public Functions()
  11.         {
  12.         }
  13.         //cumulative normal distribution function
  14.         private double CND(double X)
  15.         {
  16.             double L = 0.0;
  17.             double K = 0.0;
  18.             double dCND = 0.0;
  19.             const double a1 = 0.31938153;
  20.             const double a2 = -0.356563782;
  21.             const double a3 = 1.781477937;
  22.             const double a4 = -1.821255978;
  23.             const double a5 = 1.330274429;
  24.             L = Math.Abs(X);
  25.             K = 1.0 / (1.0 + 0.2316419 * L);
  26.             dCND = 1.0 - 1.0 / Math.Sqrt(2 * Convert.ToDouble(Math.PI.ToString())) *
  27.                 Math.Exp(-L * L / 2.0) * (a1 * K + a2 * K * K + a3 * Math.Pow(K, 3.0) +
  28.                 a4 * Math.Pow(K, 4.0) + a5 * Math.Pow(K, 5.0));
  29.             if (X < 0)
  30.             {
  31.                 return 1.0 - dCND;
  32.             }
  33.             else
  34.             {
  35.                 return dCND;
  36.             }
  37.         }
  38.         //function phi
  39.         private double phi(double x)
  40.         {
  41.             double phi = 0.0;
  42.             phi = Math.Exp(-x * x / 2) / Math.Sqrt(2 * Math.PI);
  43.             return phi;
  44.         }
  45.         //implied volatility using Newton-Raphson method
  46.         public double blsimpvCall(double Price, double Strike, double Rate, double Time, double Value, double Yield)
  47.         {
  48.             const double ACCURACY = 1.0e-6;
  49.             double ComputedVolatility = Math.Pow(Math.Abs(Math.Log(Price / Strike) + Rate * Time) * 2 / Time, 0.5); // initial value of volatility
  50.             double ComputedValue = blsCall(Price, Strike, Rate, Time, ComputedVolatility, Yield);
  51.             double Vega = blsvega(Price, Strike, Rate, Time, ComputedVolatility, Yield);
  52.             while (Math.Abs(Value - ComputedValue) > ACCURACY)
  53.             {
  54.                 ComputedVolatility = ComputedVolatility - ((ComputedValue - Value) / Vega);
  55.                 ComputedValue = blsCall(Price, Strike, Rate, Time, ComputedVolatility, Yield);
  56.                 Vega = blsvega(Price, Strike, Rate, Time, ComputedVolatility, Yield);
  57.             }
  58.             return ComputedVolatility;
  59.         }
  60.         public double blsimpvPut(double Price, double Strike, double Rate, double Time, double Value, double Yield)
  61.         {
  62.             const double ACCURACY = 1.0e-6;
  63.             double ComputedVolatility = Math.Pow(Math.Abs(Math.Log(Price / Strike) + Rate * Time) * 2 / Time, 0.5); // initial value of volatility
  64.             double ComputedValue = blsPut(Price, Strike, Rate, Time, ComputedVolatility, Yield);
  65.             double Vega = blsvega(Price, Strike, Rate, Time, ComputedVolatility, Yield);
  66.             while (Math.Abs(Value - ComputedValue) > ACCURACY)
  67.             {
  68.                 ComputedVolatility = ComputedVolatility - ((ComputedValue - Value) / Vega);
  69.                 ComputedValue = blsPut(Price, Strike, Rate, Time, ComputedVolatility, Yield);
  70.                 Vega = blsvega(Price, Strike, Rate, Time, ComputedVolatility, Yield);
  71.             }
  72.             return ComputedVolatility;
  73.         }
  74.         //Call pricer
  75.         public double blsCall(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  76.         {
  77.             double d1 = 0.0;
  78.             double d2 = 0.0;
  79.             double Call = 0.0;
  80.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  81.             d2 = d1 - Volatility * Math.Sqrt(Time);
  82.             Call = Price * Math.Exp(-Yield * Time) * CND(d1) - Strike * Math.Exp(-Rate * Time) * CND(d2);
  83.             return Call;
  84.         }
  85.         //Put pricer
  86.         public double blsPut(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  87.         {
  88.             double d1 = 0.0;
  89.             double d2 = 0.0;
  90.             double Put = 0.0;
  91.      
  92.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  93.             d2 = d1 - Volatility * Math.Sqrt(Time);
  94.             Put = Strike * Math.Exp(-Rate * Time) * CND(-d2) - Price * Math.Exp(-Yield * Time) * CND(-d1);
  95.             return Put;
  96.         }
  97.         //delta for Call
  98.         public double blsdeltaCall(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  99.         {
  100.             double d1 = 0.0;
  101.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  102.             return Math.Exp(-Yield * Time) * CND(d1);
  103.         }
  104.         //delta for Put
  105.         public double blsdeltaPut(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  106.         {
  107.             double d1 = 0.0;
  108.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  109.             return Math.Exp(-Yield * Time) * CND(d1) - 1;
  110.         }
  111.         //gamma is the same for Put and Call
  112.         public double blsgamma(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  113.         {
  114.             double d1 = 0.0;
  115.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  116.             return Math.Exp(-Yield * Time) * phi(d1) / (Price * Volatility * Math.Sqrt(Time));
  117.         }
  118.         //vega is the same for Put and Call
  119.         public double blsvega(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  120.         {
  121.             double d1 = 0.0;
  122.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  123.             return Price * Math.Exp(-Yield * Time) * phi(d1) * Math.Sqrt(Time);
  124.         }
  125.         //theta for Call
  126.         public double blsthetaCall(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  127.         {
  128.             double d1 = 0.0;
  129.             double d2 = 0.0;
  130.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  131.             d2 = d1 - Volatility * Math.Sqrt(Time);
  132.             return -Math.Exp(-Yield * Time) * Price * phi(d1) * Volatility / (2 * Math.Sqrt(Time)) - Rate * Strike * Math.Exp(-Rate * Time) * CND(d2) + Yield * Price * Math.Exp(-Yield * Time) * CND(d1);
  133.         }
  134.         //theta for Put
  135.         public double blsthetaPut(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  136.         {
  137.             double d1 = 0.0;
  138.             double d2 = 0.0;
  139.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  140.             d2 = d1 - Volatility * Math.Sqrt(Time);
  141.             return -Math.Exp(-Yield * Time) * Price * phi(d1) * Volatility / (2 * Math.Sqrt(Time)) + Rate * Strike * Math.Exp(-Rate * Time) * CND(-d2) - Yield * Price * Math.Exp(-Yield * Time) * CND(-d1);
  142.         }
  143.         //rho for Call
  144.         public double blsrhoCall(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  145.         {
  146.             double d1 = 0.0;
  147.             double d2 = 0.0;
  148.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  149.             d2 = d1 - Volatility * Math.Sqrt(Time);
  150.             return Strike * Time * Math.Exp(-Rate * Time) * CND(d2);
  151.         }
  152.         //rho for Put
  153.         public double blsrhoPut(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  154.         {
  155.             double d1 = 0.0;
  156.             double d2 = 0.0;
  157.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  158.             d2 = d1 - Volatility * Math.Sqrt(Time);
  159.             return -Strike * Time * Math.Exp(-Rate * Time) * CND(-d2);
  160.         }
  161.         //volga is the same for Call and Put
  162.         public double blsvolga(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  163.         {
  164.             double d1 = 0.0;
  165.             double d2 = 0.0;
  166.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  167.             d2 = d1 - Volatility * Math.Sqrt(Time);
  168.             return Price * Math.Exp(-Yield * Time) * phi(d1) * Math.Sqrt(Time) * d1 * d2 / Volatility;
  169.         }
  170.         //vanna is the same for Call and Put
  171.         public double blsvanna(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  172.         {
  173.             double d1 = 0.0;
  174.             double d2 = 0.0;
  175.             double vanna = 0.0;
  176.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  177.             d2 = d1 - Volatility * Math.Sqrt(Time);
  178.             vanna = -Math.Exp(-Yield * Time) * phi(d1) * d2 / Volatility;
  179.             return vanna;
  180.         }
  181.         //charm for Call
  182.         public double blscharmCall(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  183.         {
  184.             double d1 = 0.0;
  185.             double d2 = 0.0;
  186.             double charmC = 0.0;
  187.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  188.             d2 = d1 - Volatility * Math.Sqrt(Time);
  189.             charmC = -Yield * Math.Exp(-Yield * Time) * CND(d1) + Math.Exp(-Yield * Time) * phi(d1) * (2 * (Rate - Yield) * Time - d2 * Volatility * Math.Sqrt(Time)) / (2 * Time * Volatility * Math.Sqrt(Time));
  190.             return charmC;
  191.         }
  192.         //charm for Put
  193.         public double blscharmPut(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  194.         {
  195.             double d1 = 0.0;
  196.             double d2 = 0.0;
  197.             double charmP = 0.0;
  198.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  199.             d2 = d1 - Volatility * Math.Sqrt(Time);
  200.             charmP = Yield * Math.Exp(-Yield * Time) * CND(-d1) - Math.Exp(-Yield * Time) * phi(d1) * (2 * (Rate - Yield) * Time - d2 * Volatility * Math.Sqrt(Time)) / (2 * Time * Volatility * Math.Sqrt(Time));
  201.             return charmP;
  202.         }
  203.         //color is the same for Call and Put
  204.         public double blscolor(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  205.         {
  206.             double d1 = 0.0;
  207.             double d2 = 0.0;
  208.             double color = 0.0;
  209.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  210.             d2 = d1 - Volatility * Math.Sqrt(Time);
  211.             color = -Math.Exp(-Yield * Time) * (phi(d1) / (2 * Price * Time * Volatility * Math.Sqrt(Time))) * (2 * Yield * Time + 1 + (2 * (Rate - Yield) * Time - d2 * Volatility * Math.Sqrt(Time)) * d1 / (2 * Time * Volatility * Math.Sqrt(Time)));
  212.             return color;
  213.         }
  214.         //dual delta for Call
  215.         public double blsdualdeltaCall(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  216.         {
  217.             double d1 = 0.0;
  218.             double d2 = 0.0;
  219.             double ddelta = 0.0;
  220.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  221.             d2 = d1 - Volatility * Math.Sqrt(Time);
  222.             ddelta = -Math.Exp(-Rate * Time) * CND(d2);
  223.             return ddelta;
  224.         }
  225.         //dual delta for Put
  226.         public double blsdualdeltaPut(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  227.         {
  228.             double d1 = 0.0;
  229.             double d2 = 0.0;
  230.             double ddelta = 0.0;
  231.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  232.             d2 = d1 - Volatility * Math.Sqrt(Time);
  233.             ddelta = Math.Exp(-Rate * Time) * CND(-d2);
  234.             return ddelta;
  235.         }
  236.         //dual gamma is the same for Call and Put
  237.         public double blsdualgamma(double Price, double Strike, double Rate, double Time, double Volatility, double Yield)
  238.         {
  239.             double d1 = 0.0;
  240.             double d2 = 0.0;
  241.             double dgamma = 0.0;
  242.             d1 = (Math.Log(Price / Strike) + (Rate - Yield + Volatility * Volatility / 2.0) * Time) / (Volatility * Math.Sqrt(Time));
  243.             d2 = d1 - Volatility * Math.Sqrt(Time);
  244.             dgamma = Math.Exp(-Rate * Time) * phi(d2) / (Strike * Volatility * Math.Sqrt(Time));
  245.             return dgamma;
  246.         }
  247.         [ComRegisterFunctionAttribute]
  248.         public static void RegisterFunction(Type type)
  249.         {
  250.             Registry.ClassesRoot.CreateSubKey(
  251.               GetSubKeyName(type, "Programmable"));
  252.             RegistryKey key = Registry.ClassesRoot.OpenSubKey(
  253.               GetSubKeyName(type, "InprocServer32"), true);
  254.             key.SetValue("",
  255.               System.Environment.SystemDirectory + @"\mscoree.dll",
  256.               RegistryValueKind.String);
  257.         }
  258.         [ComUnregisterFunctionAttribute]
  259.         public static void UnregisterFunction(Type type)
  260.         {
  261.             Registry.ClassesRoot.DeleteSubKey(
  262.               GetSubKeyName(type, "Programmable"), false);
  263.         }
  264.         private static string GetSubKeyName(Type type,
  265.           string subKeyName)
  266.         {
  267.             System.Text.StringBuilder s =
  268.               new System.Text.StringBuilder();
  269.             s.Append(@"CLSID\{");
  270.             s.Append(type.GUID.ToString().ToUpper());
  271.             s.Append(@"}\");
  272.            s.Append(subKeyName);
  273.            return s.ToString();
  274.        }
  275.    }
  276. }