Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }