diff --git a/MarketData/MarketData/Services/MainService.cs b/MarketData/MarketData/Services/MainService.cs index 2c6d27a..d9501c5 100755 --- a/MarketData/MarketData/Services/MainService.cs +++ b/MarketData/MarketData/Services/MainService.cs @@ -330,9 +330,10 @@ namespace MarketData.Services foreach(String symbol in symbols) { double betaCalc36=BetaGenerator.Beta(symbol,date,36); + double betaCalc24=BetaGenerator.Beta(symbol,date,24); double betaCalc06=BetaGenerator.Beta(symbol,date,6); - if(double.IsNaN(betaCalc36) && double.IsNaN(betaCalc06))continue; - FundamentalDA.UpdateBeta(symbol, date, betaCalc36, betaCalc06); + if(double.IsNaN(betaCalc36) && double.IsNaN(betaCalc24) && double.IsNaN(betaCalc06))continue; + FundamentalDA.UpdateBeta(symbol, date, betaCalc36, betaCalc24, betaCalc06); } } MDTrace.WriteLine($"Total took {profiler.End()} (ms)"); diff --git a/MarketData/MarketDataLib/DataAccess/FundamentalDA.cs b/MarketData/MarketDataLib/DataAccess/FundamentalDA.cs index 633d8bd..089416a 100755 --- a/MarketData/MarketDataLib/DataAccess/FundamentalDA.cs +++ b/MarketData/MarketDataLib/DataAccess/FundamentalDA.cs @@ -92,10 +92,10 @@ namespace MarketData.DataAccess } /// - /// Updates the beta36 and bet6 for a symbol for a specific date + /// Updates the beta36, beta24, and bet06 for a symbol for a specific date /// /// - public static bool UpdateBeta(String symbol,DateTime asof,double beta36, double beta06) + public static bool UpdateBeta(String symbol,DateTime asof,double beta36, double beta24, double beta06) { MySqlConnection sqlConnection = null; MySqlTransaction sqlTransaction = null; @@ -110,12 +110,20 @@ namespace MarketData.DataAccess sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data")); sqlTransaction = sqlConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); sb.Append("update fundamentals set "); + sb.Append("beta_calc_36="); if (!Double.IsNaN(beta36)) sb.Append(beta36).Append(","); else sb.Append("null").Append(","); + + sb.Append("beta_calc_24="); + if (!Double.IsNaN(beta24)) sb.Append(beta24).Append(","); + else sb.Append("null").Append(","); + + sb.Append("beta_calc_06="); if (!Double.IsNaN(beta06)) sb.Append(beta06); else sb.Append("null"); + sb.Append(" where "); sb.Append("symbol='").Append(symbol).Append("' and asof =").Append(SqlUtils.ToSqlDate(asof,true)); strQuery = sb.ToString(); @@ -330,7 +338,7 @@ namespace MarketData.DataAccess { StringBuilder sb = new StringBuilder(); sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data")); - sb.Append("select symbol,asof,next_earnings_date,beta,low52,high52,volume,market_cap,pe,eps,peg,return_on_assets,return_on_equity,total_cash,total_debt,shares_outstanding,revenue,revenue_per_share,qtrly_revenue_growth,gross_profit,ebitda,net_income_available_to_common,book_value_per_share,operating_cashflow,leveraged_free_cashflow,book_value_per_share*shares_outstanding as equity,trailing_pe,ebit,enterprise_value,source,beta_calc_36,beta_calc_06 from fundamentals where symbol="); + sb.Append("select symbol,asof,next_earnings_date,beta,low52,high52,volume,market_cap,pe,eps,peg,return_on_assets,return_on_equity,total_cash,total_debt,shares_outstanding,revenue,revenue_per_share,qtrly_revenue_growth,gross_profit,ebitda,net_income_available_to_common,book_value_per_share,operating_cashflow,leveraged_free_cashflow,book_value_per_share*shares_outstanding as equity,trailing_pe,ebit,enterprise_value,source,beta_calc_36,beta_calc_06,beta_calc_24 from fundamentals where symbol="); sb.Append("'").Append(symbol).Append("'").Append(" "); sb.Append("and asof=(select max(asof) from fundamentals where symbol='").Append(symbol).Append("')"); strQuery = sb.ToString(); ; @@ -371,6 +379,7 @@ namespace MarketData.DataAccess if (!sqlDataReader.IsDBNull(29)) fundamental.Source = sqlDataReader.GetString(29); if (!sqlDataReader.IsDBNull(30)) fundamental.BetaCalc36 = sqlDataReader.GetDouble(30); if (!sqlDataReader.IsDBNull(31)) fundamental.BetaCalc06 = sqlDataReader.GetDouble(31); + if (!sqlDataReader.IsDBNull(32)) fundamental.BetaCalc24 = sqlDataReader.GetDouble(32); BalanceSheet balanceSheet=BalanceSheetDA.GetBalanceSheetOnOrBefore(symbol,fundamental.AsOf,BalanceSheet.PeriodType.Annual); if(null!=balanceSheet&&!double.IsNaN(balanceSheet.TotalStockHolderEquity)&&!double.IsNaN(fundamental.TotalDebt)&&0!=fundamental.TotalDebt)fundamental.DebtToEquity=fundamental.TotalDebt/balanceSheet.TotalStockHolderEquity; return fundamental; @@ -398,7 +407,7 @@ namespace MarketData.DataAccess { StringBuilder sb = new StringBuilder(); sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data")); - sb.Append("select symbol,asof,next_earnings_date,beta,low52,high52,volume,market_cap,pe,eps,peg,return_on_assets,return_on_equity,total_cash,total_debt,shares_outstanding,revenue,revenue_per_share,qtrly_revenue_growth,gross_profit,ebitda,net_income_available_to_common,book_value_per_share,operating_cashflow,leveraged_free_cashflow,book_value_per_share*shares_outstanding as equity,trailing_pe,ebit,enterprise_value,source,beta_calc_36,beta_calc_06 from fundamentals where symbol="); + sb.Append("select symbol,asof,next_earnings_date,beta,low52,high52,volume,market_cap,pe,eps,peg,return_on_assets,return_on_equity,total_cash,total_debt,shares_outstanding,revenue,revenue_per_share,qtrly_revenue_growth,gross_profit,ebitda,net_income_available_to_common,book_value_per_share,operating_cashflow,leveraged_free_cashflow,book_value_per_share*shares_outstanding as equity,trailing_pe,ebit,enterprise_value,source,beta_calc_36,beta_calc_06,beta_calc_24 from fundamentals where symbol="); sb.Append("'").Append(symbol).Append("'").Append(" "); sb.Append("and asof=").Append("'").Append(Utility.DateTimeToStringYYYYHMMHDD(asof)).Append("'").Append(";"); strQuery = sb.ToString(); ; @@ -439,7 +448,8 @@ namespace MarketData.DataAccess if (!sqlDataReader.IsDBNull(28)) fundamental.EnterpriseValue = sqlDataReader.GetDouble(28); if (!sqlDataReader.IsDBNull(29)) fundamental.Source = sqlDataReader.GetString(29); if (!sqlDataReader.IsDBNull(30)) fundamental.BetaCalc36 = sqlDataReader.GetDouble(30); - if (!sqlDataReader.IsDBNull(3)) fundamental.BetaCalc06 = sqlDataReader.GetDouble(31); + if (!sqlDataReader.IsDBNull(31)) fundamental.BetaCalc06 = sqlDataReader.GetDouble(31); + if (!sqlDataReader.IsDBNull(32)) fundamental.BetaCalc24 = sqlDataReader.GetDouble(32); if (null != balanceSheet && !double.IsNaN(balanceSheet.TotalStockHolderEquity) && !double.IsNaN(fundamental.TotalDebt) && 0 != fundamental.TotalDebt) { fundamental.DebtToEquity=fundamental.TotalDebt/balanceSheet.TotalStockHolderEquity; @@ -518,7 +528,7 @@ namespace MarketData.DataAccess { StringBuilder sb = new StringBuilder(); sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data")); - sb.Append("SELECT A.asof,A.symbol, A.market_cap,A.ebitda,A.pe,A.revenue_per_share,A.beta,A.beta_calc_36,A.beta_calc_06 FROM fundamentals A JOIN "); + sb.Append("SELECT A.asof,A.symbol, A.market_cap,A.ebitda,A.pe,A.revenue_per_share,A.beta,A.beta_calc_36,A.beta_calc_06,A.beta_calc_24 FROM fundamentals A JOIN "); sb.Append("(SELECT MAX(asof) asof,symbol FROM fundamentals WHERE asof<=").Append("'"); sb.Append(Utility.DateTimeToStringYYYYHMMHDD(tradeDate.Date)); sb.Append("'"); @@ -540,6 +550,7 @@ namespace MarketData.DataAccess if(!sqlDataReader.IsDBNull(6)) fundamental.Beta = sqlDataReader.GetDouble(6); if(!sqlDataReader.IsDBNull(7)) fundamental.BetaCalc36 = sqlDataReader.GetDouble(7); if(!sqlDataReader.IsDBNull(8)) fundamental.BetaCalc06 = sqlDataReader.GetDouble(8); + if(!sqlDataReader.IsDBNull(9)) fundamental.BetaCalc24 = sqlDataReader.GetDouble(9); if(!fundamentals.ContainsKey(fundamental.Symbol))fundamentals.Add(fundamental.Symbol,fundamental); } return fundamentals; @@ -570,7 +581,7 @@ namespace MarketData.DataAccess if(null==maxDate)return null; StringBuilder sb = new StringBuilder(); sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data")); - sb.Append("select symbol,asof,next_earnings_date,beta,low52,high52,volume,market_cap,pe,eps,peg,return_on_assets,return_on_equity,total_cash,total_debt,shares_outstanding,revenue,revenue_per_share,qtrly_revenue_growth,gross_profit,ebitda,net_income_available_to_common,book_value_per_share,operating_cashflow,leveraged_free_cashflow,book_value_per_share*shares_outstanding as equity,trailing_pe,ebit,enterprise_value,source,beta_calc_36,beta_calc_06 from fundamentals where symbol="); + sb.Append("select symbol,asof,next_earnings_date,beta,low52,high52,volume,market_cap,pe,eps,peg,return_on_assets,return_on_equity,total_cash,total_debt,shares_outstanding,revenue,revenue_per_share,qtrly_revenue_growth,gross_profit,ebitda,net_income_available_to_common,book_value_per_share,operating_cashflow,leveraged_free_cashflow,book_value_per_share*shares_outstanding as equity,trailing_pe,ebit,enterprise_value,source,beta_calc_36,beta_calc_06,beta_calc_24 from fundamentals where symbol="); sb.Append("'").Append(symbol).Append("'").Append(" "); sb.Append("and asof=").Append("'").Append(Utility.DateTimeToStringYYYYHMMHDD(maxDate.Value)).Append("'"); sb.Append(" limit 1"); @@ -613,6 +624,7 @@ namespace MarketData.DataAccess if (!sqlDataReader.IsDBNull(29)) fundamental.Source = sqlDataReader.GetString(29); if (!sqlDataReader.IsDBNull(30)) fundamental.BetaCalc36 = sqlDataReader.GetDouble(30); if (!sqlDataReader.IsDBNull(31)) fundamental.BetaCalc06 = sqlDataReader.GetDouble(31); + if (!sqlDataReader.IsDBNull(32)) fundamental.BetaCalc24 = sqlDataReader.GetDouble(32); if (!double.IsNaN(totalStockHolderEquity) && !double.IsNaN(fundamental.TotalDebt)) { if(0.00==totalStockHolderEquity)fundamental.TotalDebt=0.00; @@ -648,7 +660,7 @@ namespace MarketData.DataAccess { Fundamental fundamental = fundamentals[index]; StringBuilder sb = new StringBuilder(); - sb.Append("insert into fundamentals (symbol,asof,next_earnings_date,beta,beta_calc_36,beta_calc_06,low52,high52,volume,market_cap,pe,eps,peg,return_on_assets,return_on_equity,total_cash,total_debt,shares_outstanding,revenue,revenue_per_share,qtrly_revenue_growth,gross_profit,ebitda,net_income_available_to_common,book_value_per_share,operating_cashflow,leveraged_free_cashflow,trailing_pe,ebit,enterprise_value,source) "); + sb.Append("insert into fundamentals (symbol,asof,next_earnings_date,beta,beta_calc_36,beta_calc_24,beta_calc_06,low52,high52,volume,market_cap,pe,eps,peg,return_on_assets,return_on_equity,total_cash,total_debt,shares_outstanding,revenue,revenue_per_share,qtrly_revenue_growth,gross_profit,ebitda,net_income_available_to_common,book_value_per_share,operating_cashflow,leveraged_free_cashflow,trailing_pe,ebit,enterprise_value,source) "); sb.Append("values("); sb.Append("'").Append(fundamental.Symbol).Append("'").Append(","); sb.Append("'").Append(Utility.DateTimeToStringYYYYHMMHDD(fundamental.AsOf)).Append("'").Append(","); @@ -658,6 +670,8 @@ namespace MarketData.DataAccess else sb.Append("null").Append(","); if (!Double.IsNaN(fundamental.BetaCalc36)) sb.Append(fundamental.BetaCalc36).Append(","); else sb.Append("null").Append(","); + if (!Double.IsNaN(fundamental.BetaCalc24)) sb.Append(fundamental.BetaCalc24).Append(","); + else sb.Append("null").Append(","); if (!Double.IsNaN(fundamental.BetaCalc06)) sb.Append(fundamental.BetaCalc06).Append(","); else sb.Append("null").Append(","); if (!Double.IsNaN(fundamental.Low52)) sb.Append(fundamental.Low52).Append(","); @@ -744,7 +758,7 @@ namespace MarketData.DataAccess sqlTransaction = sqlConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); DeleteFundamental(fundamental, sqlConnection, sqlTransaction); StringBuilder sb = new StringBuilder(); - sb.Append("insert into fundamentals (symbol,asof,next_earnings_date,beta,beta_calc_36,beta_calc_06,low52,high52,volume,market_cap,pe,eps,peg,return_on_assets,return_on_equity,total_cash,total_debt,shares_outstanding,revenue,revenue_per_share,qtrly_revenue_growth,gross_profit,ebitda,net_income_available_to_common,book_value_per_share,operating_cashflow,leveraged_free_cashflow,trailing_pe,ebit,enterprise_value,source) "); + sb.Append("insert into fundamentals (symbol,asof,next_earnings_date,beta,beta_calc_36,beta_calc_24,beta_calc_06,low52,high52,volume,market_cap,pe,eps,peg,return_on_assets,return_on_equity,total_cash,total_debt,shares_outstanding,revenue,revenue_per_share,qtrly_revenue_growth,gross_profit,ebitda,net_income_available_to_common,book_value_per_share,operating_cashflow,leveraged_free_cashflow,trailing_pe,ebit,enterprise_value,source) "); sb.Append("values("); sb.Append("'").Append(fundamental.Symbol).Append("'").Append(","); sb.Append("'").Append(Utility.DateTimeToStringYYYYHMMHDD(fundamental.AsOf)).Append("'").Append(","); @@ -754,6 +768,8 @@ namespace MarketData.DataAccess else sb.Append("null").Append(","); if (!Double.IsNaN(fundamental.BetaCalc36)) sb.Append(fundamental.BetaCalc36).Append(","); else sb.Append("null").Append(","); + if (!Double.IsNaN(fundamental.BetaCalc24)) sb.Append(fundamental.BetaCalc24).Append(","); + else sb.Append("null").Append(","); if (!Double.IsNaN(fundamental.BetaCalc06)) sb.Append(fundamental.BetaCalc06).Append(","); else sb.Append("null").Append(","); if (!Double.IsNaN(fundamental.Low52)) sb.Append(fundamental.Low52).Append(","); diff --git a/MarketData/MarketDataLib/Helper/FundamentalMarketDataHelper.cs b/MarketData/MarketDataLib/Helper/FundamentalMarketDataHelper.cs index 3ce8a18..4f0a540 100755 --- a/MarketData/MarketDataLib/Helper/FundamentalMarketDataHelper.cs +++ b/MarketData/MarketDataLib/Helper/FundamentalMarketDataHelper.cs @@ -52,7 +52,6 @@ namespace MarketData.Helper ThreadHelper fundamentalThreadHelper = new ThreadHelper(symbol,modified,availableEvents[index]); fundamentalThreadHelper.UpdateManager=updateManager; ThreadPool.QueueUserWorkItem(ThreadPoolCallbackLoadFundamental, fundamentalThreadHelper); -// try{Thread.Sleep(2000);}catch(Exception){;} // adding a short pause between requests try{Thread.Sleep(1000);}catch(Exception){;} // changing this because I am going to run a test against TOR } else @@ -221,6 +220,7 @@ namespace MarketData.Helper Fundamental priorFundamental=FundamentalDA.GetFundamental(symbol); fundamental.MergeFrom(priorFundamental); // if any fields are missing on this run then carry forward fields from previous run fundamental.BetaCalc36=BetaGenerator.Beta(fundamental.Symbol,fundamental.AsOf,36); + fundamental.BetaCalc24=BetaGenerator.Beta(fundamental.Symbol,fundamental.AsOf,24); fundamental.BetaCalc06=BetaGenerator.Beta(fundamental.Symbol,fundamental.AsOf,6); FundamentalDA.InsertFundamental(fundamental); MDTrace.WriteLine(LogLevel.DEBUG,Fundamental.Header); @@ -247,6 +247,7 @@ namespace MarketData.Helper Fundamental priorFundamental=FundamentalDA.GetFundamental(symbol); fundamental.MergeFrom(priorFundamental); // if any fields are missing on this run then carry forward fields from previous run fundamental.BetaCalc36=BetaGenerator.Beta(fundamental.Symbol,fundamental.AsOf,36); + fundamental.BetaCalc24=BetaGenerator.Beta(fundamental.Symbol,fundamental.AsOf,24); fundamental.BetaCalc06=BetaGenerator.Beta(fundamental.Symbol,fundamental.AsOf,6); FundamentalDA.InsertFundamental(fundamental); MDTrace.WriteLine(LogLevel.DEBUG,Fundamental.Header); diff --git a/MarketData/MarketDataLib/MarketDataModel/FundamentalV2.cs b/MarketData/MarketDataLib/MarketDataModel/FundamentalV2.cs index a26dae2..0d0615e 100644 --- a/MarketData/MarketDataLib/MarketDataModel/FundamentalV2.cs +++ b/MarketData/MarketDataLib/MarketDataModel/FundamentalV2.cs @@ -20,9 +20,10 @@ namespace MarketData.MarketDataModel private double pe; private double ebitda; private double revenuePerShare; - private double beta; - private double betaCalc36; - private double betaCalc06; + private double beta; // 36 month beta from Yahoo Finance or FINVIZ + private double betaCalc36; // 36 month beta calculated from the Beta Generator + private double betaCalc24; // 24 month beta calculated from the Beta Generator + private double betaCalc06; // 6 month beta calculated from the Beta Generator public FundamentalV2() { @@ -66,7 +67,12 @@ namespace MarketData.MarketDataModel { get { return betaCalc36; } set { betaCalc36 = value; } - } + } + public double BetaCalc24 + { + get { return betaCalc24; } + set { betaCalc24 = value; } + } public double BetaCalc06 { get { return betaCalc06; } diff --git a/MarketData/MarketDataLib/MarketDataModel/Fundamentals.cs b/MarketData/MarketDataLib/MarketDataModel/Fundamentals.cs index 9814038..854d34e 100755 --- a/MarketData/MarketDataLib/MarketDataModel/Fundamentals.cs +++ b/MarketData/MarketDataLib/MarketDataModel/Fundamentals.cs @@ -17,9 +17,10 @@ namespace MarketData.MarketDataModel private String symbol; private DateTime asOf; private DateTime nextEarningsDate; - private double beta; - private double betaCalc36; - private double betaCalc06; + private double beta; // 36 month beta retrieved from Yahoo Finance or FINVIZ + private double betaCalc36; // 36 month beta calculated with the Beta Generator + private double betaCalc24; // 24 month beta calculated with the Beta Generator + private double betaCalc06; // 6 month beta calculated with the Beta Generator private double low52; private double high52; private Int64 volume; @@ -81,6 +82,11 @@ namespace MarketData.MarketDataModel get { return betaCalc36; } set { betaCalc36 = value; } } + public double BetaCalc24 + { + get { return betaCalc24; } + set { betaCalc24 = value; } + } public double BetaCalc06 { get { return betaCalc06; } @@ -342,6 +348,7 @@ namespace MarketData.MarketDataModel sb.Append("NextEarningsDate").Append(","); sb.Append("Beta").Append(","); sb.Append("BetaCalc36").Append(","); + sb.Append("BetaCalc24").Append(","); sb.Append("BetaCalc06").Append(","); sb.Append("Low52").Append(","); sb.Append("High52").Append(","); @@ -381,6 +388,7 @@ namespace MarketData.MarketDataModel sb.Append(Utility.DateTimeToStringMMSDDSYYYY(NextEarningsDate)).Append(","); sb.Append(String.Format("{0:0.00}",Beta )).Append(","); sb.Append(String.Format("{0:0.00}",BetaCalc36 )).Append(","); + sb.Append(String.Format("{0:0.00}",BetaCalc24 )).Append(","); sb.Append(String.Format("{0:0.00}",BetaCalc06 )).Append(","); sb.Append(String.Format("{0:0.00}",Low52)).Append(","); sb.Append(String.Format("{0:0.00}",High52)).Append(",");