算法交易

為機器學習交易任務定義目標函式

  • April 3, 2019

一個簡化的例子。鑑於:

  • 資產價格時間序列
  • 固定距離停止和瞄準。

這些輸入的函式有兩個可能的輸出值: $ 1 $ 如果價格很可能在停止之前達到目標,並且 $ 0 $ 否則。這個功能是通過機器學習來實現的,例如神經網路。

對於合理且同等大小的目標和止損,可行勝率將接近 $ \frac{1}{2} $ . 大多數時候結果是不可預測的,正確的選擇是不開倉。有時賠率略好於 $ \frac{1}{2} $ ; 這是我希望算法輸出一個 $ 1 $ . 採摘櫻桃。

當把它作為一個二元分類器時,似乎廣泛使用的二元交叉熵損失

  1. 強烈懲罰自信的錯誤分類
  2. 微弱地獎勵正確地更自信

不一定適合這裡。

為了通過隨機梯度下降進行訓練,這個神經網路需要產生一個連續的輸出 $ \in(0;1) $ ,並且目標函式必須有一個有用的導數。這就是為什麼簡單地計算贏家和輸家無濟於事的原因。目標函式需要對網路的自信和不自信的決策進行不同的權衡。

你會怎麼處理?

這是一個類似的問題,可能寫得更好。

下面的程式碼是用Wolfram Mathematica編寫的。

例如,我們有一些訓練數據。我們試圖預測:多頭(1)或空頭(0)。

SeedRandom[0];
n = 10000;
X = RandomReal[{-1, 1}, {n, 100, 5}];
Y = RandomInteger[{0, 1}, n];
淨=網路鏈[
{
LongShortTermMemoryLayer[64],
SequenceLastLayer[],
ElementwiseLayer[斜坡],
線性層[2],
軟最大層[]
},
"輸入" -> {100, 5},
"輸出" -> NetDecoder[{"Class", {0, 1}}]
]

在此處輸入圖像描述

SeedRandom[0];
netT = NetTrain[
 net,
 X -> Y,
 All,
 LossFunction -> CrossEntropyLossLayer["Index"],
 BatchSize -> 64, MaxTrainingRounds -> 10, TargetDevice -> "GPU"
 ]

在此處輸入圖像描述

cm = ClassifierMeasurements[netT["TrainedNet"], X -> Y]

在此處輸入圖像描述

cm["ConfusionMatrixPlot"]

在此處輸入圖像描述

cm["Precision"]

<|0->0.569919,1->0.580981|>

cm["Recall"]

<|0->0.641173,1->0.506965|>

調整門檻值

proba = netT["TrainedNet"][X, "Probabilities"];
proba0 = Lookup[proba, 0];
proba1 = Lookup[proba, 1];
PairedHistogram[Pick[proba0, Y, 0], Pick[proba0, Y, 1]]

在此處輸入圖像描述

Table[
 {
   Select[Pick[proba0, Y, 0], # &gt;= i &] // Length,
   Select[Pick[proba0, Y, 1], # &gt;= i &] // Length
   } // {i, ##, N[#[[1]]/(#[[1]] + #[[2]])]} &,
 {i, 0.5, 0.7, 0.01}
 ] // MatrixForm

在此處輸入圖像描述

PairedHistogram[Pick[proba1, Y, 1], Pick[proba1, Y, 0]]

在此處輸入圖像描述

Table[
 {
   Select[Pick[proba1, Y, 1], # &gt;= i &] // Length,
   Select[Pick[proba1, Y, 0], # &gt;= i &] // Length
   } // {i, ##, N[#[[1]]/(#[[1]] + #[[2]])]} &,
 {i, 0.5, 0.7, 0.01}
 ] // MatrixForm

在此處輸入圖像描述

計算預期盈虧

EV[p_] := p*80 - (1 - p)*100 - 4
陰謀[
{
Select[Pick[proba0, Y, 0], # &gt;= x &] // 長度,
Select[Pick[proba0, Y, 1], # &gt;= x &] // 長度
} // EV[#[[1]]/(#[[1]] + #[[2]])]*(#[[1]] + #[[2]]) &,
{x, 0.5, 0.7}
]

在此處輸入圖像描述

Plot[
{
  Select[Pick[proba1, Y, 1], # &gt;= x &] // Length,
  Select[Pick[proba1, Y, 0], # &gt;= x &] // Length
  } // EV[#[[1]]/(#[[1]] + #[[2]])]*(#[[1]] + #[[2]]) &,
{x, 0.5, 0.7}
]

在此處輸入圖像描述

引用自:https://quant.stackexchange.com/questions/44164