Strategi perdagangan berdasarkan arus aktif dana

Penulis:Kebaikan, Dibuat: 2020-08-01 09:50:44, Diperbarui: 2023-10-11 19:56:26

img

Ringkasan

Harga naik atau turun. dalam jangka panjang, probabilitas kenaikan dan penurunan harga harus 50%, jadi untuk memprediksi harga masa depan dengan benar, Anda perlu mendapatkan semua faktor yang mempengaruhi harga secara real time, dan kemudian memberi setiap faktor bobot yang benar, dan akhirnya melakukan analisis obyektif dan rasional. untuk mencantumkan semua faktor yang mempengaruhi harga, mungkin mengisi seluruh alam semesta.

Dijumlahkan sebagai: lingkungan ekonomi global, kebijakan makro nasional, kebijakan industri terkait, hubungan penawaran dan permintaan, peristiwa internasional, suku bunga dan nilai tukar, inflasi dan deflasi, psikologi pasar, dan faktor yang tidak diketahui lainnya, dll. Prediksi telah menjadi tugas yang sangat besar dan tidak mungkin. Jadi sejak awal, saya mengerti bahwa pasar tidak dapat diprediksi. Kemudian semua prediksi di pasar telah menjadi hipotesis, dan perdagangan telah menjadi permainan probabilitas, yang menarik.

Mengapa menggunakan arus modal

Karena pasar tidak dapat diprediksi, apakah itu benar-benar acuh tak acuh? Tidak, semua faktor makro dan mikro telah tercermin dalam harga, yang berarti bahwa harga adalah hasil dari interaksi semua faktor. Kita hanya perlu menganalisis harga untuk membuat strategi perdagangan yang lengkap.

Pikirkan dulu, mengapa harga naik?

Anda mungkin mengatakan, karena: negara mendukung kebijakan industri yang relevan, negara asal hujan deras, perang perdagangan internasional, MACD Golden Fork dibeli, orang lain telah membelinya, dll.

Pada kenyataannya, kenaikan dan penurunan harga mirip dengan pasang surut. kenaikan harga tidak dapat dipisahkan dari promosi dana. di pasar, jika ada lebih banyak pembeli daripada penjual, harga akan naik. sebaliknya, jika ada lebih banyak penjual daripada pembeli, harga akan turun. Dengan konsep ini, kita dapat memberikan harapan yang wajar untuk tren harga di masa depan berdasarkan hubungan penawaran dan permintaan yang tercermin dalam arus bersih dana.

Prinsip arus dana

Berbeda dengan analisis aliran dana tradisional, analisis aliran dana menganalisis transaksi mana yang merupakan arus masuk aktif dana dan transaksi mana yang merupakan arus keluar aktif dana berdasarkan data transaksi selama periode waktu tertentu. Kemudian, dengan mengurangi volume arus keluar aktif dari volume arus masuk aktif selama periode ini, kita dapat mengetahui arus masuk bersih dana selama periode ini. Jika arus masuk bersih dana positif, itu berarti pasokan produk ini kekurangan; jika arus keluar bersih dana berarti pasokan produk ini kelebihan.

Setelah membaca ini, beberapa orang mungkin bertanya-tanya bahwa dalam transaksi yang sebenarnya, kesepakatan hanya akan dibuat ketika seseorang membeli dan seseorang menjual. Pesanan transaksi harus memiliki volume penjualan sebanyak volume pembelian, dan dana harus masuk dan keluar dari jumlah yang sama. Dari mana aliran masuk dan keluar modal berasal? Sebenarnya, secara ketat, setiap pesanan beli harus sesuai dengan pesanan jual yang sesuai, dan aliran masuk dan aliran keluar modal harus sama. Jika kita ingin menghitung pesanan mana yang secara aktif dibeli dan pesanan mana yang secara aktif dijual, kita hanya dapat menggunakan metode kompromi, menggunakan data bar garis K, berdasarkan volume dan harga transaksi.

Metode perhitungan arus dana

Perubahan aliran dana secara akurat sesuai dengan perilaku pasar real-time, dan arus bersih dana dihitung secara real-time dengan mengintegrasikan data garis k. Ada dua algoritma untuk menghitung arus aktif dana:

Pertama, jika harga transaksi saat ini dari pesanan saat ini dilaksanakan pada harga counterparty atau dengan harga yang lebih tinggi, harga transaksi pembelian >= harga transaksi penjualan, yang berarti bahwa pembeli lebih bersedia untuk menyelesaikan transaksi dengan harga yang lebih tinggi, yang termasuk dalam arus masuk dana aktif.

Kedua, jika harga transaksi saat ini > harga transaksi terakhir, maka dapat dipahami bahwa volume transaksi saat ini secara aktif mendorong kenaikan harga, yang termasuk dalam arus masuk dana yang aktif.

Ambil algoritma kedua di atas sebagai contoh:

Harga penutupan produk tertentu pada pukul 10:00 adalah 3450, dan harga penutupan pada pukul 11:00 adalah 3455, jadi kita akan memasukkan volume transaksi antara 10:00 dan 11:00 sebagai arus masuk modal aktif. Jika tidak, itu termasuk dalam arus keluar dana inisiatif. Artikel ini didasarkan pada metode kedua, menambahkan faktor volatilitas harga. Dengan membandingkan harga penutupan garis k sebelum dan sesudahnya, volume kenaikan atau penurunan k garis bar * volatilitas dimasukkan dalam urutan, dan kemudian lebih lanjut sesuai dengan urutan Menghitung rasio arus masuk dana aktif.

