задан ряд цен акций в массиве. Выбирайте, когда покупать и когда продавать, чтобы получить максимальную прибыль

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

дата покупки, дата продажи = 0, 0

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

для d, p в enumerate(prices[1:]): если p ‹ minprice: minprice = p mindate = d + 1 продолжить

prof = p - минимальная цена

если проф > макспроф: макспроф = профдата покупки, дата продажи = дата разума, d + 1

возврат (дата покупки, дата продажи), maxprof

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


person learning_bee    schedule 12.07.2011    source источник


Ответы (3)


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

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

person tskuzzy    schedule 12.07.2011
comment
чтобы быть точным, вы хотите знать, где находится каждый взгляд и каждый желоб, который на самом деле просто ищет первую производную. - person Andrew White; 12.07.2011
comment
Правильно. Я не решаюсь использовать слово «производная» в непостоянных ситуациях, но да :) - person tskuzzy; 12.07.2011
comment
хорошая точка зрения. В своем инженерном уме я заполнил пробелы и применил численный метод к данным. - person Andrew White; 12.07.2011

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

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

person Andrew White    schedule 12.07.2011

Это код в 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;

}
}
person ron_ron    schedule 22.02.2014