/// <summary> /// Initializes a new instance of the <see cref="StockExchange" /> class. /// </summary> /// <param name="parameters">The parameters.</param> /// <param name="manager">The manager.</param> /// <param name="agent">The agent.</param> /// <param name="provider">The provider.</param> /// <exception cref="System.Exception">You must pass a csv file path for load the simulated data</exception> public StockExchange(StockExchangeParameters parameters, RedisManager manager, DeepRLAgent agent, IDataProvider provider) { RedisManager = manager; Agent = agent; DataProvider = provider; Parameters = parameters; RewardCalculator = parameters.RewardCalculator; }
/// <summary> /// Initialize the agent and the stock exchange /// </summary> /// <param name="agentId"></param> protected void Initialize(long?agentId) { using (var DbContext = new DeepQStockContext()) { if (agentId.HasValue) { var agentParameters = DbContext.DeepRLAgentParameters .Include(a => a.QNetwork) .Include(a => a.StockExchange) .Single(a => a.Id == agentId.Value); if (agentParameters.Status == AgentStatus.Completed) { DbContext.ClearAgent(agentParameters); DbContext.SaveChanges(); } Parameters = agentParameters.StockExchange; RewardCalculator = RewardCalculator.Use(RewardCalculatorType.WinningsOverLoosings); DailyIndicators = InitializeIndicators(DbContext, PeriodType.Day); WeeklyIndicators = InitializeIndicators(DbContext, PeriodType.Week); MonthlyIndicators = InitializeIndicators(DbContext, PeriodType.Month); Agent = new DeepRLAgent(agentParameters); Agent.OnTrainingEpochComplete += (e, args) => RedisManager.Publish(RedisPubSubChannels.OnTrainingEpochComplete, JsonConvert.SerializeObject(args)); var experiences = DbContext.Experiences.Where(e => e.AgentId == agentParameters.Id).ToList(); Agent.SetExperiences(experiences); DataProvider = new CsvDataProvider(Parameters.CsvDataFilePath, Parameters.EpisodeLength); if (agentParameters.Status == AgentStatus.Paused) { CurrentState = DbContext.States.Include(s => s.InternalPeriods).Single(s => s.StockExchangeId == Parameters.Id); DataProvider.Seek(CurrentState.Today.Date.AddDays(1)); } if (agentParameters.Status == AgentStatus.Completed) { DbContext.ClearAgent(agentParameters); } agentParameters.Status = AgentStatus.Running; DbContext.SaveChanges(); } } }
/// <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); } }