4.4 Cara menerapkan strategi dalam bahasa Python

Penulis:Kebaikan, Dibuat: 2019-06-25 13:34:02, Diperbarui: 2023-11-09 20:41:47

img

Ringkasan

Dalam artikel sebelumnya, kita belajar tentang pengantar bahasa Python, sintaksis dasar, kerangka strategi dan banyak lagi. Meskipun isinya membosankan, tetapi ini adalah keterampilan yang sangat diperlukan dalam pengembangan strategi perdagangan Anda. Dalam artikel ini, mari kita lanjutkan jalan Python dengan strategi sederhana, langkah demi langkah untuk membantu Anda mencapai strategi perdagangan kuantitatif yang layak.

Strategi Pengantar

Di antara banyak strategi perdagangan, strategi saluran Donchian harus menjadi salah satu strategi terobosan paling klasik. Ini telah terkenal sejak 1970. Pada saat itu, sebuah perusahaan yang mengkhususkan diri dalam pengujian simulasi dan penelitian tentang strategi perdagangan programmatik arus utama.

Kemudian, di Amerika Serikat, acara pelatihan pedagang kura-kura yang terkenal terjadi, yang membuat kesuksesan besar dalam sejarah perdagangan sekuritas. Pada saat itu, metode perdagangan kura-kura bersifat rahasia, tetapi setelah lebih dari satu dekade, Hukum Perdagangan Kura-kura dipublikasikan, dan orang-orang menemukan bahwa Turtle Trading menggunakan versi yang ditingkatkan dari strategi saluran Donchian.

Strategi perdagangan terobosan disesuaikan dengan tren yang relatif halus dari varietas perdagangan. Cara yang paling umum untuk terobosan adalah menggunakan hubungan posisi relatif antara dukungan harga dan resistensi untuk menentukan posisi perdagangan tertentu.

Aturan Strategi Saluran Donchian

Saluran Donchian adalah indikator yang berorientasi pada tren, dan penampilannya dan sinyalnya agak mirip dengan indikator Bollinger Band. Namun, saluran harganya dibangun sesuai dengan harga tertinggi dan terendah dalam periode tertentu. Misalnya: rel atas dihitung oleh harga tertinggi 50 k-line terbaru; rel bawah dihitung oleh harga terendah 50 k-line terbaru.

imgseperti yang ditunjukkan di atas: indikator ini dengan kurva yang terdiri dari tiga warna yang berbeda, pengaturan default adalah harga tertinggi dan terendah dalam siklus 20 untuk menampilkan volatilitas harga. Ini akan menunjukkan lebih sedikit volatilitas ketika harga berada di saluran sempit, dan sebaliknya.

Jika harga naik di atas rel atas, sinyal beli akan muncul; sebaliknya, jika harga turun di bawah rel bawah, sinyal jual akan muncul. Karena rel atas dan bawah yang dihitung dengan menggunakan harga terendah dan tertinggi, jadi dalam keadaan normal, harga tidak akan menerobos rel, itu akan bergerak bersama rel atau melompat di dalam saluran.

Metode perhitungan saluran Donchian

Di platform FMZ Quant, perhitungan saluran Donchian sederhana, Anda hanya dapat mengakses harga tertinggi atau terendah dalam siklus tertentu, seperti yang ditunjukkan di bawah ini: baris ke-5 adalah untuk mendapatkan harga tertinggi dari 50 siklus, baris ke-6 adalah untuk mendapatkan harga terendah dari 50 siklus.

def main(): # program entry
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line 
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        upper = TA.Highest(record, 50, 'high') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of upper and lower rails 
        Log("upper rail: ", upper) # print the upper rail value in the log
        Log("lower rail: ", lower) # print the lower rail value in the log
        Log("middle rail: ", middle) # print the middle rail value in the log

Logika Strategi

Ada banyak cara untuk menggunakan saluran Donchian, yang dapat digunakan sendiri atau dalam kombinasi dengan indikator lain. Pada bagian ini kita akan menggunakannya dengan cara yang paling mudah. yaitu: ketika harga menembus rel atas, yang berarti melanggar di atas garis tekanan, daya beli kuat, telah membentuk gelombang energi yang meningkat, sinyal pembelian dihasilkan; ketika harga menembus di bawah rel bawah, yang berarti melanggar di bawah garis dukungan, sinyal penjualan dihasilkan.

img

Jika harga jatuh kembali ke rel tengah saluran setelah pembukaan posisi panjang, kita percaya bahwa kekuatan daya beli melemah, atau kekuatan daya jual menguat, dan sinyal pembukaan posisi pendek dihasilkan; prinsip yang sama berlaku untuk posisi pendek pembukaan

