Exemple #1
0
        public int getStockData(SqlHandler handle, string stock, DateTime startDt, DateTime endDt)
        {
            try
            {
                string yahooURL = @"http://ichart.finance.yahoo.com/table.csv?s=" + stock
                                  + "&a=" + (startDt.Month - 1).ToString()
                                  + "&b=" + startDt.Day.ToString()
                                  + "&c=" + startDt.Year.ToString()
                                  + "&d=" + (endDt.Month - 1).ToString()
                                  + "&e=" + endDt.Day.ToString()
                                  + "&f=" + endDt.Year.ToString()
                                  + "&g=d&ignore=.csv";

                HttpWebRequest  webreq  = (HttpWebRequest)WebRequest.Create(yahooURL);
                HttpWebResponse webresp = (HttpWebResponse)webreq.GetResponse();
                StreamReader    strm    = new StreamReader(webresp.GetResponseStream(), Encoding.ASCII);

                string   stk_data  = strm.ReadToEnd();
                char[]   newLine   = { '\n' };
                char[]   comma     = { ',' };
                string[] stk_lines = stk_data.Split(newLine, StringSplitOptions.RemoveEmptyEntries);

                string insertCmd = "";
                int    i         = 0;
                foreach (string line in stk_lines)
                {
                    i++;
                    if (line.Contains("Date"))
                    {
                        continue;
                    }
                    // Console.WriteLine(line);
                    string[] fields = line.Split(comma, StringSplitOptions.RemoveEmptyEntries);
                    insertCmd += "INSERT INTO stock_tbl VALUES ('" + stock + "'" + ",";
                    insertCmd += "'" + fields[0] + "',";
                    insertCmd += fields[6] + ")\n";

                    // Console.WriteLine(cmd);
                    if (i % 10 == 0)
                    {
                        // insert in batches
                        handle.executeNonQuery(insertCmd);
                        insertCmd = "";
                    }
                }
                if (insertCmd != "")
                {
                    // insert remaining
                    handle.executeNonQuery(insertCmd);
                }
            }
            catch (Exception e)
            {
                //Console.WriteLine(stock + " : " + e.Message);
                return(-1);
            }
            return(0);
        }
        static void calculateAndStoreBetas(SqlHandler sqlHandle, string stock, List <StockData> data, int rollingWindow)
        {
            string insertBetasCmd = "";

            if (data.Count <= rollingWindow)
            {
                // no history
                return;
            }

            for (int i = rollingWindow + 1; i < data.Count; ++i)
            {
                bool          stockPriceExistsAllDates = true;
                List <double> mktReturns = new List <double>();
                List <double> stkReturns = new List <double>();

                // history
                for (int j = i - rollingWindow; j < i; ++j)
                {
                    if (!data[j].get_stkprc().HasValue || !data[j - 1].get_stkprc().HasValue ||
                        data[j].get_stkprc().Value == 0 || data[j - 1].get_stkprc().Value == 0)
                    {
                        // cannot calculate returns and hence cannot calculate beta
                        stockPriceExistsAllDates = false;
                        break;
                    }
                    double stkRet = (data[j].get_stkprc().Value - data[j - 1].get_stkprc().Value) / data[j - 1].get_stkprc().Value;
                    double mktRet = (data[j].get_mktprc() - data[j - 1].get_mktprc()) / data[j - 1].get_mktprc();
                    stkReturns.Add(stkRet);
                    mktReturns.Add(mktRet);
                }

                if (stockPriceExistsAllDates)
                {
                    double covar = StatMath.covariance(mktReturns, stkReturns);
                    double beta  = covar / StatMath.variance(mktReturns);
                    insertBetasCmd += "INSERT INTO betas_tbl VALUES ('" + stock + "', ";
                    insertBetasCmd += "'" + data[i].get_dt().Year.ToString()
                                      + "-" + data[i].get_dt().Month.ToString()
                                      + "-" + data[i].get_dt().Day.ToString() + "'";
                    insertBetasCmd += ", " + beta.ToString();
                    insertBetasCmd += ", " + covar.ToString() + ")\n";

                    if (i % 10 == 0)
                    {
                        // insert in batches
                        sqlHandle.executeNonQuery(insertBetasCmd);
                        insertBetasCmd = "";
                    }
                }
            }

            if (insertBetasCmd != "")
            {
                // output last remaining betas
                sqlHandle.executeNonQuery(insertBetasCmd);
            }
        }