/// <summary> /// Get all instance of agents /// </summary> /// <returns></returns> public DeepRLAgentParameters GetById(long id) { DeepRLAgentParameters agent = null; using (var ctx = new DeepQStockContext()) { ctx.Configuration.LazyLoadingEnabled = false; ctx.Configuration.ProxyCreationEnabled = false; agent = ctx.DeepRLAgentParameters.SingleOrDefault(a => a.Id == id); ctx.Entry(agent).Reference(a => a.QNetwork).Load(); ctx.Entry(agent).Reference(a => a.StockExchange).Load(); ctx.Entry(agent).Collection(a => a.Decisions).Load(); var lastDecision = agent.Decisions.LastOrDefault(); if (lastDecision != null) { ctx.Entry(lastDecision).Reference(d => d.Period).Load(); } } return(agent); }
/// <summary> /// Remove an agent with all the relations /// </summary> /// <param name="agent"></param> public void RemoveAgent(DeepRLAgentParameters agent) { ClearAgent(agent); Experiences.RemoveRange(Experiences.Where(e => e.AgentId == agent.Id)); SimulationResults.RemoveRange(SimulationResults.Where(e => e.AgentId == agent.Id)); Entry(agent).Reference(a => a.StockExchange).Load(); StockExchangeParameters.Remove(agent.StockExchange); DeepRLAgentParameters.Remove(agent); }
/// <summary> /// Save an agent /// </summary> /// <param name="agent"></param> /// <returns></returns> public long Save(DeepRLAgentParameters agent) { using (var ctx = new DeepQStockContext()) { agent.StockExchange.CsvDataFilePath = Path.Combine(Settings.CsvDataDirectory, string.Format("{0}.csv", agent.StockExchange.Symbol)); ctx.DeepRLAgentParameters.AddOrUpdate(agent); ctx.StockExchangeParameters.AddOrUpdate(agent.StockExchange); ctx.QNetworkParameters.AddOrUpdate(agent.QNetwork); ctx.SaveChanges(); } Clients.All.onCreatedAgent(agent); return(agent.Id); }
/// <summary> /// Clear Agent /// </summary> /// <param name="agent"></param> public void ClearAgent(DeepRLAgentParameters agent) { Entry(agent).Reference(a => a.StockExchange).Load(); var stockId = agent.StockExchange.Id; AverageTrueRanges.RemoveRange(AverageTrueRanges.Where(a => a.StockExchangeId == stockId)); BollingerBandsPercentBs.RemoveRange(BollingerBandsPercentBs.Where(a => a.StockExchangeId == stockId)); DMIs.RemoveRange(DMIs.Where(a => a.StockExchangeId == stockId)); ExponentialMovingAverages.RemoveRange(ExponentialMovingAverages.Where(a => a.StockExchangeId == stockId)); MACDs.RemoveRange(MACDs.Where(a => a.StockExchangeId == stockId)); RSIs.RemoveRange(RSIs.Where(a => a.StockExchangeId == stockId)); SimpleMovingAverages.RemoveRange(SimpleMovingAverages.Where(a => a.StockExchangeId == stockId)); var periodsToDelete = Periods.Where(p => p.StockExchangeId == stockId); var indicatorsToDelete = periodsToDelete.SelectMany(p => p.InternalIndicators).Distinct(); IndicatorValues.RemoveRange(indicatorsToDelete); Periods.RemoveRange(periodsToDelete); States.RemoveRange(States.Where(e => e.StockExchangeId == stockId)); OnDaysCompletes.RemoveRange(OnDaysCompletes.Where(e => e.Agent.Id == agent.Id)); }
/// <summary> /// Mains the specified arguments. /// </summary> /// <param name="args">The arguments.</param> public static void Main(string[] args) { var options = new Options(); var parsed = CommandLine.Parser.Default.ParseArguments(args, options); if (parsed && !string.IsNullOrEmpty(options.InputFile)) { var companyName = ""; var status = ""; var episodeLength = 5; var redis = ConnectionMultiplexer.Connect("localhost:6379"); var manager = new RedisManager(redis); var initialCapital = 100000; var dayNumber = 0; int totalTrainingDays = 0; var agentParameters = new DeepRLAgentParameters(); agentParameters.DiscountFactor = options.DiscountFactor > 0 ? options.DiscountFactor : agentParameters.DiscountFactor; agentParameters.eGreedyProbability = options.eGreedyProbability > 0 ? options.eGreedyProbability : agentParameters.eGreedyProbability; agentParameters.MiniBatchSize = options.MiniBatchSize > 0 ? options.MiniBatchSize : agentParameters.MiniBatchSize; agentParameters.MemoryReplaySize = options.MemoryReplaySize > 0 ? options.MemoryReplaySize : agentParameters.MemoryReplaySize; agentParameters.QNetwork.MaxIterationPerTrainging = options.MaxIterationPerTrainging > 0 ? options.MaxIterationPerTrainging : agentParameters.QNetwork.MaxIterationPerTrainging; agentParameters.QNetwork.TrainingError = options.TrainingError > 0 ? options.TrainingError : agentParameters.QNetwork.TrainingError; var agent = new DeepRLAgent(agentParameters);; var stockParameters = new StockExchangeParameters(); stockParameters.EpisodeLength = episodeLength; stockParameters.InitialCapital = initialCapital; stockParameters.SimulationVelocity = options.Velocity > 0 ? (int)(options.Velocity * 1000.0) : stockParameters.SimulationVelocity; stockParameters.TransactionCost = options.TransactionCost > 0 ? options.TransactionCost : stockParameters.TransactionCost; stockParameters.RewardCalculator = RewardCalculator.Use(RewardCalculatorType.WinningsOverLoosings); var stock = new StockExchange(stockParameters, manager, agent, null); manager.Subscribe(RedisPubSubChannels.OnDayComplete, (channel, msg) => { var a = JsonConvert.DeserializeObject <OnDayComplete>(msg); dayNumber = a.DayNumber - totalTrainingDays; initialValue = initialValue == 0.0 ? a.Period.Open : initialValue; DrawSummarySection(companyName, status, dayNumber, initialCapital, a); }); agent.OnTrainingEpochComplete += DrawStatusBar; var continueSimulated = false; companyName = options.InputFile; do { stock.DataProvider = new CsvDataProvider(companyName, episodeLength); DateTime endTraining = DateTime.Today; if (options.TrainingPhase > 0) { var firstDay = stock.DataProvider.GetAll().ToList().Select(s => s.Date).Min(); endTraining = firstDay.AddYears(options.TrainingPhase); stock.DataProvider.Seek(endDate: endTraining); status = "Etapa: Entrenamiento"; } System.Console.Clear(); System.Console.SetCursorPosition(0, 0); DrawHeaderSection(); var stockTask = Task.Run(() => stock.Run(new JobCancellationToken(false))); stockTask.Wait(); if (options.TrainingPhase > 0) { status = "Etapa: Entrenamiento Completado"; WriteLine(StatusBarLine + 5, "Etapa de entrenamiento Completada, Presione una tecla para continuar con la etapa de evaluacion... "); System.Console.ReadLine(); ClearCurrentLine(); totalTrainingDays = dayNumber; stock.TotalOfYears = 0; status = "Etapa: Evaluacion"; stock.CurrentState = null; stock.DataProvider.Seek(startDate: endTraining); //agent.Save(context); agentParameters.DiscountFactor = options.DiscountFactor > 0 ? options.DiscountFactor : agentParameters.DiscountFactor; agentParameters.eGreedyProbability = options.eGreedyProbability > 0 ? options.eGreedyProbability : agentParameters.eGreedyProbability; agentParameters.MiniBatchSize = options.MiniBatchSize > 0 ? options.MiniBatchSize : agentParameters.MiniBatchSize; agentParameters.MemoryReplaySize = options.MemoryReplaySize > 0 ? options.MemoryReplaySize : agentParameters.MemoryReplaySize; agent = new DeepRLAgent(agentParameters); stock.Agent = agent; stockTask = Task.Run(() => stock.Run(new JobCancellationToken(false))); stockTask.Wait(); } WriteLine(StatusBarLine + 5, "Simulacion Finalizada, Presione una tecla para finalizar o ingrese otro papel : "); var previousCompany = companyName; companyName = System.Console.ReadLine(); continueSimulated = !string.IsNullOrEmpty(companyName) && companyName != previousCompany; stock.CurrentState = null; } while (continueSimulated); } }