Kondisi Perdagangan

  • Posisi panjang terbuka: Jika tidak ada posisi yang dipegang, dan harga penutupan lebih besar dari rel atas

  • Posisi pendek terbuka: Jika tidak ada posisi yang dipegang, dan harga penutupan lebih rendah dari rel bawah

  • Penutupan posisi panjang: Jika saat ini memegang posisi panjang dan harga penutupan lebih rendah dari rel tengah

  • Penutupan posisi pendek: Jika saat ini memegang posisi pendek, dan harga penutupan lebih besar dari rel tengah

Pelaksanaan Kode Strategi

Langkah pertama dalam menerapkan strategi adalah mendapatkan data terlebih dahulu, karena data adalah bagian prasyarat dari strategi trading.

Selanjutnya adalah untuk menghitung logika perdagangan berdasarkan data ini; langkah terakhir adalah untuk perdagangan sesuai dengan logika. langkah sebagai berikut:

Langkah 1: Menggunakan perpustakaan kelas perdagangan

Anda dapat menganggap perpustakaan kelas perdagangan sebagai modul fungsional. Keuntungan menggunakan perpustakaan kelas perdagangan adalah memungkinkan Anda untuk fokus pada menulis logika strategi. Misalnya, ketika kita menggunakan perpustakaan kelas perdagangan, untuk membuka atau menutup posisi, kita dapat langsung menggunakan antarmuka API di perpustakaan kelas perdagangan; tetapi jika kita tidak menggunakan perpustakaan kelas perdagangan, kita perlu mendapatkan harga pasar saat membuka posisi. Perlu mempertimbangkan masalah pesanan yang tidak dieksekusi dan masalah pesanan penarikan, dan sebagainya.

def main();
    wile true:
        obj = ext.NewPositionManager() # using the trading class library
        # followed by strategy logic and placing order part

Bagian pengkodean di atas adalah kerangka strategi CTA menggunakan alat FMZ Quant. Ini adalah format pengkodean tetap, dan semua kode logika perdagangan akan dimulai dari baris 4. Tidak ada perubahan lain yang diperlukan di tempat lain.

Langkah 2: Dapatkan semua jenis data

Dari logika strategi trading kita, kita pertama-tama perlu mendapatkan status posisi saat ini, dan kemudian membandingkan harga penutupan dengan rel atas, tengah dan bawah indikator Bollinger Band.

  • Dapatkan data garis K

Yang pertama adalah untuk mendapatkan array data K-line dan harga penutupan K-line saat ini, dengan array K-line, kita dapat menghitung periode siklus N dari harga tertinggi dan terendah melalui antarmuka API. dapat ditulis seperti ini:

def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line 
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line

Seperti yang ditunjukkan di atas:

Garis 4: Dapatkan array garis K, yang merupakan format tetap.

Garis 5: Menyaring panjang garis K, karena parameter untuk menghitung indikator saluran Donchian adalah 50, ketika jumlah garis K kurang dari 50, tidak mungkin untuk menghitungnya. Jadi di sini kita perlu menyaring jumlah garis K. Jika jumlah garis K kurang dari 50, itu akan melewatkan loop saat ini dan terus menunggu garis K berikutnya.

Garis 6: Kita menggunakan kode " catatan [ len (catatan) - 1] " untuk mendapatkan data terakhir dari array garis K, yang merupakan data garis K terbaru. Data ini adalah objek, yang berisi: harga pembukaan, harga tertinggi, terendah dan penutupan, juga volume perdagangan, waktu dan data lainnya, karena itu adalah objek, jadi kita hanya menggunakan .Close untuk mendapatkan harga penutupan terbaru dari garis K.

  • Dapatkan data posisi

Informasi posisi adalah kondisi yang sangat penting dalam strategi perdagangan kuantitatif. Ketika kondisi perdagangan ditetapkan, perlu untuk menilai apakah akan menempatkan order dengan status posisi dan jumlah posisi. Misalnya, ketika kondisi untuk membuka posisi panjang ditetapkan, jika ada posisi holding, jangan menempatkan order; jika tidak ada posisi holding, tempatkan order. Kali ini kita langsung merangkum informasi posisi ke dalam fungsi, kita hanya dapat memanggil fungsi ini untuk menggunakannya. seperti ini:

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function

Seperti yang ditunjukkan di atas:

Ini adalah fungsi yang mendapatkan informasi posisi. jika ada posisi panjang, nilainya adalah 1; jika ada posisi pendek, nilainya adalah -1; jika tidak ada posisi, nilainya adalah 0.

Baris 2: Buat fungsi dengan nama mp. Fungsi ini tidak memiliki parameter.

Garis 3: Dapatkan array posisi, yang merupakan format tetap.

Garis 4: Tentukan panjang array posisi. Jika panjangnya sama dengan 0, itu berarti bahwa ia tidak memiliki posisi memegang, mengembalikan 0.

Garis 6 : Menggunakan loop for, mulai melintasi array ini, logika berikut ini sangat sederhana, jika ia memegang posisi panjang, mengembalikan 1 ; jika ia memegang posisi pendek, mengembalikan -1.

