public void compute(DateTime startDate, DateTime endDate, int steps = 40) { var tradedays = dateRepo.GetStockTransactionDate(startDate, endDate); var etfall = stockMinutelyRepo.GetStockTransaction(code, tradedays.First(), tradedays.Last()); int duration = 5; int minutes = 240; //var distribution0 = getDistribution(etfall, 500, tradedays.Count()-1, 240); //ListToCSV.SaveDataToCSVFile<double>(distribution0, ListToCSV.CreateFile("E:\\result\\vd\\", "distribution"), "distribution"); for (int i = steps + 1; i < tradedays.Count(); i++) { List <double> bigVolume = new List <double>(); int endDateNum = i - 1; int startDateNum = Math.Max((i - steps - 1), 0); var distribution = getDistribution(etfall, startDateNum, endDateNum, minutes); var fluctuation = getFluctuation(etfall, startDateNum, endDateNum, minutes, duration); var distributionToday = getDistributionToday(etfall, distribution, i, minutes); for (int j = 0; j < minutes - duration; j++) { if (distributionToday[j] - distribution[j] > 0.002) { bigVolume.Add((etfall[i * minutes + j + duration].Close / etfall[i * minutes + j].Close - 1)); } } var all = ListExtension.mean(fluctuation); var today = ListExtension.mean(bigVolume); Console.WriteLine("Date:{0},all:{1}, today:{2}!", etfall[i * minutes].DateTime.Date.ToString(), Math.Round(all, 5), Math.Round(today, 5)); } }
public void record(DateTime startDate, DateTime endDate) { var tradedays = dateRepo.GetStockTransactionDate(startDate, endDate); //CreateDBOrTableIfNecessary(startDate); //CreateDBOrTableIfNecessary(startDate.AddYears(1)); //var start = startDate; //while (start < endDate) //{ // if (!ExistInSqlServer(start)) // { // CreateDBOrTableIfNecessary(start); // } // start = start.AddYears(1); //} //if (!ExistInSqlServer(endDate)) //{ // CreateDBOrTableIfNecessary(endDate); //} foreach (var date in tradedays) { var etf = stockRepo.GetStockTransaction(underlying, date, date); } }
private double getVolatilityMinutly(string code, DateTime today, int period) { double vol = 0; int num = 0; DateTime start = DateUtils.PreviousTradeDay(today, period); DateTime end = DateUtils.PreviousTradeDay(today, 1); var tradedays = dateRepo.GetStockTransactionDate(start, end); foreach (var date in tradedays) { var data = stockMinuteRepo.GetStockTransaction(code, date, date); if (data.Count == 0) { continue; } List <double> priceList = new List <double>(); for (int i = 1; i < data.Count() - 1; i++) { priceList.Add(data[i].Close); } double volToday = getVolatility(priceList); vol += volToday; num += 1; } if (num > 0) { vol = vol / num; } return(vol); }
/// <summary> /// 获取每个交易日的全部期货 /// </summary> /// <param name="startDate"></param> /// <param name="endDate"></param> private void getAllData(DateTime startDate, DateTime endDate) { var tradedays = dateRepo.GetStockTransactionDate(startDate, endDate); foreach (var date in tradedays) { var dataDaily = new Dictionary <string, List <StockTransaction> >(); var list = getFutureList(date, 4); var indexData = stockMinutelyRepo.GetStockTransaction(indexCode, date, date); dataDaily.Add(indexCode, indexData); foreach (var item in list) { var data = stockMinutelyRepo.GetStockTransaction(item.Key, date, date); data.RemoveAt(241); data.RemoveAt(0); dataDaily.Add(item.Key, data); } allData.Add(date, dataDaily); } }
private void getStockTickData(string code) { foreach (var date in tradedays) { var tick = tickRepo.GetStockTransaction(code, date, date); var day = stockDailyRepo.GetStockTransaction("510050.SH", date, date); double open = day[0].Open; var minute = tranferTickToMinuteDayByDay(code, date, open, tick); var minute2 = stockMinutelyRepo.GetStockTransaction("510050.SH", date, date); } }
public void compute(DateTime startDate, DateTime endDate) { var tradedays = dateRepo.GetStockTransactionDate(startDate, endDate); List <StockTransaction> codeDaily = new List <StockTransaction>(); List <StockTransaction> underlyingCodeDaily = new List <StockTransaction>(); //获取分钟线数据 foreach (var date in tradedays) { var underlyingToday = stockMinutelyRepo.GetStockTransaction(underlyingCode, date, date); underlyingCodeDaily.AddRange(underlyingToday); var codeToday = stockMinutelyRepo.GetStockTransaction(code, date, date); codeDaily.AddRange(codeToday); } double k1 = 0, k2 = 0, trailParameter = 0; //getParameter(tradedays, underlyingCodeDaily, codeDaily, ref k1, ref k2, ref trailParameter); k1 = 2.8; k2 = 2.8; trailParameter = 0.004; double sharpe = computeChoiceParameter(tradedays, underlyingCodeDaily, codeDaily, k1, k2, trailParameter); }
private void getAllStocks(List <stockInfo> info) { foreach (var stock in info) { DateTime startDate = stock.startDate; DateTime endDate = stock.endDate; string code = stock.code; var tradedays = dateRepo.GetStockTransactionDate(startDate, endDate); Dictionary <DateTime, List <StockTransaction> > thisStock = new Dictionary <DateTime, List <StockTransaction> >(); foreach (var date in tradedays) { var stockMinuteData0 = stockMinutelyRepo.GetStockTransaction(code, date, date); thisStock.Add(date, stockMinuteData0); } allStocks.Add(code, thisStock); } }
public void compute(DateTime startDate, DateTime endDate) { var tradedays = dateRepo.GetStockTransactionDate(startDate, endDate); //获取日线数据 var underlyingDaily = stockDailyRepo.GetStockTransaction(code, tradedays.First(), tradedays.Last()); //获取分钟线数据 foreach (var date in tradedays) { var underlyingToday = stockMinutelyRepo.GetStockTransaction(code, date, date); underlying.Add(date, underlyingToday); minutes = underlyingToday.Count(); underlyingAll.AddRange(underlyingToday); } double bestSharpe = 0; double bestf1 = 0.64; double bestf2 = 0.48; double bestf3 = 0.08; double step = 0.04; //for (int i = 1; i <= 1/step; i=i+1) //{ // for (int j = 1; j <= 1 / step; j = j + 1) // { // for (int k = 1; k <= 1 / step; k = k + 1) // { // double f1 = i * step; // double f2 = j * step; // double f3 = k * step; // double[] netvalue0 = getPerformance(startDate, endDate, tradedays, underlyingDaily, f1, f2, f3); // var nv = getNetValueCurveDaily(getNetValueDaily(underlyingAll, netvalue0)); // double sharpe = Utilities.strategyPerformance.sharpeRatioByDailyNetValue(nv); // if (sharpe>bestSharpe) // { // bestf1 = f1; // bestf2 = f2; // bestf3 = f3; // bestSharpe = sharpe; // Console.WriteLine("Best parameters:f1={0}, f2={1}, f3={2}, sharpe={3}", f1, f2, f3, sharpe); // } // } // } //} double[] netvalue = getPerformance(startDate, endDate, tradedays, underlyingDaily, bestf1, bestf2, bestf3); var nvDaily = getNetValueDaily(underlyingAll, netvalue); DataTableExtension.SaveCSV(DataTableExtension.ToDataTable <netvalueDaily>(nvDaily), "E:\\result\\break\\netvalue.csv"); statisticDataOfTransaction(transactionData, tradedays); double mean = 0; double num = 0; for (int i = -5; i <= 5; i = i + 1) { for (int j = -5; j <= 5; j = j + 1) { for (int k = -5; k <= 5; k = k + 1) { double f1 = bestf1 + i * step * 0.25; double f2 = bestf2 + j * step * 0.25; double f3 = bestf3 + k * step * 0.25; if (f1 <= 0 || f2 <= 0 || f3 <= 0) { continue; } double[] netvalue0 = getPerformance(startDate, endDate, tradedays, underlyingDaily, f1, f2, f3); var nv = getNetValueCurveDaily(getNetValueDaily(underlyingAll, netvalue0)); double sharpe = Utilities.strategyPerformance.sharpeRatioByDailyNetValue(nv); mean += sharpe; num += 1; Console.WriteLine("parameters around best:f1={0}, f2={1}, f3={2}, sharpe={3}", f1, f2, f3, sharpe); } } } Console.WriteLine("mean:{0}", mean / num); }
public void compute(DateTime startDate, DateTime endDate) { var tradedays = dateRepo.GetStockTransactionDate(startDate, endDate); var choice = new Dictionary <DateTime, List <CFEFuturesChoice> >(); string myHoldStr = ""; var tradeRecord = new List <CFEFuturesTradeRecord>(); var parameters = startDate.ToShortDateString() + '_' + endDate.ToShortDateString() + "_treshold" + treshold.ToString() + "_slip" + slip.ToString(); if (!ExistInSqlServer(code, parameters)) { CreateDBOrTableIfNecessary(code, parameters); } DataTable dt = new DataTable(); dt.Columns.Add("code"); dt.Columns.Add("tdatetime", typeof(DateTime)); dt.Columns.Add("expiredate", typeof(DateTime)); dt.Columns.Add("indexPrice"); dt.Columns.Add("price"); dt.Columns.Add("annulizedBasis"); foreach (var date in tradedays) { var list = getFutureList(date); var index = stockMinutelyRepo.GetStockTransaction(indexCode, date, date); var dataList = new Dictionary <string, List <StockTransaction> >(); var holdNow = new CFEFutures(); var choiceToday = new List <CFEFuturesChoice>(); if (myHoldStr != "") { holdNow = list[myHoldStr]; } foreach (var item in list) { var data = stockMinutelyRepo.GetStockTransaction(item.Key, date, date); dataList.Add(item.Key, data); } for (int i = 5; i < 235; i++) { DateTime expireDate = new DateTime(); CFEFuturesChoice record = new CFEFuturesChoice(); double basis = -10000; if (myHoldStr == "") { var transaction = new CFEFuturesTradeRecord(); foreach (var item in list) { double basisNow = getAnuualizedBasis(item.Value, date, dataList[item.Value.code][i].Close, index[i].Close); if (basisNow > basis) { holdNow = item.Value; basis = basisNow; expireDate = item.Value.expireDate; myHoldStr = item.Key; transaction.code = item.Key; transaction.indexPrice = index[i].Close; transaction.price = dataList[item.Value.code][i].Close; transaction.time = index[i].DateTime; transaction.direction = -1; transaction.expireDate = item.Value.expireDate; } } //第一次开仓 tradeRecord.Add(transaction); } else { double modify = 0; var closeRecord = new CFEFuturesTradeRecord(); var transaction = new CFEFuturesTradeRecord(); var latestBasis = tradeRecord.Last().price - tradeRecord.Last().indexPrice; var latestTime = tradeRecord.Last().time; var latestExpireDate = tradeRecord.Last().expireDate; var latestAnnulizedBasis = getAnuualizedBasis2(latestBasis, latestTime, latestExpireDate); closeRecord.time = index[i].DateTime; closeRecord.indexPrice = index[i].Close; closeRecord.direction = 1; closeRecord.code = holdNow.code; closeRecord.price = dataList[holdNow.code][i].Close; closeRecord.expireDate = holdNow.expireDate; basis = getAnuualizedBasis(holdNow, date, dataList[holdNow.code][i].Close, index[i].Close); foreach (var item in list) { if (item.Value != holdNow) { modify = slip; } double basisNow = getAnuualizedBasis(item.Value, date, dataList[item.Value.code][i].Close - modify, index[i].Close); double annulizedBasisNow = getAnuualizedBasis2(dataList[item.Value.code][i].Close - modify + latestBasis - dataList[holdNow.code][i].Close, latestTime, item.Value.expireDate); if ((annulizedBasisNow > latestAnnulizedBasis + treshold && DateUtils.GetSpanOfTradeDays(date, item.Value.expireDate) > 10) || DateUtils.GetSpanOfTradeDays(date, holdNow.expireDate) < 5) //if (DateUtils.GetSpanOfTradeDays(date, holdNow.expireDate) < 5) { holdNow = item.Value; basis = basisNow; expireDate = item.Value.expireDate; myHoldStr = item.Key; transaction.code = item.Key; transaction.indexPrice = index[i].Close; transaction.price = dataList[item.Value.code][i].Close; transaction.time = index[i].DateTime; transaction.direction = -1; transaction.expireDate = expireDate; } } if (transaction.code != null) { tradeRecord.Add(closeRecord); tradeRecord.Add(transaction); } } record.code = holdNow.code; record.expireDate = holdNow.expireDate; record.annulizedBasis = basis; record.indexPrice = index[i].Close; record.price = dataList[holdNow.code][i].Close; choiceToday.Add(record); DataRow dr = dt.NewRow(); dr["code"] = record.code; dr["tdatetime"] = index[i].DateTime;//etf[i].TransactionDateTime; dr["expiredate"] = record.expireDate; dr["indexPrice"] = record.indexPrice; dr["price"] = record.price; dr["annulizedBasis"] = record.annulizedBasis; dt.Rows.Add(dr); } choice.Add(date, choiceToday); } var pnl = getPnL(tradeRecord); var netValue = getNetValue(tradeRecord, tradedays); Console.WriteLine(pnl); SaveResultToMssql(dt, code, parameters); DataTable dt2 = new DataTable(); dt2.Columns.Add("code"); dt2.Columns.Add("tdatetime", typeof(DateTime)); dt2.Columns.Add("expiredate", typeof(DateTime)); dt2.Columns.Add("indexPrice"); dt2.Columns.Add("price"); dt2.Columns.Add("direction"); for (int i = 0; i < tradeRecord.Count(); i++) { DataRow dr = dt2.NewRow(); var record = tradeRecord[i]; dr["code"] = record.code; dr["tdatetime"] = record.time; dr["expiredate"] = record.expireDate; dr["indexPrice"] = record.indexPrice; dr["price"] = record.price; dr["direction"] = record.direction; dt2.Rows.Add(dr); } if (!ExistInSqlServer2(code, parameters)) { CreateDBOrTableIfNecessary2(code, parameters); } SaveResultToMssql2(dt2, code, parameters); DataTable dt3 = new DataTable(); dt3.Columns.Add("code"); dt3.Columns.Add("tdatetime", typeof(DateTime)); dt3.Columns.Add("expiredate", typeof(DateTime)); dt3.Columns.Add("basis"); dt3.Columns.Add("annulizedBasis"); dt3.Columns.Add("basisWithSlip"); dt3.Columns.Add("annulizedBasisWithSlip"); for (int i = 0; i < netValue.Count(); i++) { DataRow dr = dt3.NewRow(); var record = netValue[i]; dr["code"] = record.code; dr["tdatetime"] = record.time; dr["expiredate"] = record.expireDate; dr["basis"] = record.basis; dr["annulizedBasis"] = record.annulizedBasis; dr["basisWithSlip"] = record.basisWithSlip; dr["annulizedBasisWithSlip"] = record.annulizedBasisWithSlip; dt3.Rows.Add(dr); } if (!ExistInSqlServer3(code, parameters)) { CreateDBOrTableIfNecessary3(code, parameters); } SaveResultToMssql3(dt3, code, parameters); }
public void compute(DateTime startDate, DateTime endDate, int delaynum = 5, int startnum = 3, int calculatornum = 6) { var tradedays = dateRepo.GetStockTransactionDate(startDate, endDate); var etfall = stockMinutelyRepo.GetStockTransaction(code, tradedays.First(), tradedays.Last()); modifyData(ref etfall); var netvalue = new double[etfall.Count()]; var signal = new double[etfall.Count()]; var buyStart = new double[etfall.Count()]; var buyCalculator = new double[etfall.Count()]; var longSignal = new double[etfall.Count()]; var sellStart = new double[etfall.Count()]; var sellCalculator = new double[etfall.Count()]; var shortSignal = new double[etfall.Count()]; int startnumNow = 0; int calculatornumNow = 0; //买入启动 startnumNow = 0; for (int i = delaynum; i < etfall.Count() - delaynum; i++) { if (etfall[i].Close < etfall[i - delaynum].Close) { startnumNow += 1; } else { startnumNow = 0; } if (startnumNow >= startnum) { buyStart[i] = 1; } } //买入计数 calculatornumNow = 0; double buyCalculatorStartPrice = 0; bool buyCalculatorStart = false; for (int i = delaynum; i < etfall.Count() - delaynum; i++) { if (buyStart[i - 1] == 1) { buyCalculatorStart = true; buyCalculatorStartPrice = 0; calculatornumNow = 0; } if (buyCalculatorStart == true && etfall[i].Close >= etfall[i - 2].High && etfall[i].High > etfall[i - 1].High) { if (calculatornumNow > 0 && etfall[i].Close > buyCalculatorStartPrice) { calculatornumNow += 1; buyCalculator[i] = calculatornumNow; if (calculatornumNow == calculatornum) { longSignal[i + 1] = 1; buyCalculatorStart = false; } buyCalculatorStartPrice = etfall[i].Close; } if (calculatornumNow == 0) { calculatornumNow += 1; buyCalculatorStartPrice = etfall[i].Close; } } if (calculatornumNow > 0) { buyCalculator[i] = calculatornumNow; } } //卖出启动 startnumNow = 0; for (int i = delaynum; i < etfall.Count() - delaynum; i++) { if (etfall[i].Close > etfall[i - delaynum].Close) { startnumNow += 1; } else { startnumNow = 0; } if (startnumNow >= startnum) { sellStart[i] = 1; } } //卖出计数 calculatornumNow = 0; double sellCalculatorStartPrice = 99999999; bool sellCalculatorStart = false; for (int i = delaynum; i < etfall.Count() - delaynum; i++) { if (sellStart[i - 1] == 1) { sellCalculatorStart = true; sellCalculatorStartPrice = 99999999; calculatornumNow = 0; } if (sellCalculatorStart == true && etfall[i].Close <= etfall[i - 2].Low && etfall[i].Low < etfall[i - 1].Low) { if (calculatornumNow > 0 && etfall[i].Close < sellCalculatorStartPrice) { calculatornumNow += 1; if (calculatornumNow == calculatornum) { shortSignal[i + 1] = -1; sellCalculatorStart = false; } sellCalculatorStartPrice = etfall[i].Close; } if (calculatornumNow == 0) { calculatornumNow += 1; sellCalculatorStartPrice = etfall[i].Close; } } if (calculatornumNow > 0) { sellCalculator[i] = calculatornumNow; } } // storeSignal(etfall, longSignal, shortSignal,delaynum,startnum,calculatornum); netvalue = computeNetValue(etfall, longSignal, shortSignal, ref transactionData); var nv = getNetValueDaily(etfall, netvalue); double sharpe = Utilities.strategyPerformance.sharpeRatioByDailyNetValue(nv); storeTransctionData(transactionData, delaynum, startnum, calculatornum); statisticDataOfTransaction(transactionData, tradedays); }
public void compute(DateTime startDate, DateTime endDate) { var tradedays = dateRepo.GetStockTransactionDate(startDate, endDate); var parameters = startDate.ToShortDateString() + '_' + endDate.ToShortDateString() + "frontNext"; if (!ExistInSqlServer(code, parameters)) { CreateDBOrTableIfNecessary(code, parameters); } DataTable dt = new DataTable(); dt.Columns.Add("tdatetime", typeof(DateTime)); dt.Columns.Add("future1"); dt.Columns.Add("future2"); dt.Columns.Add("expiredate1", typeof(DateTime)); dt.Columns.Add("expiredate2", typeof(DateTime)); dt.Columns.Add("duration1"); dt.Columns.Add("duration2"); dt.Columns.Add("indexPrice"); dt.Columns.Add("price1"); dt.Columns.Add("price2"); dt.Columns.Add("basis1"); dt.Columns.Add("basis2"); dt.Columns.Add("basis12"); foreach (var date in tradedays) { //var list = getSpecialFutureList(date); var list = getFutureList(date); var index = stockMinutelyRepo.GetStockTransaction(indexCode, date, date); var dataList = new Dictionary <string, List <StockTransaction> >(); var basisDataList = new List <specialBasis>(); foreach (var item in list) { var data = stockMinutelyRepo.GetStockTransaction(item.Key, date, date); dataList.Add(item.Key, data); } for (int i = 5; i <= 235; i = i + 5) { var data0 = new specialBasis(); var indexNow = index[i]; var future1 = dataList[list.Keys.First()][i]; var future2 = dataList[list.Keys.Last()][i]; data0.future1 = future1.Code; data0.future2 = future2.Code; data0.time = indexNow.DateTime; data0.expireDate1 = list[list.Keys.First()].expireDate; data0.expireDate2 = list[list.Keys.Last()].expireDate; data0.indexPrice = indexNow.Close; data0.price1 = future1.Volume == 0?future1.Close: (future1.Amount / future1.Volume) / 200; data0.price2 = future2.Volume == 0?future2.Close: (future2.Amount / future2.Volume) / 200; data0.basis1 = data0.price1 - data0.indexPrice; data0.basis2 = data0.price2 - data0.indexPrice; data0.basis12 = data0.price2 - data0.price1; data0.duration1 = DateUtils.GetSpanOfTradeDays(date, data0.expireDate1) / 252.0; data0.duration2 = DateUtils.GetSpanOfTradeDays(date, data0.expireDate2) / 252.0; basisDataList.Add(data0); } foreach (var item in basisDataList) { DataRow dr = dt.NewRow(); dr["tdatetime"] = item.time; dr["future1"] = item.future1; dr["future2"] = item.future2; dr["expireDate1"] = item.expireDate1; dr["expireDate2"] = item.expireDate2; dr["indexPrice"] = item.indexPrice; dr["price1"] = item.price1; dr["price2"] = item.price2; dr["basis1"] = item.basis1; dr["basis2"] = item.basis2; dr["basis12"] = item.basis12; dr["duration1"] = item.duration1; dr["duration2"] = item.duration2; dt.Rows.Add(dr); } } SaveResultToMssql(dt, code, parameters); }