如果您知道股票的未来价格,那么买卖的最佳时机是什么?

时间:2013-05-31 02:56:30

标签: algorithm finance

财务软件公司对程序员职位的面试问题

  

Q1)假设您有一个数组,其中第i个元素是给定股票的价格       那天我。

     

如果您只被允许购买一股股票并卖出一股       对于股票,设计一种算法来寻找买卖的最佳时机。

我的解决方案:     我的解决方案是在第i天和第i + 1天之间为阵列化1天制作一系列股票价格差异,然后使用Kadane算法返回最大连续子阵列的总和。然后我会在开始时购买最大的连续阵列,并在最大的销售结束时出售 连续阵列。

我想知道我的解决方案是否正确,那里有更好的解决方案吗?

在回答时,我被问到一个跟进问题,我的回答完全一样

  

Q2)鉴于您知道未来10天公司x的未来收盘价,       设计算法以确定您是否应该为每个人购买,出售或持有       单日(你每天只能做出1个决定)的目的是       最大化利润

     

例如:第1天收盘价:2.24
         第2天收盘价:2.11
          ...
          第10天收盘价:3.00

我的解决方案:与上述相同

我想知道如果有更好的算法可以获得最大利润 我每天都可以做出决定

5 个答案:

答案 0 :(得分:3)

  

Q1如果您只被允许购买一股股票并卖出一股股票,请设计算法以找到买卖的最佳时机。

在单次传递数组时,确定价格最低的索引i和价格最高的索引j。您在i处购买并在j处出售(在您购买之前通过借入股票进行销售,通常允许在融资中使用,因此如果j < i)则可以。如果所有价格相同,则不做任何事情。

  

Q2鉴于您知道未来10天公司x的未来收盘价,设计一个算法来确定您是否应该每天购买,出售或持有(您每天只能做出1个决定) )以实现利润最大化为目标

只有10天,因此只有3^10 = 59049种不同的可能性。因此完全可以使用蛮力。即,尝试各种可能性,只需选择能带来最大利润的那种。 (即使找到了更有效的算法,这仍然是测试更高效算法的有用方法。)

蛮力方法产生的一些解决方案可能无效,例如:可能无法一次拥有(或欠下)多个股票。此外,您是否需要在10天结束时拥有0只股票,或者在10天结束时自动清算任何头寸?另外,我想澄清一下我在第一季度做出的假设,即在买入之前有可能卖出以利用股价下跌的优势。最后,可能需要考虑交易费用,包括在您购买之前借入股票以进行销售的付款。

一旦澄清了这些假设,就很有可能将设计设计成更有效的算法。例如,在最简单的情况下,如果您只能拥有一个股票并且您必须在卖出之前购买,那么您将在该系列中的第一个最小值处获得“买入”,在最后一个最大值处获得“卖出”,并且购买和购买在任何最小值和最大值之间销售。

我越是想到这一点,我认为这些面试问题就越多,关于候选人如何澄清问题,因为他们是关于问题的解决方案。

答案 1 :(得分:2)

以下是一些替代答案:

Q1)在提供的阵列中从左到右工作。跟踪到目前为止看到的最低价格。当您看到数组的元素时,记下当前价格与最低价格之间的差异,更新目前为止的最低价格,并跟踪所见的最高差价。我的答案是在以当时最低价格的价格买入后,通过卖出来获得最高差价的利润。

Q2)将此视为动态编程问题,其中任何时间点的状态是您是否拥有共享。从左到右再次工作。在每个点找到最高可能的利润,因为在该时间点结束时拥有份额,并且假设您在该时间点结束时没有拥有份额。您可以从上一个时间步的计算结果中解决这个问题:在一个案例中,比较购买股票的选项,并从您在前一点结束时没有拥有或持有股票的利润中减去这个选项你在前一点做过的。在另一种情况下,比较出售股票的选项,以增加您前一次拥有的利润,或者保留您之前未拥有的利润。作为动态编程的标准,您可以保留在每个时间点做出的决策,并通过向后工作在最后恢复正确的决策列表。

答案 2 :(得分:0)

假设价格是数组P = [p_1, p_2, ..., p_n]

构建一个新数组A = [p_1, p_2 - p_1, p_3 - p_2, ..., p_n - p_{n-1}]

A[i] = p_{i+1} - p_i,取p_0 = 0

现在去查找maximum sum sub-array

OR

找到不同的算法,并解决最大的子阵列问题!

问题是相同的。

答案 3 :(得分:0)

你对问题1的回答是正确的。

您对问题2的回答不正确。要解决此问题,您需要从最后开始向后工作,在每个步骤中选择最佳选项。例如,给定序列{1,3,5,4,6},因为4&lt; 6你的最后一招是出售。从5开始4,之前的举动就是购买。从3&lt; 5,此举5是卖出。继续以同样的方式,3的举动是持有,1的举动是买。

答案 4 :(得分:0)

第一个问题的解决方案是正确的。 Kadane的算法运行时复杂度 O(n)是最大子阵列问题的最佳解决方案。使用该算法的好处是易于实现。

根据我的说法,第二个问题的解决方案是错误的。您可以做的是存储您找到的最大总和子数组的索引。一旦找到最大和子阵列及其左右索引。您可以在左侧部分再次调用此函数,即0到左-1和右侧部分,即右+ 1到Array.size - 1.所以,这是一个递归过程基本上你可以进一步用基本案例设计这种递归的结构来解决这个问题。通过遵循这个过程,您可以最大化利润。