Baris 18: Panggilan fungsi informasi posisi mp.

  • Dapatkan harga tertinggi dan terendah dari 50 K-line terbaru

Dalam alat perdagangan kuantitatif FMZ Quant, Anda dapat secara langsung menggunakan fungsi " TA.Highest " dan " TA.Lowest " tanpa harus menulis perhitungan logika Anda sendiri. Dan fungsi TA.Highest dan TA.Lowest mengembalikan hasil dari nilai tertentu bukan array. Ini sangat nyaman. tidak hanya itu, platform FMZ Quant memiliki fungsi indikator resmi yang dibangun di ratusan fungsi lain.

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function
        upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail

Seperti yang ditunjukkan di atas:

Baris 19: panggil fungsi TA.Highest untuk mendapatkan harga tertinggi dari 50 siklus

Baris 20: panggilan TA.Lowest fungsi untuk mendapatkan harga terendah dari 50 siklus

Baris 21: hitung nilai rata-rata rel atas dan bawah sesuai dengan harga tertinggi dan terendah dari 50 siklus

Tahap 3: Pemasangan pesanan dan perdagangan

Dengan data di atas, kita dapat menulis logika trading dan bagian penempatan order sekarang. juga sangat sederhana, yang paling umum digunakan adalah pernyataan if, yang dapat dijelaskan sebagai: jika kondisi 1 dan kondisi 2 benar, tempatkan order; jika kondisi 3 atau kondisi 4 benar, tempatkan order. seperti yang ditunjukkan di bawah ini:

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function
        upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail
        obj = ext.NewPositionManager() # using the trading class library
        if position > 0 and close < middle: # If currently holding long position, and the closing price is less than the middle rail
            obj.CoverAll() # close all position
        if position < 0 and close > middle: # If currently holding short position, and the closing price is greater than the middle rail
            obj.CoverAll() # close all position
        if position == 0: # if currently holding no position
            if close > upper: # if the closing price is greater than the middle rail
                obj.OpenLong("this_week", 1) # open long position
            elif close < lower: # if the closing price is less than the middle rail
                obj.OpenShort("this_week", 1) # open short position

Seperti yang ditunjukkan di atas:

Baris 22: Menggunakan perpustakaan kelas perdagangan, ini adalah format tetap

Baris 23, 24: Ini adalah pernyataan posisi panjang penutupan yang menggunakan operator perbandingan dan operator logis yang telah kita pelajari sebelumnya, yang berarti bahwa jika kepemilikan saat ini adalah posisi panjang, dan harga penutupan kurang dari rel tengah, tutup semua posisi.

Baris 25, 26: Ini adalah pernyataan posisi pendek penutupan yang menggunakan operator perbandingan dan operator logis yang telah kita pelajari sebelumnya, yang berarti bahwa jika pesanan saat ini adalah posisi pendek dan harga penutupan lebih besar dari rel tengah, tutup semua posisi.

Baris 27: Tentukan status posisi saat ini Jika tidak ada posisi yang ditahan, lanjutkan ke langkah berikutnya.

Baris 28, 29: Tentukan apakah harga penutupan lebih besar dari rel atas. Jika harga penutupan naik di atas rel atas, buka posisi panjang.

Baris 30, 31: Tentukan apakah harga penutupan lebih rendah dari rel bawah. Jika harga penutupan turun di bawah rel bawah, buka posisi pendek.

Untuk meringkas

Di atas kita telah mempelajari setiap langkah pengembangan strategi perdagangan kuantitatif lengkap dengan menggunakan Python, termasuk: pengenalan strategi, metode perhitungan saluran Donchian, logika strategi, kondisi perdagangan, implementasi kode strategi, dll. Bagian ini hanyalah strategi sederhana. Sebagai metode yang menginspirasi, ada lebih dari satu cara untuk mencapainya. Anda dapat menumpuk metode perdagangan yang berbeda sesuai dengan sistem perdagangan Anda untuk membentuk strategi perdagangan kuantitatif Anda sendiri.

Pemberitahuan bagian berikutnya

Dalam pengembangan strategi perdagangan kuantitatif, dari perspektif kecepatan eksekusi bahasa pemrograman, yang mana yang tercepat? itu harus C ++. Terutama di bidang derivatif keuangan dan perdagangan frekuensi tinggi. C ++ unik dalam spesifisitas bahasa dan memiliki keuntungan dalam perhitungan numerik. Dibandingkan dengan JavaScript dan Python, kecepatannya dapat ditingkatkan dengan beberapa urutan besar. Jika Anda ingin pergi ke bidang derivatif keuangan atau perdagangan frekuensi tinggi di masa depan. Ini akan menjadi kursus yang tidak boleh Anda lewatkan.

Latihan setelah sekolah

  1. Mulai dari dasar dan menerapkan strategi dari bagian ini.

  2. Coba tambahkan indikator rata-rata bergerak ke strategi di bagian ini untuk mengurangi frekuensi perdagangan.


Berkaitan

Lebih banyak