Стратегия торговли, основанная на активном потоке средств

Автор:Доброта, Создано: 2020-08-01 09:50:44, Обновлено: 2023-10-11 19:56:26

img

Резюме

В долгосрочной перспективе вероятность роста и падения цены должна составлять 50%, поэтому, чтобы правильно предсказать будущую цену, необходимо получить все факторы, влияющие на цену в режиме реального времени, а затем дать каждому фактору правильный вес, и, наконец, сделать объективный и рациональный анализ.

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

Зачем использовать поток капитала

Поскольку рынок непредсказуем, он действительно безразличен? Нет, все макро и микро факторы были отражены в цене, что означает, что цена является результатом взаимодействия всех факторов. Нам нужно только проанализировать цену, чтобы сделать полную торговую стратегию.

Сначала подумайте, почему цена растет?

Вы можете сказать, потому что: страна поддерживает соответствующую промышленную политику, страна происхождения - проливный дождь, международная торговая война, золотая вилка MACD покупается, другие ее покупают и т. Д. Конечно, это может быть не ошибочно.

На самом деле, рост и падение цен похожи на подъем приливов. Увеличение цен неотделимо от продвижения средств. на рынке, если есть больше покупателей, чем продавцов, цена будет расти. И наоборот, если есть больше продавцов, чем покупателей, цена упадет. С помощью этой концепции мы можем дать разумные ожидания для будущих ценовых тенденций на основе соотношения спроса и предложения, отраженного в чистом потоке средств.

Принцип потока средств

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

После прочтения этого, некоторые люди могут задаться вопросом, что в реальных сделках сделка будет заключена только тогда, когда кто-то покупает, а кто-то продает. Заказ на транзакцию должен иметь такой же объем продажи, как и объем покупки, и средства должны входить и выходить из той же суммы. Откуда происходит приток и отток капитала? На самом деле, строго говоря, каждый заказ на покупку должен соответствовать соответствующему заказу на продажу, а приток капитала и отток капитала должны быть равны. Если мы хотим вычислить, какие заказы активно покупаются и какие заказы активно продаются, мы можем использовать только компромиссный метод, используя данные строки K, основанные на объеме и цене транзакции.

Метод расчета потока средств

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

Во-первых, если текущая цена сделки текущего ордера исполняется по цене контрагента или по переценке, то цена покупки >= цена продажи, что означает, что покупатель более готов завершить сделку по более высокой цене, которая включена в активный приток средств.

Во-вторых, если текущая цена сделки > последняя цена сделки, то можно понять, что текущий объем сделки активно подталкивает рост цен, который включается в активный приток средств.

В качестве примера возьмем второй алгоритм:

Цена закрытия определенного продукта в 10:00 составляет 3450, а цена закрытия в 11:00 составляет 3455, поэтому мы будем включать объем транзакций между 10:00 и 11:00 в качестве притока активного капитала. В противном случае он включается в инициативный отток средств. Эта статья основана на втором методе, добавляя фактор волатильности цены. Сравнивая цену закрытия к-линейной панели до и после, объем растущей или падающей к-линейной панели * волатильности включается в последовательность, а затем далее в соответствии с последовательностью Вычислить соотношение активного притока средств.

Логика торговли

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

Повышение цен и активный чистый приток средств на единицу времени: эта ситуация сильна, и будущий рост цен будет продолжаться с большей вероятностью;

Цены на акции растут, и активный чистый отток средств за единицу времени: в этом случае это средне-сильная позиция, и скорость будущих роста цен будет значительно снижена;

Цена акций падает, в то время как активный чистый приток средств на единицу времени: это слабая ситуация, и будущая цена продолжает падать более вероятно;

Цена акций падает, и в то же время активный чистый отток средств на единицу времени: в этом случае это умеренно слабая позиция, и скорость будущего снижения цен будет значительно снижена;

Основные переменные следующие:

Предыдущий минимум (ll) Предыдущий максимум (hh) Активные покупки (чистые) Активная продажа (barOut) Соотношение активного притока средств к активному оттоку средств (barRatio) Предельный уровень открытия (openValve) Текущая позиция (myAmount) Последняя цена закрытия K-линии (закрытие)

Условия входа и выхода

