【问题标题】:Stock Profit Maximization: Given Price Array, How to Maximize Profits with Boundaries股票利润最大化:给定价格数组,如何通过边界最大化利润
【发布时间】:2019-12-22 22:15:29
【问题描述】:

我一直在尝试编写一些基于“Maximizing profit for given stock quotes”所做的代码,但我想对交易者可以做的事情施加某些限制。在我的代码中,我试图将他可以拥有的股票数量限制为 N = 4,并且他可以在给定时间间隔内买卖的股票数量为 C = 1。目标是找到集合给定股票价格数组的最终利润最大化的行动。

所以对于给定的价格数组

stock_prices = [20,20,20,20,25,30,25,30,25,20,20,30,35,40,45,50,60,60,50,40,35,30,25,20],

最理想的情况是,交易者应该在时间间隔 1、2、3 和 4 买入(每个 20 美元),在时间间隔 6 和 8 卖出(每个 30 美元),在 10 和 11 再次买入,然后在16、17、18 和 19。在一天结束时,交易者的股票应该为零。

这是我迄今为止尝试过的:

def calcprofit(stock_prices):
    buy=[1]*len(stock_prices) # 1 reflects buy and 0 reflects sell
    profit=0
    m=0
    storage_limit = 4
    c = 1   #Change in shares
    storage = 0
    for i in reversed(range(len(stock_prices))):
        price = stock_prices[i] # shorthand name
        if storage < storage_limit and m <= price:
            buy[i] = 1
            m = price
            storage += c
        if storage >= storage_limit and m >= price:
            buy[i] = 0
            storage -= c
        profit += (m-price)
    return (profit,buy,storage)

目前,代码不能一次卖出一只股票,也不能卖出或买入由变化决定的数量。目前,我得到了这个结果:

(505, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], 3)

另外,但不是必需的,除了使用上面链接显示的二进制系统进行买卖之外,是否可以引入另一个整数来显示交易者何时持有(既不买入也不卖出)?

【问题讨论】:

    标签: python optimization


    【解决方案1】:

    您可以使用动态规划来计算最佳利润,如下所示:

    stock_prices = [20,20,20,20,25,30,25,30,25,20,20,30,35,40,45,50,60,60,50,40,35,30,25,20]
    MAX_STOCKS = 4
    memory = {}
    
    def dp(i=0, stockes=0):
    
      if i == len(stock_prices):
        return 0
    
      if (i, stockes) in memory:
        return memory[(i, stockes)]
    
      memory[(i, stockes)] = max(
          dp(i+1, stockes), 
          dp(i+1, stockes+1) - stock_prices[i] if stockes < MAX_STOCKS else -1, 
          dp(i+1, stockes-1) + stock_prices[i] if stockes > 0 else -1)
    
      return memory[(i, stockes)]
    
    
    print(dp())
    

    输出:

    160
    

    160 匹配您描述的最佳解决方案。关于解决方案的两个重要说明:

    1. 在每次调用时,我都会计算三种可能性:不买入或卖出,如果未达到限制则买入股票,如果我们至少有一个股票,则卖出股票。
    2. 在动态规划中,问题具有重叠结构,其中子问题出现多次,因此我使用memory dic 来记忆重复出现的子问题。

    【讨论】:

    • 谢谢!这很好用。如果可能的话,您会建议将打印声明(说明最佳选择是买入、卖出还是持有)放在哪里?我在想,如果可以确定当前库存何时增加、减少或保持不变,就可以打印出该动作。
    • 不客气,我会给你一个提示:在每次调用时,我们的状态是 (i=0, stockes=0),我们可以遵循三个动作中的任何一个(卖出、买入或什么都不做),我们需要知道的是对于给定的股票我们做了什么。
    • 我尝试通过放置一系列条件语句来实现这一点,这些条件语句使用股票数量的状态作为前提。当我print(memory[(i, storage)] 它提供所有i 值和相应的时间间隔的股票。每个时间间隔都有不同数量的股票。如何隔离程序确定利润最大化的那些?
    猜你喜欢
    • 2016-08-29
    • 2012-03-19
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    相关资源
    最近更新 更多