//================================================================================================= // // Module: demo_csharp.cs // Author: Andrew Colin // Purpose: This shows how to set up and call FIA from a C-sharp program. As an example, the code // up sets several different types of securities and shows FIA running attribution on them. // // To compile, cd to the directory where the files are stored, and enter csc *.cs // //================================================================================================= using System; using EnumShare; public class runme { static void Main() { // Demo portfolio data const int P_ROWS = 11; const int P_COLS = 9; string[,] portfolio_data = new string[,] { { "2010-Jan-01", "PTF", "VANILLA_BOND", "1.0", "0.0", "0.0", "", "", "" }, { "2011-Jan-01", "PTF", "VANILLA_BOND", "1.0", "0.0", "0.0", "", "", "" }, { "2011-Jan-01", "PTF", "ZERO_INTEREST_CASH", "1.0", "0.0", "0.0", "", "", "" }, { "2011-Jan-01", "PTF", "INTEREST_BEARING_CASH", "1.0", "0.0", "0.0", "", "", "" }, { "2011-Jan-01", "PTF", "BANK_BILL", "1.0", "0.0", "0.0", "", "", "" }, { "2011-Jan-01", "PTF", "DELAYED_BOND", "1.0", "0.0", "0.0", "", "", "" }, { "2011-Jan-01", "PTF", "IL_BOND", "1.0", "0.0", "0.0", "", "", "" }, { "2011-Jan-01", "PTF", "FRN", "1.0", "0.0", "0.0", "", "", "" }, { "2011-Jan-01", "PTF", "CDS", "1.0", "0.0", "0.0", "", "", "" }, { "2011-Jan-01", "PTF", "PERTURBATIONAL", "1.0", "0.0", "0.0", "0.05", "5.0", "0.2" }, { "2011-Jan-01", "PTF", "AMORTIZING_BOND", "1.0", "0.0", "0.0", "", "", "" }, }; var p = new stringmatrix(); for ( int i = 0; i < P_ROWS; i++ ) { var v = new stringvector(); for ( int j = 0; j < P_COLS; j++ ) v.Add ( portfolio_data[i, j] ); p.Add( v ); } // Demo security data const int S_COLS = 17; const int S_ROWS = 10; string[,] security_data = new string[,] { { "ZERO_INTEREST_CASH", "ZERO_INTEREST_CASH", "SECURITY_TYPE=CASH", "", "FT_CASH", "", "", "", "AUD", "", "", "", "", "", "", "", "" }, { "INTEREST_BEARING_CASH", "INTEREST_BEARING_CASH", "SECURITY_TYPE=CASH", "","FT_CASH","Interest(BASE_CURVE[0])", "", "", "AUD", "", "", "", "", "", "", "", "" }, { "BANK_BILL", "BANK_BILL", "SECURITY_TYPE=BILL", "", "FT_BILL", "", "", "", "AUD", "", "BASE_CURVE", "", "2011-Jan-01", "", "", "", "" }, { "VANILLA_BOND", "VANILLA_BOND", "SECURITY_TYPE=BOND", "", "FT_BOND_ZERO_CURVE", "", "", "", "AUD", "", "BASE_CURVE|SECTOR_CURVE", "", "2019-Jan-01", "0.04", "2", "", "" }, { "DELAYED_BOND", "DELAYED_BOND", "SECURITY_TYPE=BOND", "", "FT_BOND_ZERO_CURVE", "", "", "", "AUD", "", "BASE_CURVE", "2015-Jan-01", "2019-Jan-01", "0.05", "2", "", "" }, { "IL_BOND", "IL_BOND", "SECURITY_TYPE=IL BOND", "", "FT_BOND_ZERO_CURVE", "Inflation(AUD_CPI)", "", "", "AUD", "", "BASE_CURVE", "", "2019-Jan-15", "0.04", "4", "", "" }, { "FRN", "FRN", "SECURITY_TYPE=FRN", "", "FT_FRN_ZERO_CURVE(MONTHLY_LIBOR)", "", "", "", "AUD", "", "BASE_CURVE", "", "2019-Jan-01", "0.0025", "12", "", "" }, { "PERTURBATIONAL", "PERTURBATIONAL", "SECURITY_TYPE=BOND", "", "", "", "", "", "AUD", "", "BASE_CURVE|SECTOR_CURVE", "", "2011-Jan-01", "0.05","2", "", "" }, { "AMORTIZING_BOND", "AMORTIZING_BOND", "SECURITY_TYPE=BOND", "", "FT_SINKER_ZERO_CURVE", "", "", "", "AUD", "", "BASE_CURVE", "", "2019-Jan-01", "0.05", "4", "", "8.5" }, { "CDS", "CDS", "SECURITY_TYPE=CDS", "", "FT_CDS", "", "", "", "AUD", "", "BASE_CURVE", "", "2019-Jan-01", "0.04", "12", "", "" } }; var s = new stringmatrix(); for ( int i = 0; i < S_ROWS; i++ ) { var v = new stringvector(); for ( int j = 0; j < S_COLS; j++ ) v.Add ( security_data[i, j] ); s.Add( v ); } // Load curve data const int Y_COLS = 4; const int Y_ROWS = 12; string[,] yield_data = new string[,] { {"BASE_CURVE", "2010-Jan-01", "0.0", "0.050"}, {"BASE_CURVE", "2010-Jan-01", "4.0", "0.050"}, {"BASE_CURVE", "2010-Jan-01", "8.0", "0.050"}, {"BASE_CURVE", "2011-Jan-01", "0.0", "0.045"}, {"BASE_CURVE", "2011-Jan-01", "4.0", "0.045"}, {"BASE_CURVE", "2011-Jan-01", "8.0", "0.045"}, {"SECTOR_CURVE", "2010-Jan-01", "0.0", "0.055"}, {"SECTOR_CURVE", "2010-Jan-01", "4.0", "0.055"}, {"SECTOR_CURVE", "2010-Jan-01", "8.0", "0.055"}, {"SECTOR_CURVE", "2011-Jan-01", "0.0", "0.051"}, {"SECTOR_CURVE", "2011-Jan-01", "4.0", "0.051"}, {"SECTOR_CURVE", "2011-Jan-01", "8.0", "0.051"}, }; var y = new stringmatrix(); for ( int i = 0; i < Y_ROWS; i++ ) { var v = new stringvector(); for ( int j = 0; j < Y_COLS; j++ ) v.Add ( yield_data[i, j] ); y.Add( v ); } // Load index data const int INDEX_COLS = 3; const int INDEX_ROWS = 14; string[,] index_data = new string[,] { { "2009-Jun-01", "AUD_CPI", "80.0" }, { "2009-Jul-01", "AUD_CPI", "80.1" }, { "2009-Aug-01", "AUD_CPI", "80.2" }, { "2009-Sep-01", "AUD_CPI", "80.3" }, { "2009-Oct-01", "AUD_CPI", "80.4" }, { "2009-Nov-01", "AUD_CPI", "80.5" }, { "2009-Dec-01", "AUD_CPI", "80.6" }, { "2009-Jun-01", "MONTHLY_LIBOR", "0.01" }, { "2009-Jul-01", "MONTHLY_LIBOR", "0.01" }, { "2009-Aug-01", "MONTHLY_LIBOR", "0.01" }, { "2009-Sep-01", "MONTHLY_LIBOR", "0.01" }, { "2009-Oct-01", "MONTHLY_LIBOR", "0.01" }, { "2009-Nov-01", "MONTHLY_LIBOR", "0.01" }, { "2009-Dec-01", "MONTHLY_LIBOR", "0.01" } }; var index = new stringmatrix(); for ( int i = 0; i < INDEX_ROWS; i++ ) { var v = new stringvector(); for ( int j = 0; j < INDEX_COLS; j++ ) v.Add ( index_data[i, j] ); index.Add( v ); } // Must be present to assign default values to all settings FIA_csharp.FIA_init(); // C# requires that enums are explicitly cast to ints FIA_csharp.FIA_set_matrix( ( int )EnumShare.FIA_API_constants.FT_MATRIX_PORTFOLIO, p ); FIA_csharp.FIA_set_matrix( ( int )EnumShare.FIA_API_constants.FT_MATRIX_SECURITY, s ); FIA_csharp.FIA_set_matrix( ( int )EnumShare.FIA_API_constants.FT_MATRIX_YIELDCURVE, y ); FIA_csharp.FIA_set_matrix( ( int )EnumShare.FIA_API_constants.FT_MATRIX_INDEX, index ); FIA_csharp.FIA_set_string ( ( int )EnumShare.FIA_API_constants.FT_STRING_CARRY_DECOMPOSITION, "AGGREGATED" ); FIA_csharp.FIA_set_string ( ( int )EnumShare.FIA_API_constants.FT_STRING_AVERAGE_CURVE_LEVEL, "TRAPEZOIDAL" ); FIA_csharp.FIA_set_string ( ( int )EnumShare.FIA_API_constants.FT_STRING_SOVEREIGN_CURVE_DECOMPOSITION, "STB" ); FIA_csharp.FIA_set_bool ( ( int )EnumShare.FIA_API_constants.FT_BOOL_CONVEXITY_ATTRIBUTION, true ); FIA_csharp.FIA_set_bool ( ( int )EnumShare.FIA_API_constants.FT_BOOL_CSV_REPORT, false ); FIA_csharp.FIA_set_bool ( ( int )EnumShare.FIA_API_constants.FT_BOOL_XLS_REPORT, true ); FIA_csharp.FIA_set_string ( ( int )EnumShare.FIA_API_constants.FT_STRING_REPORT_DIRECTORY, ".\\" ); FIA_csharp.FIA_set_string ( ( int )EnumShare.FIA_API_constants.FT_STRING_DATE_FORMAT, "%Y-%b-%d" ); FIA_csharp.FIA_set_integer ( ( int )EnumShare.FIA_API_constants.FT_INT_BATCH_ID, 999 ); FIA_csharp.FIA_set_integer ( ( int )EnumShare.FIA_API_constants.FT_INT_N_CORES, 1 ); string version = FIA_csharp.FIA_get_version(); Console.Write ( "Running version " ); Console.Write ( version ); Console.WriteLine(); FIA_csharp.FIA_run(); // Extract results from output matrix. In this case, there is no benchmark, so some of the // entries will be empty stringmatrix results; results = FIA_csharp.FIA_get_matrix( ( int )EnumShare.FIA_API_constants.FT_MATRIX_RESULTS ); Console.WriteLine( "DATE,PORTFOLIO,BENCHMARK,SECURITY,SOURCE,w,W,r,R" ); for ( int i = 0; i < results.Count; i++ ) { stringvector r = results[i]; for ( int j = 0; j < r.Count; j++ ) { Console.Write( r[j] ); Console.Write( "," ); } Console.WriteLine(); } } }