В долгосрочной перспективе вероятность роста и падения цены должна составлять 50%, поэтому, чтобы правильно предсказать будущую цену, необходимо получить все факторы, влияющие на цену в режиме реального времени, а затем дать каждому фактору правильный вес, и, наконец, сделать объективный и рациональный анализ.
Вкратце: глобальная экономическая среда, национальная макрополитика, связанная с ней промышленная политика, отношения спроса и предложения, международные события, процентные ставки и обменные курсы, инфляция и дефляция, психология рынка и другие неизвестные факторы и т. д. Прогнозирование стало огромной и невозможной задачей. Так что рано я понял, что рынок непредсказуем. Затем все прогнозы на рынке стали гипотезами, и торговля стала игрой в вероятности, что интересно.
Поскольку рынок непредсказуем, он действительно безразличен? Нет, все макро и микро факторы были отражены в цене, что означает, что цена является результатом взаимодействия всех факторов. Нам нужно только проанализировать цену, чтобы сделать полную торговую стратегию.
Сначала подумайте, почему цена растет?
Вы можете сказать, потому что: страна поддерживает соответствующую промышленную политику, страна происхождения - проливный дождь, международная торговая война, золотая вилка MACD покупается, другие ее покупают и т. Д. Конечно, это может быть не ошибочно.
На самом деле, рост и падение цен похожи на подъем приливов. Увеличение цен неотделимо от продвижения средств. на рынке, если есть больше покупателей, чем продавцов, цена будет расти. И наоборот, если есть больше продавцов, чем покупателей, цена упадет. С помощью этой концепции мы можем дать разумные ожидания для будущих ценовых тенденций на основе соотношения спроса и предложения, отраженного в чистом потоке средств.
В отличие от традиционного анализа, анализ потока средств анализирует, какие сделки являются активным притоком средств и какие сделки являются активным оттоком средств на основе данных о сделках за определенный период времени. Затем, вычитая объем активного оттока средств от объема активного притока средств за этот период, мы можем узнать чистый приток средств за этот период. Если чистый приток средств положительный, это означает, что предложение этого продукта нехватка; если чистый отток средств означает, что предложение этого продукта избыточно.
После прочтения этого, некоторые люди могут задаться вопросом, что в реальных сделках сделка будет заключена только тогда, когда кто-то покупает, а кто-то продает. Заказ на транзакцию должен иметь такой же объем продажи, как и объем покупки, и средства должны входить и выходить из той же суммы. Откуда происходит приток и отток капитала? На самом деле, строго говоря, каждый заказ на покупку должен соответствовать соответствующему заказу на продажу, а приток капитала и отток капитала должны быть равны. Если мы хотим вычислить, какие заказы активно покупаются и какие заказы активно продаются, мы можем использовать только компромиссный метод, используя данные строки K, основанные на объеме и цене транзакции.
Изменение потока средств точно соответствует рыночному поведению в режиме реального времени, а чистый поток средств рассчитывается в режиме реального времени путем интеграции данных к-линейной строки.
Во-первых, если текущая цена сделки текущего ордера исполняется по цене контрагента или по переценке, то цена покупки >= цена продажи, что означает, что покупатель более готов завершить сделку по более высокой цене, которая включена в активный приток средств.
Во-вторых, если текущая цена сделки > последняя цена сделки, то можно понять, что текущий объем сделки активно подталкивает рост цен, который включается в активный приток средств.
В качестве примера возьмем второй алгоритм:
Цена закрытия определенного продукта в 10:00 составляет 3450, а цена закрытия в 11:00 составляет 3455, поэтому мы будем включать объем транзакций между 10:00 и 11:00 в качестве притока активного капитала. В противном случае он включается в инициативный отток средств. Эта статья основана на втором методе, добавляя фактор волатильности цены. Сравнивая цену закрытия к-линейной панели до и после, объем растущей или падающей к-линейной панели * волатильности включается в последовательность, а затем далее в соответствии с последовательностью Вычислить соотношение активного притока средств.
В данной статье описывается поток средств на фьючерсном рынке с точки зрения
Повышение цен и активный чистый приток средств на единицу времени: эта ситуация сильна, и будущий рост цен будет продолжаться с большей вероятностью;
Цены на акции растут, и активный чистый отток средств за единицу времени: в этом случае это средне-сильная позиция, и скорость будущих роста цен будет значительно снижена;
Цена акций падает, в то время как активный чистый приток средств на единицу времени: это слабая ситуация, и будущая цена продолжает падать более вероятно;
Цена акций падает, и в то же время активный чистый отток средств на единицу времени: в этом случае это умеренно слабая позиция, и скорость будущего снижения цен будет значительно снижена;
Предыдущий минимум (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
Конфигурация стратегии:
Результаты обратных испытаний:
С помощью моделирования эта статья использует фьючерсы на сырьевые товары K-линейные штрих-данные, предоставленные торговой платформой FMZ, для установления модели чистого потока капитала посредством сбора данных, связанного с ним анализа и технологии прогнозирования. Используйте анализ временных рядов для прогнозирования будущих цен на сырьевые фьючерсы и разработки количественной торговой стратегии на сырьевые фьючерсы.
Следует отметить, что поток средств, упомянутый в этой статье, относится к активному потоку средств. Он относится к силе продавца и покупателя на рынке, а не к входу или выходу средств. Суждение о будущих ценах путем анализа поведения покупателей и продавцов на рынке не имеет краткосрочного референтного значения.