算法交易
為機器學習交易任務定義目標函式
一個簡化的例子。鑑於:
- 資產價格時間序列
- 固定距離停止和瞄準。
這些輸入的函式有兩個可能的輸出值: $ 1 $ 如果價格很可能在停止之前達到目標,並且 $ 0 $ 否則。這個功能是通過機器學習來實現的,例如神經網路。
對於合理且同等大小的目標和止損,可行勝率將接近 $ \frac{1}{2} $ . 大多數時候結果是不可預測的,正確的選擇是不開倉。有時賠率略好於 $ \frac{1}{2} $ ; 這是我希望算法輸出一個 $ 1 $ . 採摘櫻桃。
當把它作為一個二元分類器時,似乎廣泛使用的二元交叉熵損失
- 強烈懲罰自信的錯誤分類
- 微弱地獎勵正確地更自信
不一定適合這裡。
為了通過隨機梯度下降進行訓練,這個神經網路需要產生一個連續的輸出 $ \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], # >= i &] // Length, Select[Pick[proba0, Y, 1], # >= 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], # >= i &] // Length, Select[Pick[proba1, Y, 0], # >= 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], # >= x &] // 長度, Select[Pick[proba0, Y, 1], # >= x &] // 長度 } // EV[#[[1]]/(#[[1]] + #[[2]])]*(#[[1]] + #[[2]]) &, {x, 0.5, 0.7} ]
Plot[ { Select[Pick[proba1, Y, 1], # >= x &] // Length, Select[Pick[proba1, Y, 0], # >= x &] // Length } // EV[#[[1]]/(#[[1]] + #[[2]])]*(#[[1]] + #[[2]]) &, {x, 0.5, 0.7} ]