Logika perdagangan

Artikel ini menjelaskan arus dana di pasar berjangka dari perspektif volume, dan menetapkan model perdagangan untuk menilai tren harga jangka pendek melalui analisis real-time data garis K. Dalam keadaan normal, arus modal dan tren harga dapat dibagi menjadi empat kondisi dasar:

Harga naik dan arus masuk bersih aktif dana per satuan waktu: situasi ini kuat, dan harga di masa depan akan terus naik lebih mungkin;

Harga saham naik, dan arus keluar bersih aktif dana per satuan waktu: Dalam hal ini, itu adalah posisi yang sedang kuat, dan tingkat kenaikan harga di masa depan akan sangat berkurang;

Harga saham turun, sementara arus masuk bersih aktif dana per unit waktu: ini adalah situasi yang lemah, dan harga masa depan terus turun lebih mungkin;

Harga saham jatuh, dan pada saat yang sama arus keluar bersih aktif dana per unit waktu: dalam hal ini, itu adalah posisi yang lemah secara moderat, dan tingkat penurunan harga di masa depan akan sangat berkurang;

Variabel utama adalah sebagai berikut:

Rendah sebelumnya (ll) Tingkat tertinggi sebelumnya (hh) Pembelian aktif (barIn) Penjualan aktif (barOut) Rasio arus masuk dana aktif terhadap arus keluar dana aktif (barRatio) Batas posisi pembukaan (openValve) Posisi penyimpanan saat ini (myAmount) Harga penutupan K-line terakhir (penutupan)

Ketentuan masuk dan keluar

Strategi perdagangan kuantitatif yang baik tidak hanya membutuhkan pengembalian yang stabil, tetapi juga kemampuan untuk mengendalikan risiko dan menghindari kerugian besar ketika ada kemungkinan kecil.

  • Pembukaan posisi panjang: jika tidak ada posisi ditahan saat ini, dan barRatio > openValve, buka posisi panjang;

  • Pembukaan posisi pendek: jika tidak ada posisi ditahan saat ini dan barRatio < 1 / openValve, buka posisi pendek;

  • Penutupan posisi panjang: Jika posisi panjang saat ini dipegang dan ditutup < ll, jual dan tutup posisi panjang;

  • Penutupan posisi pendek: Jika posisi pendek saat ini dipegang dan ditutup > hh, beli dan tutup posisi pendek;

Menulis kode sumber strategi

Mendapatkan dan menghitung data

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;
}

Dapatkan data garis K langsung melaluiGetRecordsMetode dalam API FMZ. Mengandung harga tertinggi, harga terendah, harga pembukaan, harga penutupan, volume, dan timestamp standar. Jika harga transaksi terbaru lebih besar dari harga transaksi terakhir, maka volume transaksi terbaru * (harga tertinggi-harga terendah) dimasukkan ke dalam pembelian aktif; jika harga transaksi terbaru lebih rendah dari harga transaksi terakhir, maka volume terbaru * (harga tertinggi-harga terendah) dimasukkan ke dalam penjualan aktif;

Dapatkan data posisi

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;
}

Dapatkan data posisi dasar melaluiGetPositionJika posisi panjang saat ini dipegang, maka kuantitas posisi positif dikembalikan; jika posisi saat ini pendek, maka kuantitas posisi negatif dikembalikan. Tujuan ini adalah untuk memfasilitasi perhitungan logika posisi pembukaan dan penutupan.

Menempatkan pesanan

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
        }
    }
}

Karakteristik strategis

  • Fitur:

Beberapa parameter inti: Model ini memiliki ide desain yang jelas, dengan hanya tiga parameter inti. Keseragaman yang kuat: Strategi ini sederhana dalam logika dan memiliki keseragaman yang tinggi.

  • Peningkatan:

Menambahkan kondisi posisi kepemilikan: arus dana pasar saham satu arah dapat menentukan arus masuk atau keluar dana berdasarkan faktor-faktor seperti fluktuasi harga dan volume perdagangan.

Menambahkan kondisi standar deviasi: hanya mengandalkan arus dana sebagai kondisi untuk membuka posisi, mungkin ada sinyal palsu yang sering, menghasilkan pembukaan dan penutupan posisi yang sering.

Kode sumber strategi lengkap:

/*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
        }
    }
}

Alamat strategi:https://www.fmz.com/strategy/87698

Strategi backtest

Konfigurasi strategi:

img

Kinerja uji balik:

img

Untuk meringkas

Melalui pemodelan, artikel ini menggunakan data batang garis K komoditas berjangka yang disediakan oleh platform perdagangan FMZ untuk membangun model arus modal bersih melalui pengumpulan data, analisis terkait, dan teknologi prediksi.

Perlu dicatat bahwa arus dana yang disebutkan dalam artikel ini mengacu pada arus dana yang aktif. Ini mengacu pada kekuatan penjual dan pembeli di pasar, bukan masuk atau keluar dana.


Berkaitan

Lebih banyak