Хорошая количественная торговая стратегия требует не только стабильной доходности, но и способности контролировать риски и избегать больших потерь, когда есть небольшая вероятность.

  • Открытие длинной позиции: если нет текущей позиции задержки и barRatio > openValve, открыть длинную позицию;

  • Открытие короткой позиции: если нет текущей позиции задержки и barRatio < 1 / openValve, открыть короткую позицию;

  • Закрытие длинной позиции: если текущая длинная позиция удерживается и закрывается < ll, продается и закрывается длинная позиция;

  • Закрытие короткой позиции: если текущая короткая позиция удерживается и закрывается > hh, покупка и закрытие короткой позиции;

Создание исходного кода стратегии

Получение и расчет данных

function data() {
    var self = {};
    var barVol = [];
    var bars = _C(exchange.GetRecords); //Get K line bar data
    if (bars.length < len * 2) { //Control the length of the K line bar data array
        return;
    }
    for (var i = len; i > 0; i--) {
        var barSub_1 = bars[bars.length - (i + 1)].Close - bars[bars.length - (i + 2)].Close; //Calculate the difference between the current closing price and the previous K line bar closing price
        if (barSub_1 > 0) { //If the price rises, add a positive number to the array
            barVol.push(bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
        } else if (barSub_1 < 0) { //If the price drops, add a negative number to the array
            barVol.push(-bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
        }
    }
    if (barVol.length > len) {
        barVol.shift(); //Free up excess data
    }
    self.barIn = 0;
    self.barOut = 0;
    for (var v = 0; v < barVol.length; v++) {
        if (barVol[v] > 0) {
            self.barIn += barVol[v]; //Consolidate all active inflows funds
        } else {
            self.barOut -= barVol[v]; //Consolidate all active outflow funds
        }
    }
    self.barRatio = self.barIn / Math.abs(self.barOut); //Calculate the ratio of active inflows to active outflows
    bars.pop(); //Delete unfinished K line bar data
    self.close = bars[bars.length - 1].Close; //Get the closing price of the pervious bar
    self.hh = TA.Highest(bars, hgLen, 'High'); //Get the previous high price
    self.ll = TA.Lowest(bars, hgLen, 'Low'); //Get the previous low price
    return self;
}

Получить данные строки K прямо черезGetRecordsметод в API FMZ. Содержит самую высокую цену, самую низкую цену, цену открытия, цену закрытия, объем и стандартную временную отметку. Если цена последней сделки больше цены последней сделки, то последний объем сделки * (наивысшая цена-наименьшая цена) включается в активную покупку; если последняя цена сделки меньше цены последней сделки, то последний объем * (наивысшая цена-наименьшая цена) включается в активную продажу;

Получить данные о положении

function positions(name) {
    var self = {};
    var mp = _C(exchange.GetPosition); //Get positions
    if (mp.length == 0) {
        self.amount = 0;
    }
    for (var i = 0; i < mp.length; i++) { //Position data processing
        if (mp[i].ContractType == name) {
            if (mp[i].Type == PD_LONG || mp[i].Type == PD_LONG_YD) {
                self.amount = mp[i].Amount;
            } else if (mp[i].Type == PD_SHORT || mp[i].Type == PD_SHORT_YD) {
                self.amount = -mp[i].Amount;
            }
            self.profit = mp[i].Profit;
        } else {
            self.amount = 0;
        }
    }
    return self;
}

Получить базовые данные о положении черезGetPositionЕсли текущая длинная позиция удерживается, то возвращается положительная величина позиции; если текущая позиция короткая, то возвращается отрицательная величина позиции. Целью этого является облегчение расчета логики открытия и закрытия позиций.

Размещение заказов

function trade() {
    var myData = data(); //Execute data function
    if (!myData) {
        return;
    }
    var mp = positions(contractType); //Get position information
    var myAmount = mp.amount; //Get the number of positions
    var myProfit = mp.profit; //Get floating profit and loss
    if (myAmount > 0 && myData.close < myData.ll) {
        p.Cover(contractType, unit); //close long position
    }
    if (myAmount < 0 && myData.close > myData.hh) {
        p.Cover(contractType, unit); //close short position
    }
    if (myAmount == 0) {
        if (myData.barRatio > openValve) {
            p.OpenLong(contractType, unit); //open long position
        } else if (myData.barRatio < 1 / openValve) {
            p.OpenShort(contractType, unit); //open short position
        }
    }
}

Стратегические характеристики

  • Особенности:

Мало основных параметров: модель имеет четкую идею дизайна, с тремя основными параметрами. Сильная универсальность: стратегия проста в логике и имеет высокую универсальность.

  • Улучшения:

Добавление условий позиции: односторонний (акционный) рыночный поток средств может определять приток или отток средств на основе таких факторов, как колебания цен и объем торговли.

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

Полный код стратегии:

/*backtest
start: 2016-01-01 09:00:00
end: 2019-12-31 15:00:00
period: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
*/

var p = $.NewPositionManager(); //Call commodity futures trading library

//Holding Position data processing
function positions(name) {
    var self = {};
    var mp = _C(exchange.GetPosition); //Get positions
    if (mp.length == 0) {
        self.amount = 0;
    }
    for (var i = 0; i < mp.length; i++) { //Holding Position data processing
        if (mp[i].ContractType == name) {
            if (mp[i].Type == PD_LONG || mp[i].Type == PD_LONG_YD) {
                self.amount = mp[i].Amount;
            } else if (mp[i].Type == PD_SHORT || mp[i].Type == PD_SHORT_YD) {
                self.amount = -mp[i].Amount;
            }
            self.profit = mp[i].Profit;
        } else {
            self.amount = 0;
        }
    }
    return self;
}

//Market data processing function
function data() {
    var self = {};
    var barVol = [];
    var bars = _C(exchange.GetRecords); //Get K line bar data
    if (bars.length < len * 2) { //Control the length of the K line bar data array
        return;
    }
    for (var i = len; i > 0; i--) {
        var barSub_1 = bars[bars.length - (i + 1)].Close - bars[bars.length - (i + 2)].Close; //Calculate the difference between the current closing price and the previous K line bar closing price
        if (barSub_1 > 0) { //If the price rises, add a positive number to the array
            barVol.push(bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
        } else if (barSub_1 < 0) { //If the price drops, add a negative number to the array
            barVol.push(-bars[bars.length - (i + 1)].Volume * (bars[bars.length - (i + 1)].High - bars[bars.length - (i + 1)].Low));
        }
    }
    if (barVol.length > len) {
        barVol.shift(); //Free up excess data
    }
    self.barIn = 0;
    self.barOut = 0;
    for (var v = 0; v < barVol.length; v++) {
        if (barVol[v] > 0) {
            self.barIn += barVol[v]; //Consolidate all active inflows funds
        } else {
            self.barOut -= barVol[v]; //Consolidate all active outflow funds
        }
    }
    self.barRatio = self.barIn / Math.abs(self.barOut); //Calculate the ratio of active inflows to active outflows
    bars.pop(); //Delete unfinished K line bar data
    self.close = bars[bars.length - 1].Close; //Get the closing price of the last K line bar
    self.hh = TA.Highest(bars, hgLen, 'High'); //Get the previous high price
    self.ll = TA.Lowest(bars, hgLen, 'Low'); //Get the previous low price
    return self;
}

//Trading function
function trade() {
    var myData = data(); //Execute data function
    if (!myData) {
        return;
    }
    var mp = positions(contractType); //Get position information
    var myAmount = mp.amount; //Get the number of positions
    var myProfit = mp.profit; //Get floating profit and loss
    if (myAmount > 0 && myData.close < myData.ll) {
        p.Cover(contractType, unit); //close long position
    }
    if (myAmount < 0 && myData.close > myData.hh) {
        p.Cover(contractType, unit); //close short position
    }
    if (myAmount == 0) {
        if (myData.barRatio > openValve) {
            p.OpenLong(contractType, unit); //open long position
        } else if (myData.barRatio < 1 / openValve) {
            p.OpenShort(contractType, unit); //open short position
        }
    }
}

//The main entrance of the program, start from here
function main() {
    while (true) { //Enter the loop
        if (exchange.IO("status")) { //If it is the market opening time
            _C(exchange.SetContractType, contractType); //Subscription contract
            trade(); //Execute trade function
        }
    }
}

Адрес стратегии:https://www.fmz.com/strategy/87698

Обратная проверка стратегии

Конфигурация стратегии:

img

Результаты обратных испытаний:

img

Подводя итог

С помощью моделирования эта статья использует фьючерсы на сырьевые товары K-линейные штрих-данные, предоставленные торговой платформой FMZ, для установления модели чистого потока капитала посредством сбора данных, связанного с ним анализа и технологии прогнозирования. Используйте анализ временных рядов для прогнозирования будущих цен на сырьевые фьючерсы и разработки количественной торговой стратегии на сырьевые фьючерсы.

Следует отметить, что поток средств, упомянутый в этой статье, относится к активному потоку средств. Он относится к силе продавца и покупателя на рынке, а не к входу или выходу средств. Суждение о будущих ценах путем анализа поведения покупателей и продавцов на рынке не имеет краткосрочного референтного значения.


Связанные

Больше