private void Main() { modelPath = projectPath + "/model/"; data = CSVToList.Read(projectPath + "/History/BTC_USD_TEST.csv"); dataSize = data[0].Count; screenDepth = dataSize * range; var json = File.ReadAllText(modelPath + "main2020_03_06_04_52_44.model"); var net = SerializationExtensions.FromJson <double>(json); double totalProfit = 0.0, totalGain = 0.0, totalLoss = 0.0, totalSpent = 0.0; for (int i = 0; i < data.Count; i++) { for (int fromTime = 0; fromTime < dataSize; fromTime++) { var toTime = fromTime + range; var input = GetData(fromTime, toTime); var inputVol = ToVolume(input); var result = net.Forward(inputVol); var state = new State(); state.state = input; state.action = GetAction(result, false); state.done = toTime < data.Count ? false : true; state.next_state = state.done ? input : GetData(fromTime + 1, toTime + 1); if (state.action == BUY) { state.price = data[toTime][LOW]; inventory.Add(state); totalSpent += state.price; } else if (state.action == SELL && inventory.Count > 0) { state.price = data[toTime][HIGH]; var reward = 0.0; inventory.ForEach(i => reward += (i.price - state.price)); inventory.Clear(); state.reward = reward; totalProfit += reward; if (reward > 0) { totalGain += reward; } else { totalLoss += reward; } } else if (state.action == HOLD) { state.price = data[toTime][LOW]; } stateMemory.Add(state); Console.WriteLine($"{ActionToString(state.action)}: {state.price} reward: {state.reward}\n"); } } Console.WriteLine($"totalGain: {totalGain}\n" + $"totalLoss: {totalLoss}\n" + $"totalSpent: {totalSpent}\n" + $"totalProfit: {totalProfit}\n" + $"av.Profit: {totalProfit / episode}\n"); Console.WriteLine(data.Count); }
private void Main() { BuilderInstance <double> .Volume = new VolumeBuilder(); modelPath = projectPath + "/model/"; dataPath = projectPath + "/History/"; while (true) { Console.WriteLine("학습할 데이터를 입력."); var line = Console.ReadLine(); if (File.Exists(dataPath + line)) { try { data = CSVToList.Read(dataPath + line); parms = line.Replace(".csv", "_"); break; } catch (Exception e) { Console.WriteLine("올바른 파일을 입력."); } } else { Console.WriteLine("파일이 존재하지 않습니다."); } } dataSize = data[0].Count; screenDepth = dataSize * range + 1; mainNet = new Net <double>(); targetNet = new Net <double>(); BuildNetwork(mainNet); BuildNetwork(targetNet); trainer = new SgdTrainer(mainNet) { LearningRate = 0.01, BatchSize = batchSize }; StringBuilder log = new StringBuilder(); parms += DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss"); do { epoch++; double totalProfit = 0.0, totalGain = 0.0, totalLoss = 0.0, totalSpent = 0.0; for (int fromTime = 0; data.Count > fromTime + range; fromTime++) { episode++; var toTime = fromTime + range; var input = GetData(fromTime, toTime); input.Add(inventory.Count); var inputVol = ToVolume(input); var result = mainNet.Forward(inputVol); var state = new State(); state.state = input; state.action = GetAction(result, false); state.done = toTime < data.Count ? false : true; if (state.action == BUY) { state.price = data[toTime][LOW]; inventory.Add(state); totalSpent += state.price; } else if (state.action == SELL) { state.price = data[toTime][HIGH]; var reward = 0.0; inventory.ForEach(i => reward += (i.price - state.price)); inventory.Clear(); state.reward = reward; totalProfit += reward; if (reward > 0) { totalGain += reward; } else { totalLoss += reward; } } else if (state.action == HOLD) { state.price = data[toTime][LOW]; } var nextInput = state.done ? input : GetData(fromTime + 1, toTime + 1); nextInput.Add(inventory.Count); state.next_state = nextInput; stateMemory.Add(state); if (stateMemory.Count > batchSize) { ExperienceReplay(); } if (episode % 10 == 0 && age > 0) { targetNet = SerializationExtensions.FromJson <double>(mainNet.ToJson()); } var _loss = averageLossMemory.Count > 0 ? averageLossMemory.Average() : 0; log.AppendLine($"{epoch},{episode},{state.action},{state.price},{totalSpent},{totalGain},{totalLoss},{totalProfit},{totalProfit / fromTime},{age},{_loss},{_loss / batchSize}"); if (episode % 1000 == 0) { Console.WriteLine($"{parms}\n" + $"epoch: {epoch}\n" + $"episode: {episode}\n" + $"totalGain: {totalGain}\n" + $"totalLoss: {totalLoss}\n" + $"totalSpent: {totalSpent}\n" + $"totalProfit: {totalProfit}\n" + $"av.Profit: {totalProfit / fromTime}\n" + $"av.Loss: {(averageLossMemory.Count > 0 ? averageLossMemory.Average() : 0)}"); File.AppendAllText(projectPath + "/log/log" + parms + ".log", log.ToString()); log.Clear(); File.AppendAllText(projectPath + "/log/loss" + parms + ".log", lossWriter.ToString()); lossWriter.Clear(); File.WriteAllText(projectPath + "/model/main" + parms + ".model", mainNet.ToJson()); File.WriteAllText(projectPath + "/model/target" + parms + ".model", targetNet.ToJson()); } } Console.WriteLine("------------------------------"); Console.WriteLine($"epoch: {epoch}\n" + $"episode: {episode}\n" + $"totalGain: {totalGain}\n" + $"totalLoss: {totalLoss}\n" + $"totalSpent: {totalSpent}\n" + $"profit: {totalProfit}\n" + $"av.Profit: {totalProfit/dataSize}\n" + $"av.Loss: {(averageLossMemory.Count > 0 ? averageLossMemory.Average() : 0)}\n"); Console.WriteLine("------------------------------"); File.AppendAllText(projectPath + "/log/log" + parms + ".log", log.ToString()); log.Clear(); File.AppendAllText(projectPath + "/log/loss" + parms + ".log", lossWriter.ToString()); lossWriter.Clear(); inventory.Clear(); stateMemory.Clear(); averageLossMemory.Clear(); qda.Net.SendMail.Send(subject: $"{parms}", body: $"epoch: {epoch}\n" + $"episode: {episode}\n" + $"totalGain: {totalGain}\n" + $"totalLoss: {totalLoss}\n" + $"totalSpent: {totalSpent}\n" + $"av.Profit: {totalProfit}\n" + $"av.Loss: {(averageLossMemory.Count > 0 ? averageLossMemory.Average() : 0)}\n"); } while (true); }