📌  相关文章
📜  股票买卖以最大化利润的Python程序

📅  最后修改于: 2022-05-13 01:56:56.740000             🧑  作者: Mango

股票买卖以最大化利润的Python程序

每天的股票成本以数组的形式给出,找出你在那些日子里通过买卖可以获得的最大利润。例如,如果给定数组是 {100, 180, 260, 310, 40, 535, 695},则可以通过在第 0 天买入,在第 3 天卖出来获得最大利润。再次在第 4 天买入并在第 6 天卖出. 如果给定的价格数组按降序排序,则根本无法赚取利润。

幼稚的方法:一种简单的方法是尝试在获利的每一天买入股票并卖出,并不断更新迄今为止的最大利润。

下面是上述方法的实现:

Python3
# Python3 implementation of the approach
  
# Function to return the maximum profit
# that can be made after buying and
# selling the given stocks
def maxProfit(price, start, end):
  
    # If the stocks can't be bought
    if (end <= start):
        return 0;
  
    # Initialise the profit
    profit = 0;
  
    # The day at which the stock
    # must be bought
    for i in range(start, end, 1):
  
        # The day at which the
        # stock must be sold
        for j in range(i+1, end+1):
  
            # If buying the stock at ith day and
            # selling it at jth day is profitable
            if (price[j] > price[i]):
                  
                # Update the current profit
                curr_profit = price[j] - price[i] +
                              maxProfit(price, 
                                        start, i - 1)+ 
                              maxProfit(price, 
                                        j + 1, end);
  
                # Update the maximum profit so far
                profit = max(profit, curr_profit);
  
    return profit;
  
# Driver code
if __name__ == '__main__':
    price = [100, 180, 260, 
             310, 40, 535, 695];
    n = len(price);
    print(maxProfit(price, 0, n - 1));
# This code is contributed by Rajput-Ji


Python3
# Python3 Program to find 
# best buying and selling days
  
# This function finds the buy sell
# schedule for maximum profit
def stockBuySell(price, n):
      
    # Prices must be given for at 
    # least two days
    if (n == 1):
        return
      
    # Traverse through given price array
    i = 0
    while (i < (n - 1)):
          
        # Find Local Minima
        # Note that the limit is (n-2) as 
        # we are comparing present element 
        # to the next element
        while ((i < (n - 1)) and 
                (price[i + 1] <= price[i])):
            i += 1
          
        # If we reached the end, break
        # as no further solution possible
        if (i == n - 1):
            break
          
        # Store the index of minima
        buy = i
        i += 1
          
        # Find Local Maxima
        # Note that the limit is (n-1) as we are
        # comparing to previous element
        while ((i < n) and 
               (price[i] >= price[i - 1])):
            i += 1
              
        # Store the index of maxima
        sell = i - 1
          
        print("Buy on day: ",buy,"    ",
                "Sell on day: ",sell)
          
# Driver code
  
# Stock prices on consecutive days
price = [100, 180, 260, 
         310, 40, 535, 695]
n = len(price)
  
# Function call
stockBuySell(price, n)
# This is code contributed by SHUBHAMSINGH10


Python3
# Python3 program for the 
# above approach
def max_profit(prices: list, 
               days: int) -> int:
    profit = 0
  
    for i in range(1, days):
  
        # Checks if elements are adjacent 
        # and in increasing order
        if prices[i] > prices[i-1]:
  
            # Difference added to 'profit'
            profit += prices[i] - prices[i-1]
  
    return profit
  
# Driver Code
if __name__ == '__main__':
  
    # Stock prices on consecutive days
    prices = [100, 180, 260, 
              310, 40, 535, 695]
  
    # Function call
    profit = max_profit(prices, len(prices))
    print(profit)
  
 # This code is contributed by vishvofficial.


输出:

865

有效的方法:如果我们只允许买卖一次,那么我们可以使用以下算法。两个元素之间的最大差异。在这里,我们可以多次买卖。
下面是这个问题的算法。

  1. 找到局部最小值并将其存储为起始索引。如果不存在,则返回。
  2. 找到局部最大值。并将其存储为结束索引。如果我们到达结尾,则将结尾设置为结束索引。
  3. 更新解决方案(增加买卖对的计数)
  4. 如果没有到达终点,重复上述步骤。

Python3

# Python3 Program to find 
# best buying and selling days
  
# This function finds the buy sell
# schedule for maximum profit
def stockBuySell(price, n):
      
    # Prices must be given for at 
    # least two days
    if (n == 1):
        return
      
    # Traverse through given price array
    i = 0
    while (i < (n - 1)):
          
        # Find Local Minima
        # Note that the limit is (n-2) as 
        # we are comparing present element 
        # to the next element
        while ((i < (n - 1)) and 
                (price[i + 1] <= price[i])):
            i += 1
          
        # If we reached the end, break
        # as no further solution possible
        if (i == n - 1):
            break
          
        # Store the index of minima
        buy = i
        i += 1
          
        # Find Local Maxima
        # Note that the limit is (n-1) as we are
        # comparing to previous element
        while ((i < n) and 
               (price[i] >= price[i - 1])):
            i += 1
              
        # Store the index of maxima
        sell = i - 1
          
        print("Buy on day: ",buy,"    ",
                "Sell on day: ",sell)
          
# Driver code
  
# Stock prices on consecutive days
price = [100, 180, 260, 
         310, 40, 535, 695]
n = len(price)
  
# Function call
stockBuySell(price, n)
# This is code contributed by SHUBHAMSINGH10

输出:

Buy on day: 0     Sell on day: 3
Buy on day: 4     Sell on day: 6

时间复杂度:外循环一直运行到我变成 n-1。内部两个循环在每次迭代中增加 I 的值。所以整体时间复杂度是 O(n)

谷峰方法:

在这种方法中,我们只需要找到下一个更大的元素并将其从当前元素中减去,这样差异就会不断增加,直到达到最小值。如果序列是递减序列,则可能的最大利润为 0。

Python3

# Python3 program for the 
# above approach
def max_profit(prices: list, 
               days: int) -> int:
    profit = 0
  
    for i in range(1, days):
  
        # Checks if elements are adjacent 
        # and in increasing order
        if prices[i] > prices[i-1]:
  
            # Difference added to 'profit'
            profit += prices[i] - prices[i-1]
  
    return profit
  
# Driver Code
if __name__ == '__main__':
  
    # Stock prices on consecutive days
    prices = [100, 180, 260, 
              310, 40, 535, 695]
  
    # Function call
    profit = max_profit(prices, len(prices))
    print(profit)
  
 # This code is contributed by vishvofficial.

输出:

865

时间复杂度:O(n)
辅助空间: O(1)

请参阅完整的股票买卖以最大化利润的文章了解更多详情!