EasyTrader ArtNo 143
近期Wen大的部落格提供了一個國外 MINMAX策略 ,主邏輯是一個抓轉折的概念 ,也算是逆勢策略的想法,我已將它略作修改轉成另一個策略元素單獨使用上網 MBA智庫得到的答案如下 :
最大最小策略(Maximin strategy),也稱最小最大化策略(Minmax Strategy)、極大最小化策略、保留策略
最大最小策略概述
需要強調說明的是,優勢策略均衡與納什均衡的概念是建立在博弈者理性行為的基礎上的。每一個博弈者的策略選擇不僅依賴於自己的理性行為,也依賴於對手的理性行為。即,不僅每個博弈者自己是理性的,而且每個博弈者知道對手是理性的,每個博弈者知道對手知道自己是理性的,每個博弈者知道對手知道自己知道對手是理性的,……等等。
正是因為要達到優勢策略均衡或納什均衡是需要絕對理性的。任何出現了一點錯誤將可能使博弈者蒙受巨大的損失,因而可能有player會採取比較保守的策略。
其中一種保守的策略是最大最小策略(Maximin strategy)。
最大最小策略是什麼呢?它是指博弈者所採取的策略是使自己能夠獲得的最小收入最大化。所謂最小收入是指採取某一種策略所能獲得的最小收入。
最大最小策略是一種保守的策略而不是利潤最大化的策略。
很顯然,博弈者往往是在信息不完全的情況下才採取最大最小策略。在信息完全的情形下,他肯定是會採取促使他利潤最大化的策略。
Min-Max搜尋演算法
在棋類對戰遊戲中,玩家必須具備推算對方可能應對走法的能力,並且在所有可能的走法組合中加以評估,然後辨認出最有利的一步棋。我們通常利用樹狀結構(又稱:對局樹或遊戲樹)來記錄對弈過程,透過樹狀搜尋,尋找對雙方都可以滿意的下法。而這個算法稱為“最小-最大搜索演算法”(Min-Max Search)。最先由John von Neumann於1928年完整描述。
此演算法從根點開始,產生所有可能的走法,以深度優先的方式向下進行節點的拜訪,當拜訪到給定深度後,再從葉節點處使用審局函數來判斷好壞,盤面從審局函數會回傳不同的分數,最後根據每個節點我方或對方走步,分別選擇能夠得到最大或最小分數的走法,來選擇自己贏面較大的路徑。
此演算法在輪到我方走步時,選擇能得到最大分數的走法,反之,輪到對手走步時,則選取使我方得到最小分數的走法。因此Min-Max搜尋演算法在對局數不同層中,交互使用MAX和MIN的走法。
雖然太理論的東西有點看不懂,不過這程式碼倒是可以測試的 , 程式碼本身的出場方式好幾種 ,因此我將主程式獨立 ,並將各出場邏輯也分開 ,組裝成我過去在一些部落格測試方法 ( 使用 ExitType 作選擇 )
{ ****** MINMAX Exit Type **********}
if ExitType = 7 then Begin
{ Place target exit orders }
If SetupL then Begin
if Trend < 0 then XTargL = EntPrL + TargFr1 * Average(TrueRange, 10)
else XTargL = EntPrL + TargFr2 * Average(TrueRange, 10);
ExitLong("TargL0") next bar at XTargL limit;
end;
If SetupS then Begin
if Trend > 0 then XTargS = EntPrS - TargFr1 * Average(TrueRange, 10)
else XTargS = EntPrS - TargFr2 * Average(TrueRange, 10);
ExitShort("TargS0") next bar at XTargS limit;
end;
end;
if ExitType = 8 then Begin
{ If long, calculate money management stop relative to entry }
If MarketPosition = 1 and BarsSinceEntry = 0 then Begin
XMML = EntryPrice - MMSizeL;
XTrailL = 0;
End;
{ If short, calculate money management stop relative to entry }
If MarketPosition = -1 and BarsSinceEntry = 0 then Begin
XMMS = EntryPrice + MMSizeS;
XTrailS = 9999999;
End;
{ Place money management stops for longs and shorts }
ExitLong("MM StopL") next bar at XMML stop;
ExitShort("MM StopS") next bar at XMMS stop;
end;
if ExitType = 9 then Begin
{ Calculate trailing stop for long trade }
If MarketPosition = 1 then Begin
XTrailL = MaxList(XTrailL, C - ExitFrL * TrueRange);
ExitLong("TrailL") next bar at XTrailL stop;
End;
{ Calculate trailing stop for short trade }
If MarketPosition = -1 then Begin
XTrailS = MinList(XTrailS, C + ExitFrS * TrueRange);
ExitShort("TrailS") next bar at XTrailS stop;
End;
end;
if ExitType = 10 then Begin
{ Exit on close of first profitable open if against trend }
If MarketPosition = 1 and Trend[1] < 0 and open > EntryPrice then
ExitLong("BailL") this bar at close;
If MarketPosition = -1 and Trend[1] > 0 and open < EntryPrice then
ExitShort("BailS") this bar at close;
end;
if ExitType = 11 then Begin
{ Exit at a target; use a tigher target if trade is agains the trend }
If MarketPosition = 1 then Begin
if Trend < 0 then XTargL = EntryPrice + TargFr1 * Average(TrueRange, 10)
else XTargL = EntryPrice + TargFr2 * Average(TrueRange, 10);
ExitLong("TargL") next bar at XTargL limit;
End;
If MarketPosition = -1 then Begin
if Trend > 0 then XTargS = EntryPrice - TargFr1 * Average(TrueRange, 10)
else XTargS = EntryPrice - TargFr2 * Average(TrueRange, 10);
ExitShort("TargS") next bar at XTargS limit;
End;
end;
當研究複雜的外來策略時 , 可以先將主邏輯與出場分解個別去了解後 ,再作必要的組合
If MarketPosition = -1 then Begin
XTrailS = MinList(XTrailS, C + ExitFrS * TrueRange);
ExitShort("TrailS") next bar at XTrailS stop;
End;
end;
if ExitType = 10 then Begin
{ Exit on close of first profitable open if against trend }
If MarketPosition = 1 and Trend[1] < 0 and open > EntryPrice then
ExitLong("BailL") this bar at close;
If MarketPosition = -1 and Trend[1] > 0 and open < EntryPrice then
ExitShort("BailS") this bar at close;
end;
if ExitType = 11 then Begin
{ Exit at a target; use a tigher target if trade is agains the trend }
If MarketPosition = 1 then Begin
if Trend < 0 then XTargL = EntryPrice + TargFr1 * Average(TrueRange, 10)
else XTargL = EntryPrice + TargFr2 * Average(TrueRange, 10);
ExitLong("TargL") next bar at XTargL limit;
End;
If MarketPosition = -1 then Begin
if Trend > 0 then XTargS = EntryPrice - TargFr1 * Average(TrueRange, 10)
else XTargS = EntryPrice - TargFr2 * Average(TrueRange, 10);
ExitShort("TargS") next bar at XTargS limit;
End;
end;
當研究複雜的外來策略時 , 可以先將主邏輯與出場分解個別去了解後 ,再作必要的組合
沒有留言:
張貼留言