diff --git a/config/ml/alpha_compose_backtest.json b/config/ml/alpha_compose_backtest.json index 5b796bfaf..00692b8a6 100644 --- a/config/ml/alpha_compose_backtest.json +++ b/config/ml/alpha_compose_backtest.json @@ -1,424 +1,424 @@ { "bins": [ { - "avg_n_trades": 477.0899963378906, + "avg_n_trades": 451.74334716796875, "cost": 0.0, - "mean_reward": -11.580000877380371, + "mean_reward": -10.72819995880127, "n_episodes": 300, - "p05": -22.575578689575195, - "p50": -11.476005554199219, - "p95": 2.4081244468688965, - "sharpe_annualised": -41.78176498413086, - "sharpe_per_episode": -1.4599729776382446, - "std_reward": 7.931654453277588, + "p05": -26.052268981933594, + "p50": -10.36817741394043, + "p95": 4.74384880065918, + "sharpe_annualised": -28.334871292114258, + "sharpe_per_episode": -0.9901005029678345, + "std_reward": 10.835465431213379, "threshold": 0.0, - "win_rate": 0.07666666805744171 + "win_rate": 0.11666666716337204 }, { - "avg_n_trades": 476.27667236328125, + "avg_n_trades": 451.5833435058594, "cost": 0.0625, - "mean_reward": -19.83131217956543, + "mean_reward": -18.23717498779297, "n_episodes": 300, - "p05": -32.835304260253906, - "p50": -19.831050872802734, - "p95": -6.751925468444824, - "sharpe_annualised": -71.4566879272461, - "sharpe_per_episode": -2.496898651123047, - "std_reward": 7.942378044128418, + "p05": -32.81657409667969, + "p50": -17.798627853393555, + "p95": -5.656877517700195, + "sharpe_annualised": -55.0507698059082, + "sharpe_per_episode": -1.9236295223236084, + "std_reward": 9.480607032775879, "threshold": 0.0, - "win_rate": 0.006666666828095913 - }, - { - "avg_n_trades": 481.7133483886719, - "cost": 0.125, - "mean_reward": -29.428951263427734, - "n_episodes": 300, - "p05": -46.65030288696289, - "p50": -28.805376052856445, - "p95": -13.693151473999023, - "sharpe_annualised": -86.77941131591797, - "sharpe_per_episode": -3.032318115234375, - "std_reward": 9.705100059509277, - "threshold": 0.0, - "win_rate": 0.0033333334140479565 - }, - { - "avg_n_trades": 480.3333435058594, - "cost": 0.25, - "mean_reward": -48.30219268798828, - "n_episodes": 300, - "p05": -67.57722473144531, - "p50": -46.67949676513672, - "p95": -31.478973388671875, - "sharpe_annualised": -108.57279968261719, - "sharpe_per_episode": -3.7938406467437744, - "std_reward": 12.73173999786377, - "threshold": 0.0, - "win_rate": 0.0 - }, - { - "avg_n_trades": 478.3133239746094, - "cost": 0.5, - "mean_reward": -83.0477294921875, - "n_episodes": 300, - "p05": -108.5387954711914, - "p50": -81.84159088134766, - "p95": -58.206626892089844, - "sharpe_annualised": -146.75875854492188, - "sharpe_per_episode": -5.128166198730469, - "std_reward": 16.19443130493164, - "threshold": 0.0, - "win_rate": 0.0 - }, - { - "avg_n_trades": 401.3333435058594, - "cost": 0.0, - "mean_reward": -9.551131248474121, - "n_episodes": 300, - "p05": -23.94935417175293, - "p50": -8.9005765914917, - "p95": 5.565349578857422, - "sharpe_annualised": -27.86334800720215, - "sharpe_per_episode": -0.9736241698265076, - "std_reward": 9.80987548828125, - "threshold": 0.05000000074505806, - "win_rate": 0.1133333370089531 - }, - { - "avg_n_trades": 393.0733337402344, - "cost": 0.0625, - "mean_reward": -16.152053833007812, - "n_episodes": 300, - "p05": -30.313827514648438, - "p50": -15.583097457885742, - "p95": -2.770275592803955, - "sharpe_annualised": -53.90193176269531, - "sharpe_per_episode": -1.8834859132766724, - "std_reward": 8.575616836547852, - "threshold": 0.05000000074505806, "win_rate": 0.02666666731238365 }, { - "avg_n_trades": 400.413330078125, + "avg_n_trades": 455.510009765625, "cost": 0.125, - "mean_reward": -24.998205184936523, + "mean_reward": -26.240476608276367, "n_episodes": 300, - "p05": -42.52478790283203, - "p50": -23.242856979370117, - "p95": -9.703174591064453, - "sharpe_annualised": -68.45292663574219, - "sharpe_per_episode": -2.3919389247894287, - "std_reward": 10.451022148132324, - "threshold": 0.05000000074505806, - "win_rate": 0.0033333334140479565 + "p05": -41.32231903076172, + "p50": -26.38330078125, + "p95": -12.855978965759277, + "sharpe_annualised": -86.34113311767578, + "sharpe_per_episode": -3.017003297805786, + "std_reward": 8.697529792785645, + "threshold": 0.0, + "win_rate": 0.0 }, { - "avg_n_trades": 395.1866760253906, + "avg_n_trades": 454.6600036621094, "cost": 0.25, - "mean_reward": -38.649471282958984, + "mean_reward": -41.06214141845703, "n_episodes": 300, - "p05": -57.62205123901367, - "p50": -38.203250885009766, - "p95": -23.15749740600586, - "sharpe_annualised": -104.59449005126953, - "sharpe_per_episode": -3.654827356338501, - "std_reward": 10.574910163879395, - "threshold": 0.05000000074505806, + "p05": -57.790008544921875, + "p50": -40.88361740112305, + "p95": -20.842697143554688, + "sharpe_annualised": -110.67660522460938, + "sharpe_per_episode": -3.8673534393310547, + "std_reward": 10.617633819580078, + "threshold": 0.0, "win_rate": 0.0 }, { - "avg_n_trades": 392.3766784667969, + "avg_n_trades": 459.260009765625, "cost": 0.5, - "mean_reward": -68.999755859375, + "mean_reward": -74.15150451660156, "n_episodes": 300, - "p05": -95.44992065429688, - "p50": -66.09086608886719, - "p95": -49.909767150878906, - "sharpe_annualised": -127.27163696289062, - "sharpe_per_episode": -4.447230815887451, - "std_reward": 15.515217781066895, - "threshold": 0.05000000074505806, + "p05": -106.13854217529297, + "p50": -72.46161651611328, + "p95": -47.33892822265625, + "sharpe_annualised": -116.2009048461914, + "sharpe_per_episode": -4.060388088226318, + "std_reward": 18.26217269897461, + "threshold": 0.0, "win_rate": 0.0 }, { - "avg_n_trades": 307.6400146484375, + "avg_n_trades": 370.260009765625, "cost": 0.0, - "mean_reward": -6.366776466369629, + "mean_reward": -8.213351249694824, "n_episodes": 300, - "p05": -22.731773376464844, - "p50": -5.475202560424805, - "p95": 6.573000431060791, - "sharpe_annualised": -20.232799530029297, - "sharpe_per_episode": -0.7069912552833557, - "std_reward": 9.005453109741211, - "threshold": 0.10000000149011612, - "win_rate": 0.16333332657814026 + "p05": -22.143348693847656, + "p50": -7.91927433013916, + "p95": 5.754604339599609, + "sharpe_annualised": -27.00295639038086, + "sharpe_per_episode": -0.9435596466064453, + "std_reward": 8.704645156860352, + "threshold": 0.05000000074505806, + "win_rate": 0.09666666388511658 }, { - "avg_n_trades": 315.8599853515625, + "avg_n_trades": 370.75665283203125, "cost": 0.0625, - "mean_reward": -12.57988452911377, + "mean_reward": -15.160398483276367, "n_episodes": 300, - "p05": -30.93537139892578, - "p50": -11.238504409790039, - "p95": -0.2330303192138672, - "sharpe_annualised": -39.50290298461914, - "sharpe_per_episode": -1.3803430795669556, - "std_reward": 9.113592147827148, - "threshold": 0.10000000149011612, + "p05": -32.71171569824219, + "p50": -14.214750289916992, + "p95": -0.866797685623169, + "sharpe_annualised": -37.087486267089844, + "sharpe_per_episode": -1.2959415912628174, + "std_reward": 11.698366165161133, + "threshold": 0.05000000074505806, "win_rate": 0.046666666865348816 }, { - "avg_n_trades": 310.2099914550781, + "avg_n_trades": 369.0333251953125, "cost": 0.125, - "mean_reward": -17.49962043762207, + "mean_reward": -20.403078079223633, "n_episodes": 300, - "p05": -34.14094543457031, - "p50": -15.837596893310547, - "p95": -3.5142734050750732, - "sharpe_annualised": -53.26398468017578, - "sharpe_per_episode": -1.8611942529678345, - "std_reward": 9.402361869812012, - "threshold": 0.10000000149011612, - "win_rate": 0.013333333656191826 - }, - { - "avg_n_trades": 314.6833190917969, - "cost": 0.25, - "mean_reward": -30.126296997070312, - "n_episodes": 300, - "p05": -52.358428955078125, - "p50": -28.658782958984375, - "p95": -13.625950813293457, - "sharpe_annualised": -71.65260314941406, - "sharpe_per_episode": -2.503744602203369, - "std_reward": 12.032496452331543, - "threshold": 0.10000000149011612, - "win_rate": 0.0 - }, - { - "avg_n_trades": 309.2866516113281, - "cost": 0.5, - "mean_reward": -52.3604736328125, - "n_episodes": 300, - "p05": -79.04839324951172, - "p50": -50.56077194213867, - "p95": -27.740079879760742, - "sharpe_annualised": -82.7920913696289, - "sharpe_per_episode": -2.8929898738861084, - "std_reward": 18.09908676147461, - "threshold": 0.10000000149011612, - "win_rate": 0.0 - }, - { - "avg_n_trades": 236.6266632080078, - "cost": 0.0, - "mean_reward": -5.102373123168945, - "n_episodes": 300, - "p05": -18.235349655151367, - "p50": -3.8291523456573486, - "p95": 3.9433228969573975, - "sharpe_annualised": -16.905658721923828, - "sharpe_per_episode": -0.5907315015792847, - "std_reward": 8.637381553649902, - "threshold": 0.15000000596046448, - "win_rate": 0.20999999344348907 - }, - { - "avg_n_trades": 228.65333557128906, - "cost": 0.0625, - "mean_reward": -8.878447532653809, - "n_episodes": 300, - "p05": -25.199073791503906, - "p50": -6.852076053619385, - "p95": 2.099073886871338, - "sharpe_annualised": -28.601604461669922, - "sharpe_per_episode": -0.9994209408760071, - "std_reward": 8.88359260559082, - "threshold": 0.15000000596046448, - "win_rate": 0.07666666805744171 - }, - { - "avg_n_trades": 232.20333862304688, - "cost": 0.125, - "mean_reward": -12.617223739624023, - "n_episodes": 300, - "p05": -31.3784236907959, - "p50": -9.867401123046875, - "p95": -1.0055747032165527, - "sharpe_annualised": -34.65873718261719, - "sharpe_per_episode": -1.2110742330551147, - "std_reward": 10.418208122253418, - "threshold": 0.15000000596046448, - "win_rate": 0.036666665226221085 - }, - { - "avg_n_trades": 231.2066650390625, - "cost": 0.25, - "mean_reward": -20.333833694458008, - "n_episodes": 300, - "p05": -44.20069122314453, - "p50": -17.208972930908203, - "p95": -7.3099260330200195, - "sharpe_annualised": -50.19882583618164, - "sharpe_per_episode": -1.7540888786315918, - "std_reward": 11.59224796295166, - "threshold": 0.15000000596046448, - "win_rate": 0.013333333656191826 - }, - { - "avg_n_trades": 228.2899932861328, - "cost": 0.5, - "mean_reward": -36.5968132019043, - "n_episodes": 300, - "p05": -63.5013313293457, - "p50": -31.710899353027344, - "p95": -16.777376174926758, - "sharpe_annualised": -64.87017059326172, - "sharpe_per_episode": -2.266747236251831, - "std_reward": 16.145078659057617, - "threshold": 0.15000000596046448, - "win_rate": 0.0 - }, - { - "avg_n_trades": 168.1199951171875, - "cost": 0.0, - "mean_reward": -5.073331832885742, - "n_episodes": 300, - "p05": -21.23957061767578, - "p50": -2.783275604248047, - "p95": 4.150900363922119, - "sharpe_annualised": -15.721929550170898, - "sharpe_per_episode": -0.549368679523468, - "std_reward": 9.234840393066406, - "threshold": 0.20000000298023224, - "win_rate": 0.20333333313465118 - }, - { - "avg_n_trades": 166.10333251953125, - "cost": 0.0625, - "mean_reward": -6.372754096984863, - "n_episodes": 300, - "p05": -21.26305389404297, - "p50": -4.527249813079834, - "p95": 2.169199228286743, - "sharpe_annualised": -22.731422424316406, - "sharpe_per_episode": -0.7943001985549927, - "std_reward": 8.023104667663574, - "threshold": 0.20000000298023224, - "win_rate": 0.09333333373069763 - }, - { - "avg_n_trades": 167.32000732421875, - "cost": 0.125, - "mean_reward": -9.114399909973145, - "n_episodes": 300, - "p05": -27.226896286010742, - "p50": -6.687276363372803, - "p95": 0.4474220275878906, - "sharpe_annualised": -29.17302703857422, - "sharpe_per_episode": -1.0193880796432495, - "std_reward": 8.941049575805664, - "threshold": 0.20000000298023224, - "win_rate": 0.06333333253860474 - }, - { - "avg_n_trades": 166.086669921875, - "cost": 0.25, - "mean_reward": -15.02822208404541, - "n_episodes": 300, - "p05": -36.3570556640625, - "p50": -12.731026649475098, - "p95": -4.7999491691589355, - "sharpe_annualised": -46.5723991394043, - "sharpe_per_episode": -1.6273713111877441, - "std_reward": 9.234661102294922, - "threshold": 0.20000000298023224, + "p05": -34.1339111328125, + "p50": -20.087478637695312, + "p95": -9.10377311706543, + "sharpe_annualised": -75.91487884521484, + "sharpe_per_episode": -2.6526806354522705, + "std_reward": 7.691493988037109, + "threshold": 0.05000000074505806, "win_rate": 0.006666666828095913 }, { - "avg_n_trades": 175.14666748046875, - "cost": 0.5, - "mean_reward": -27.366077423095703, + "avg_n_trades": 371.84332275390625, + "cost": 0.25, + "mean_reward": -33.83988571166992, "n_episodes": 300, - "p05": -50.28740692138672, - "p50": -23.888004302978516, - "p95": -11.858697891235352, - "sharpe_annualised": -62.76474380493164, - "sharpe_per_episode": -2.1931777000427246, - "std_reward": 12.477821350097656, - "threshold": 0.20000000298023224, + "p05": -53.0679931640625, + "p50": -32.836673736572266, + "p95": -19.397377014160156, + "sharpe_annualised": -96.48247528076172, + "sharpe_per_episode": -3.371370553970337, + "std_reward": 10.037426948547363, + "threshold": 0.05000000074505806, "win_rate": 0.0 }, { - "avg_n_trades": 136.49000549316406, + "avg_n_trades": 373.9566650390625, + "cost": 0.5, + "mean_reward": -60.00151824951172, + "n_episodes": 300, + "p05": -81.8888931274414, + "p50": -59.34823226928711, + "p95": -42.3861198425293, + "sharpe_annualised": -136.0745849609375, + "sharpe_per_episode": -4.754830837249756, + "std_reward": 12.619065284729004, + "threshold": 0.05000000074505806, + "win_rate": 0.0 + }, + { + "avg_n_trades": 286.7366638183594, "cost": 0.0, - "mean_reward": -5.5052690505981445, + "mean_reward": -6.028912544250488, "n_episodes": 300, - "p05": -21.544471740722656, - "p50": -2.841050148010254, - "p95": 2.903995990753174, - "sharpe_annualised": -18.832592010498047, - "sharpe_per_episode": -0.6580640077590942, - "std_reward": 8.365856170654297, - "threshold": 0.25, - "win_rate": 0.17000000178813934 + "p05": -17.442401885986328, + "p50": -5.043452262878418, + "p95": 3.8487255573272705, + "sharpe_annualised": -21.08204460144043, + "sharpe_per_episode": -0.7366662621498108, + "std_reward": 8.184048652648926, + "threshold": 0.10000000149011612, + "win_rate": 0.1433333307504654 }, { - "avg_n_trades": 138.30332946777344, + "avg_n_trades": 297.32000732421875, "cost": 0.0625, - "mean_reward": -7.428314685821533, + "mean_reward": -11.952619552612305, "n_episodes": 300, - "p05": -25.75029754638672, - "p50": -4.445875644683838, - "p95": 2.239424467086792, - "sharpe_annualised": -21.298498153686523, - "sharpe_per_episode": -0.7442297339439392, - "std_reward": 9.98121166229248, - "threshold": 0.25, - "win_rate": 0.10999999940395355 - }, - { - "avg_n_trades": 133.67333984375, - "cost": 0.125, - "mean_reward": -9.272025108337402, - "n_episodes": 300, - "p05": -26.37662696838379, - "p50": -6.8429741859436035, - "p95": -0.16450214385986328, - "sharpe_annualised": -33.544925689697266, - "sharpe_per_episode": -1.1721545457839966, - "std_reward": 7.910241603851318, - "threshold": 0.25, + "p05": -27.852296829223633, + "p50": -9.96550178527832, + "p95": -0.7230279445648193, + "sharpe_annualised": -34.2513427734375, + "sharpe_per_episode": -1.1968387365341187, + "std_reward": 9.986825942993164, + "threshold": 0.10000000149011612, "win_rate": 0.05000000074505806 }, { - "avg_n_trades": 132.44667053222656, - "cost": 0.25, - "mean_reward": -14.290428161621094, + "avg_n_trades": 285.8933410644531, + "cost": 0.125, + "mean_reward": -16.28207778930664, "n_episodes": 300, - "p05": -33.351287841796875, - "p50": -10.576525688171387, - "p95": -4.033750057220459, - "sharpe_annualised": -42.11674118041992, - "sharpe_per_episode": -1.4716780185699463, - "std_reward": 9.710295677185059, - "threshold": 0.25, + "p05": -35.10637283325195, + "p50": -14.313798904418945, + "p95": -4.262900352478027, + "sharpe_annualised": -44.82547378540039, + "sharpe_per_episode": -1.566328763961792, + "std_reward": 10.395057678222656, + "threshold": 0.10000000149011612, + "win_rate": 0.02666666731238365 + }, + { + "avg_n_trades": 295.2900085449219, + "cost": 0.25, + "mean_reward": -25.938884735107422, + "n_episodes": 300, + "p05": -44.77133560180664, + "p50": -24.313446044921875, + "p95": -9.273771286010742, + "sharpe_annualised": -62.883323669433594, + "sharpe_per_episode": -2.1973211765289307, + "std_reward": 11.804777145385742, + "threshold": 0.10000000149011612, "win_rate": 0.006666666828095913 }, { - "avg_n_trades": 136.05332946777344, + "avg_n_trades": 280.7466735839844, "cost": 0.5, - "mean_reward": -21.997268676757812, + "mean_reward": -44.50050354003906, "n_episodes": 300, - "p05": -41.8651237487793, - "p50": -20.465248107910156, - "p95": -7.810499668121338, - "sharpe_annualised": -54.85932159423828, - "sharpe_per_episode": -1.9169398546218872, - "std_reward": 11.475200653076172, - "threshold": 0.25, + "p05": -66.49164581298828, + "p50": -42.04655075073242, + "p95": -26.325918197631836, + "sharpe_annualised": -99.81108856201172, + "sharpe_per_episode": -3.4876816272735596, + "std_reward": 12.7593355178833, + "threshold": 0.10000000149011612, + "win_rate": 0.0 + }, + { + "avg_n_trades": 223.94000244140625, + "cost": 0.0, + "mean_reward": -5.630343914031982, + "n_episodes": 300, + "p05": -23.06067657470703, + "p50": -3.5636019706726074, + "p95": 5.983572483062744, + "sharpe_annualised": -17.714860916137695, + "sharpe_per_episode": -0.6190073490142822, + "std_reward": 9.095762252807617, + "threshold": 0.15000000596046448, + "win_rate": 0.1733333319425583 + }, + { + "avg_n_trades": 224.2066650390625, + "cost": 0.0625, + "mean_reward": -7.762266159057617, + "n_episodes": 300, + "p05": -23.935901641845703, + "p50": -5.957376480102539, + "p95": 3.385673999786377, + "sharpe_annualised": -26.093162536621094, + "sharpe_per_episode": -0.911768913269043, + "std_reward": 8.51341438293457, + "threshold": 0.15000000596046448, + "win_rate": 0.09000000357627869 + }, + { + "avg_n_trades": 227.23333740234375, + "cost": 0.125, + "mean_reward": -13.033651351928711, + "n_episodes": 300, + "p05": -32.822052001953125, + "p50": -10.511049270629883, + "p95": -2.25492525100708, + "sharpe_annualised": -38.49271011352539, + "sharpe_per_episode": -1.3450441360473633, + "std_reward": 9.690128326416016, + "threshold": 0.15000000596046448, + "win_rate": 0.009999999776482582 + }, + { + "avg_n_trades": 233.4933319091797, + "cost": 0.25, + "mean_reward": -21.03263282775879, + "n_episodes": 300, + "p05": -40.14529800415039, + "p50": -19.439125061035156, + "p95": -8.333877563476562, + "sharpe_annualised": -57.79651641845703, + "sharpe_per_episode": -2.01957368850708, + "std_reward": 10.41439151763916, + "threshold": 0.15000000596046448, + "win_rate": 0.006666666828095913 + }, + { + "avg_n_trades": 225.48666381835938, + "cost": 0.5, + "mean_reward": -33.60525131225586, + "n_episodes": 300, + "p05": -55.04161834716797, + "p50": -31.479198455810547, + "p95": -15.453825950622559, + "sharpe_annualised": -68.2383041381836, + "sharpe_per_episode": -2.38443922996521, + "std_reward": 14.093565940856934, + "threshold": 0.15000000596046448, + "win_rate": 0.0 + }, + { + "avg_n_trades": 159.84666442871094, + "cost": 0.0, + "mean_reward": -4.220123291015625, + "n_episodes": 300, + "p05": -20.078947067260742, + "p50": -2.5951507091522217, + "p95": 3.9630990028381348, + "sharpe_annualised": -17.054563522338867, + "sharpe_per_episode": -0.5959346890449524, + "std_reward": 7.081520080566406, + "threshold": 0.20000000298023224, + "win_rate": 0.18000000715255737 + }, + { + "avg_n_trades": 167.7866668701172, + "cost": 0.0625, + "mean_reward": -6.742062091827393, + "n_episodes": 300, + "p05": -24.98937225341797, + "p50": -4.563099384307861, + "p95": 2.2458012104034424, + "sharpe_annualised": -22.914066314697266, + "sharpe_per_episode": -0.8006822466850281, + "std_reward": 8.42039680480957, + "threshold": 0.20000000298023224, + "win_rate": 0.12999999523162842 + }, + { + "avg_n_trades": 165.1233367919922, + "cost": 0.125, + "mean_reward": -9.334568977355957, + "n_episodes": 300, + "p05": -27.746673583984375, + "p50": -7.128000259399414, + "p95": -0.07927465438842773, + "sharpe_annualised": -31.278589248657227, + "sharpe_per_episode": -1.092962384223938, + "std_reward": 8.540613174438477, + "threshold": 0.20000000298023224, + "win_rate": 0.046666666865348816 + }, + { + "avg_n_trades": 173.01666259765625, + "cost": 0.25, + "mean_reward": -15.824145317077637, + "n_episodes": 300, + "p05": -35.53749084472656, + "p50": -13.105096817016602, + "p95": -4.606574535369873, + "sharpe_annualised": -47.958587646484375, + "sharpe_per_episode": -1.6758086681365967, + "std_reward": 9.442691802978516, + "threshold": 0.20000000298023224, + "win_rate": 0.0 + }, + { + "avg_n_trades": 164.22666931152344, + "cost": 0.5, + "mean_reward": -24.750625610351562, + "n_episodes": 300, + "p05": -46.327919006347656, + "p50": -22.30762481689453, + "p95": -10.495248794555664, + "sharpe_annualised": -64.83598327636719, + "sharpe_per_episode": -2.265552520751953, + "std_reward": 10.924762725830078, + "threshold": 0.20000000298023224, "win_rate": 0.0033333334140479565 + }, + { + "avg_n_trades": 136.1999969482422, + "cost": 0.0, + "mean_reward": -5.492737293243408, + "n_episodes": 300, + "p05": -20.194347381591797, + "p50": -2.940850019454956, + "p95": 2.9858238697052, + "sharpe_annualised": -19.53951644897461, + "sharpe_per_episode": -0.6827659606933594, + "std_reward": 8.044831275939941, + "threshold": 0.25, + "win_rate": 0.20666666328907013 + }, + { + "avg_n_trades": 135.9566650390625, + "cost": 0.0625, + "mean_reward": -7.7528533935546875, + "n_episodes": 300, + "p05": -23.993549346923828, + "p50": -5.217850685119629, + "p95": 0.9867243766784668, + "sharpe_annualised": -26.615497589111328, + "sharpe_per_episode": -0.9300207495689392, + "std_reward": 8.336215019226074, + "threshold": 0.25, + "win_rate": 0.09000000357627869 + }, + { + "avg_n_trades": 131.84666442871094, + "cost": 0.125, + "mean_reward": -9.753680229187012, + "n_episodes": 300, + "p05": -28.568151473999023, + "p50": -7.167825222015381, + "p95": -0.901602029800415, + "sharpe_annualised": -31.260038375854492, + "sharpe_per_episode": -1.0923141241073608, + "std_reward": 8.929372787475586, + "threshold": 0.25, + "win_rate": 0.02666666731238365 + }, + { + "avg_n_trades": 135.81333923339844, + "cost": 0.25, + "mean_reward": -13.736656188964844, + "n_episodes": 300, + "p05": -34.117652893066406, + "p50": -10.9698486328125, + "p95": -1.744225263595581, + "sharpe_annualised": -36.68037033081055, + "sharpe_per_episode": -1.2817158699035645, + "std_reward": 10.717395782470703, + "threshold": 0.25, + "win_rate": 0.013333333656191826 + }, + { + "avg_n_trades": 136.97999572753906, + "cost": 0.5, + "mean_reward": -22.093671798706055, + "n_episodes": 300, + "p05": -45.44099807739258, + "p50": -19.13762664794922, + "p95": -7.422874450683594, + "sharpe_annualised": -53.82737350463867, + "sharpe_per_episode": -1.88088059425354, + "std_reward": 11.746451377868652, + "threshold": 0.25, + "win_rate": 0.0 } ], "cost_grid": [ diff --git a/crates/ml/examples/alpha_compose_backtest.rs b/crates/ml/examples/alpha_compose_backtest.rs index 82c51b83d..8e66e05ac 100644 --- a/crates/ml/examples/alpha_compose_backtest.rs +++ b/crates/ml/examples/alpha_compose_backtest.rs @@ -97,6 +97,14 @@ struct Cli { /// Training-time cost (the policy LEARNED against this cost). #[arg(long, default_value_t = 0.0625)] train_cost: f32, + /// Training-time alpha-confidence threshold for the gate. Forces + /// Wait during training when `|sigmoid(alpha)−0.5| < this`, so the + /// Q-network learns weights for the gated policy class. Default + /// 0.39 — the equilibrium the controller stabilized to in the + /// Phase E.2 smoke (alpha_dqn_h600_smoke at ep 200+). Set to 0.0 + /// for the original ungated-training behavior. + #[arg(long, default_value_t = 0.39)] + train_threshold: f32, /// SGD learning rate during training. #[arg(long, default_value_t = 1.0e-4)] lr: f32, @@ -323,7 +331,18 @@ fn main() -> Result<()> { } stream.synchronize()?; let q_host = stream.clone_dtoh(&single_q_dev)?; - let action = epsilon_greedy(&q_host, eps, &mut episode_rng); + // Phase E.3: gate during training so the Q-network learns the + // value function for the gated policy class. Using a FIXED + // threshold (--train-threshold) keeps the backtest self-contained + // — no controller invocation needed. The default 0.39 is the + // equilibrium the smoke's controller stabilized on. + let action = epsilon_greedy_gated( + &q_host, + s_vec[1], + cli.train_threshold, + eps, + &mut episode_rng, + ); let (_s_next, reward, done) = env .step(action, &mut state) .ok_or_else(|| anyhow::anyhow!("step returned None"))?;