дан ряд цен на акции в массиве. Выберите, когда покупать и когда продавать, чтобы получить максимальную прибыль - PullRequest
0 голосов
/ 12 июля 2011

дан ряд цен на акции в массиве.Выберите, когда покупать и когда продавать, чтобы получить максимальную прибыль.с одного веб-сайта я получил что-то вроде этого - ef maxprofit (цены):

buydate, selldate = 0, 0

maxprof = 0 minprice = цены [0] mindate = 0

для d, p в перечислении (цены [1:]): если p

prof = p - minprice

если prof> maxprof: maxprof = prof buydate, selldate = mindate, d + 1

возврат (buydate, selldate), maxprof

но я думаю, что мы должны учитывать отрицательные ценыtoo..isn't?Любое другое решение или комментарии приветствуются

Ответы [ 3 ]

3 голосов
/ 12 июля 2011

Поскольку у вас есть история, и, похоже, за транзакцию штраф не взимается, просто возьмите производную от цены и покупайте, когда d / dx переходит от отрицательного к положительному, и продавайте, когда он переходит от положительного к отрицательному.

Таким образом, вы покупаете перед каждой прибылью и продаете перед каждой потерей.

1 голос
/ 12 июля 2011

В идеале вы хотите покупать акции, когда они самые низкие, и продавать, когда они самые высокие. Так что выясните, где находятся пики и впадины в ваших данных, и это ваши точки продажи и покупки соответственно.

Это так же просто, как просмотреть набор данных, посмотреть на две соседние точки за раз и отследить текущий «тренд» (независимо от того, идет рынок вверх или вниз). Если тренд повышался, а цена падала, вам следует продать за день до того, как она упала. С другой стороны, если тренд шел вниз и цена выросла, вам следует покупать за день до того, как она выросла.

0 голосов
/ 22 февраля 2014

Это код в java для вышеуказанной задачи, который вычисляет максимальную прибыль

class Solution {
public int solution(int[] a) {

    if(a==null || a.length==0 || a.length==1)
    {
        return 0;
    }
    int buyDay=0;
    int sellDay=0;
    int profit=0;
    for(int i=1;i<a.length;i++)
    {
    int diff=0;

        if(a[buyDay]>a[i])
        {
            buyDay=i;

        }
        else if(a[sellDay]<a[i])
        {
            sellDay=i;
        }

        if(sellDay<buyDay)
            sellDay=buyDay;
        diff=a[sellDay]-a[buyDay];
        if(diff>profit)
        {
            profit=diff;
        }


    }
    return profit;

}
}
...