Strategi berjalan acak

Penulis:ChaoZhang, Tanggal: 2023-10-09 16:10:24
Tag:

Gambaran umum

Strategi random walk adalah strategi perdagangan otomatis yang didasarkan pada generasi angka acak. Strategi ini menggunakan generator kongruensi linier untuk secara acak menghasilkan angka berdasarkan set seed.

Logika Strategi

Bagian utama yang menerapkan perdagangan acak adalah:

  1. Atur parameter a, c dan modulus m untuk generasi angka acak, serta benih awal.

  2. Mendefinisikan fungsi generasi angka acak GetRandom menggunakan algoritma kongruensi linier untuk menghasilkan angka acak antara 0-m.

  3. Pada setiap candlestick, jika tidak ada posisi, bandingkan ukuran angka acak yang dihasilkan, pergi panjang jika lebih besar dari m/2, jika tidak pergi pendek.

  4. Tetapkan kondisi stop loss dan take profit dalam persentase.

  5. Tetapkan periode backtest dengan kerangka waktu.

Dengan langkah-langkah di atas, strategi ini mewujudkan operasi panjang/pendek secara acak. Ketika angka acak lebih besar dari m/2, ia membuka posisi panjang, jika tidak, ia membuka posisi pendek, kemudian mengatur stop loss dan take profit untuk keluar dari posisi.

Analisis Keuntungan

  • Logika strategi yang sederhana dan jelas, mudah dipahami dan diimplementasikan.

  • Perdagangan acak secara efektif menghindari dampak emosional dan mengurangi kesalahan operasi subjektif.

  • Parameter generasi angka acak yang dapat disesuaikan untuk menyesuaikan keacakan.

  • Pengaturan stop loss dan take profit yang fleksibel untuk mengontrol profit/loss tunggal.

  • Mendukung optimasi parameter melalui backtesting dampak parameter yang berbeda pada keuntungan total.

Analisis Risiko

  • Perdagangan acak dapat menghasilkan tren jangka panjang yang tidak jelas dan profitabilitas yang tidak pasti.

  • Tidak dapat menyesuaikan posisi berdasarkan kondisi pasar, bisa kehilangan peluang tren.

  • Keuntungan tunggal terbatas, risiko penarikan yang tinggi.

  • Membutuhkan rasio stop loss/take profit yang wajar untuk menghindari kerugian yang signifikan.

  • Posisi terbuka/tutup yang sering karena keacakan meningkatkan biaya perdagangan.

  • Pengujian backtesting yang cukup diperlukan untuk memverifikasi pengaturan parameter yang wajar, jangan menggunakan secara membabi buta.

Risiko dapat dikurangi dengan menambahkan penilaian tren, mengoptimalkan mekanisme stop loss, mengontrol profit/loss tunggal secara ketat dll.

Arah Peningkatan

  • Tambahkan penilaian tren untuk menghindari perdagangan melawan tren.

  • Tambahkan ukuran posisi berdasarkan perubahan modal.

  • Mengoptimalkan algoritma generasi angka acak untuk keacakan yang lebih baik.

  • Persentase stop loss/take profit yang dinamis.

  • Batasi frekuensi perintah.

  • Optimasi backtest multi-parameter.

Ringkasan

Strategi berjalan acak mewujudkan perdagangan mekanis melalui nomor acak yang dikendalikan panjang / pendek. Ini memiliki keacakan yang kuat dan menghindari dampak emosional dan kesalahan operasional subjektif. Tetapi entri acak juga dapat kehilangan peluang tren, keuntungan tunggal terbatas, membutuhkan mekanisme kontrol risiko yang dioptimalkan. Secara keseluruhan strategi ini cocok untuk memverifikasi ide perdagangan, mengevaluasi dampak parameter, tetapi evaluasi yang cermat diperlukan untuk penggunaan praktis.


/*backtest
start: 2022-10-02 00:00:00
end: 2023-10-08 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//@author=Tr0sT
strategy(title = "Random strategy", shorttitle = "Random", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

a = 16
c = 10
m = 1000
GetRandom(prev) =>
    GetRandom = (a * prev + c) % m

seed = input(200, minval = 2, maxval = m)
stopLoss = input(30, title = "Stop loss percentage(0.1%)")
takeProfit = input(30, title = "Take profit percentage(0.1%)")


curRandom = na
curRandom := nz(curRandom[1]) == 0 ? seed : GetRandom(curRandom[1])
if (strategy.position_size == 0)
    if (curRandom >= m / 2)
        strategy.entry("Enter", strategy.long)
    else
        strategy.entry("Enter", strategy.short)
        
    strategy.exit("Exit", "Enter", loss = close * stopLoss / 1000 / syminfo.mintick, profit = close * takeProfit / 1000 / syminfo.mintick)            

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Lebih banyak