Files
FX-ML-Trading-Engine/Q Research/scripts/__pycache__/backtest_strategy.cpython-313.pyc
T

214 lines
44 KiB
Plaintext
Raw Normal View History

2025-11-14 23:16:51 +00:00
ó
9i3¥ã6óü*SSKJr SSKrSSKrSSKJr SSKJrJr \RR\RR\RR\RR\ 5555 SSK
r
SSKrSSKrSSKrSSKJrJr SSKJrJrJr SSKJr SSKJrJrJrJ r J!r!J"r" SS K#J$r$ SS
K%J&r&J'r'J(r( \RR\RR\ 55r)\RRU\)S 5r+\RRU\+S 5r,\RRU\+S
5r-\RRU\+S5r.\RRU\.S5r/\RRU\.S5r0\RRU\.S5r1\RRU\1S5r2\RRU\)S5r3\RRU\+S5r4\RRU\+S5r5\,\-\/\0\1\2\3\4\54 Hr6\Rn"\6SS9 M SüSjr8\&4SýSjjr9SþSjr:SÿSjr;GSS jr<GSS!jr=GSS"jr>S#\RRU\,S$5S%S&S'SS(S)S*S+S,S-SS.S/S0S0SSS1S2S3S4SSS5SSSS6SS1SSSS1SSSS7S8S2S2S2S2S8SSSS1S\&\3S46GSSgjjr?Shr@GSGSSjjjrA\BSk:XGa˜SSKCrC\CRˆ"5rE\ERSlSmSnSo9 \ERSp\GS#SqSr9 \ERSs\G\RRU\,S$5StSr9 \ERSu\HS-SvSr9 \ERSw\HS5SxSr9 \ERSy\HS&SzSr9 \ERS{\IS%S|Sr9 \ERS}\GS'S~Sr9 \ERS\IS2S€Sr9 \ERS\ISiSSr9 \ERSƒ\IS*S„Sr9 \ERS…\IS†S‡Sr9 \ERSˆ\ISS‰Sr9 \ERSŠ\ISSSr9 \ERSŒ\ISSSr9 \ERSŽ\HS0SSr9 \ERSSN\HS5SS9 \ERS“SO\ISS”S9 \ERS•SP\ISSS9 \ERS—SQ\ISS˜S9 \ERS™SR\HS6SšS9 \ERSSS\HSSœS9 \ERSSK\HS4SžS9 \ERSŸSL\HSS S9 \ERS¡SM\HSS¢S9 \ERS£\HS0S¤Sr9 \ERS¥\ISS¦Sr9 \ERS§\ISS¨Sr9 \ERS©SmSªSo9 \ERS«\IS2S¬Sr9 \ERS­\IS3S®Sr9 \ERS¯SmS°So9 \ERS±\HSS²Sr9 \ERS³\HSS´Sr9 \ERSµ\GSS¶Sr9 \ERS·S¸SS¹Sº9 \ERS»SmS¼So9 \ERS½SmS¾So9 \ERS¿SmSÀSo9 \ERSÁS7SÂ/S7SÃSÄ9 \ERSÅ\IS8SÆSr9 \ERSÇ\GSÈSÉ9 \ERSÊ\GSËSÉ9 \ERSÌ\IS2SÍSr9 \ERSÎ\IS2SÏSr9 \ERSÐ\IS2SÑSr9 \ERSÒ\IS2SÓSr9 \ERSÔ\IS8SÕSr9 \ERSÖ\ISS×Sr9 \ERSØ\ISSÙSr9 \ERSÚ\ISSÛSr9 \ERSÜSmSÝSo9 \ER•5rK\!"\KR˜5rM\KRœ(au\A"\KRž\KR \KR¢\KR¤\KR¦\M\KR¨\KRª\KR¬\KR®\KR°SÞ9 g0rY\KR´(\["\KR´SßSàSá9r\\"\\5=(d 0r^0SS_SâS_SãSã_S:S:_S;S;_SäSä_SåSå_SæSæ_SçSç_SèSè_SéSé_SêSê_SBSB_SCSC_SDSD_SNSN_SOSO_0SPSP_SQSQ_SRSR_SSSS_SKSK_SLSL_SMSM_SESE_SFSF_SGSG_SHSH_SISI_SJSJ_STST_SUSU_SVSV_S<S<_ESWSXScSdSeSfSYSZS[Së. Er_0r`\^RÃ5H+urbrc\bRÉ
\c\`\_\e'M&\c\`\e'M- \`rYSSS5 O0rY\Y(a\!"\YRÍS<55OSrg\Y(a\ "\YRÍSY55OSrh\Y(a\YRÍSZ5OSri\Y(a\YRÍS[5OSrj\KRÖ(a\;"\KRÖ5ri\KRØ(a\;"\KRØ5rj0rm\KRÜ(Ga6SSK
r
SSKoro\Rn"\5SS9 \RRU\5Sì\KRžSí35rp\["\pSßSàSá9r\\
"\\5=(d 0rrSSS5 rsSïrtSðru\t"\rRÍSä55\t"\rRÍSå55\u"\rRÍSB55\u"\rRÍSC55\t"\rRÍSD55Sñ.rm\mRÃ5VVs0sH upUcM
X_M snnrm\"Sò\KRžSó\m35 \m=(d 05Hurbrc\b\Y;dM\c\Y\b'M rz\{"\ER•/55r|\}"GS0S\z"\KRž\|S\YRÍS55_S\z"\KR \|Sâ\YRÍS55_S9\z"\KR¤\|Sã\YRÍSã55_S:\z"\KR¢\|S:\YRÍS:55_S;\z"\KR¦\|S;\YRÍS;55_S\z"\KRü\|Sä\YRÍSä55_S\z"\KRþ\|Så\YRÍSå55_S=\z"\KR¨\|Sæ\YRÍSæ55_S>\z"\KR¬\|Sè\YRÍSè55_S?\z"\KRª\|Sç\YRÍSç55_S@\z"\KGR\|Sé\YRÍSé55_SA\z"\KGR\|Sê\YRÍSê55_SB\z"\KGR\|SB\YRÍSB55_SC\z"\KGR\|SC\YRÍSC55_SD\z"\KR®\|SD\YRÍSD55_SN\z"\KGR\|SN\YRÍSN55_SO\z"\KGR
\|SO\YRÍSO55_SP\z"\KGR \|SP\YRÍSP55_SQ\z"\KGR\|SQ\YRÍSQ55_SR\z"\KGR\|SR\YRÍSR55_SS\z"\KGR\|SS\YRÍSS55_SK\z"\KGR\|SK\YRÍSK55_SL\z"\KGR\|SL\YRÍSL55_SM\z"\KGR\|SM\YRÍSM55_SE\z"\KGR\|SE\YRÍSE55_SF\z"\KGR\|SF\YRÍSF55_SG\z"\KGR\|SG\YRÍSG55_SH\z"\KGR \|SH\YRÍSH55_SI\z"\KGR"\|SI\YRÍSI55_SJ\z"\KGR$\|SJ\YRÍSJ55_ST\z"\KGR&\|ST\YRÍST55_SU\z"\KGR(\|SU\YRÍSU55_SV\z"\KGR*\|SV\YRÍSV55_SX\z"\KGR,\|SX\YRÍSX55_Sc\z"\KGR.\|Sö\YRÍSc55_Sd\z"\KGR0\|S÷\YRÍSd55_Se\z"\KGR2\|Sø\YRÍSe55_Sf\z"\KR°\|Sf\YRÍSf55_SZ\i_S[\j_S\\z"\KGR4\|S\\YRÍS\55_S]\z"\KGR6\|S]\YRÍS]55_S^\z"\KGR8\|S^\YRÍS^55_S_\z"\KGR:\|S_\YRÍS_55_S`\z"\KGR<\|S`\YRÍS`55_Sa\z"\KGR>\|Sa\YRÍSa55_Sb\z"\KGR@\|Sb\YRÍSb55_6\H"\¡S5\¡S'\H"\¡S5\¡S'\H"\¡SD5\¡SD'\H"\¡RÍSES055\¡SE'\£"\¡SX5\¡SX'\¡Scb\I"\¡Sc5\¡Sc'\¡Sdb\I"\¡Sd5\¡Sd'\¡Seb\I"\¡Se5\¡Se'\¡RÍSF5b\I"\¡SF5\¡SF'\¡RÍSG5b\I"\¡SG5\¡SG'\£"\¡RÍSHS155\¡SH'\I"\¡RÍSIS255\¡SI'\I"\¡RÍSJS355\¡SJ'\H"\¡RÍSN5=(d S5\¡SN'\¡RÍSO5b\I"\¡SO5\¡SO'\¡RÍSP5b\I"\¡SP5\¡SP'\¡RÍSQ5b\I"\¡SQ5\¡SQ'\H"\¡RÍSR5=(d S5\¡SR'\H"\¡RÍSS5=(d S5\¡SS'\H"\¡RÍSK5=(d Sú5\¡SK'\¡RÍSL5b\H"\¡SL5\¡SL'\¡RÍSM5b\H"\¡SM5\¡SM'\KGRH\|Sû:wa\KGRH(+r¥O'\Y(a\YRÍSW5OSr¦\¦b\£"\¦5OSr¥\¥\¡SW'\""\g\M5\¡S<'\h\¡SY'\?"GS0\¡D6 gg!,(df  G N"=f!,(df  G
Nö=fs snnf!\wa rx\"Sô\x35 SrxCxG
NZSrxCxff=f!\warx\GRD"Sù\x35 eSrxCxff=f(é)Ú annotationsN)ÚPath)ÚdatetimeÚtimezone)ÚEmptyÚQueue)ÚAnyÚListÚOptional)Úlogger)ÚFXRateProviderÚStrategyEngineÚ StrategySpecÚparse_strategy_specsÚ_coerce_fx_ratesÚ_merge_fx_rates)ÚCSVFeed)ÚDEFAULT_MANIFESTÚcompute_reportÚload_manifest_entryÚdataÚrawÚderivedÚoutputsÚequityÚtradesÚstatsÚ data_reportsÚresultsÚgridÚparamsT©Úexist_okÚcsv_pathcóU(d$[RR[S5n[ U5nUR 5(dg[
X 5nU$![a&n[R"SUSU35 SnAgSnAff=f)Nz_manifest.jsonz"Failed to read manifest entry for z: )
ÚosÚpathÚjoinÚDATA_DIRrÚexistsrÚ Exceptionr Úwarning)r$Ú
manifest_pathÚ
manifest_fileÚentryÚexcs ÚV/Users/chuan/Documents/Projects/FX_Backtest/QuantResearch/scripts/backtest_strategy.pyÚ_load_manifest_entryr22swÞ ÜŸŸ ¤XÐ/?Ó
ܘÓ'€MØ × Ñ × ðÜ# MÓØˆ øÜ óÜŠÐ;¸H¸:ÀRÈÀuÐûðúsÁ AÁ
B Á%BÂB có¬[U5R5R5n[X!5n[ X#SS9nUR S5nUR S5n[
U[[45(aUSOSn[R"SUSUR S 5S
U35 US :Xa [S US
UR S535eU$)Ng@)Ú z_thresholdÚseverityÚ gap_ratioú.4fzn/azData validation severity=z duplicates=Úduplicate_timestampsz gap_ratio=ÚerrorzDataset validation failed for z . Messages: Úmessages) rÚ
expanduserÚresolver2rÚgetÚ
isinstanceÚintÚfloatr ÚinfoÚ RuntimeError)r$r-Ú dataset_pathÚmanifest_entryÚreportr5r6Ú
gap_ratio_strs r1Ú_validate_input_datasetrG@ܘ“>×8€LÜ)¨,ÓF€NÜ
˜LÀcÑ
J€FØz‰z˜*Ó%€HØ
˜'€IÜ*4°YÄÄeÀ ×*MÑ*My oÐSX€MÜ
‡K
# H .Ø—jjÐ!7ÓÀ]ÀOð UôðÜØ,¨\¨N¸,ÀvÇzÁzÐR\ÓG]ÐF^Ð 
ð
ð €Mócó´U(dg[[U5R5R[55$![
a [U5s$f=f©N)Ústrrr<Ú relative_toÚBASE_DIRr+)r's r1Ú_relpath_or_absrNRsIÞ ØðÜ”4˜“:×'×3´>øÜ óÜ4‹yÒðúsŠ4?¿AÁAcó†U(dg[U5R5nUR5(d[SU35eUR SSS9nUR
R
5S;a[R"U5sSSS5 $[R"U5sSSS5 $!,(df  g=f)NzConfig file not found: Úutf-8©Úencoding)z.yamlz.yml) rr;r*ÚFileNotFoundErrorÚopenÚsuffixÚlowerÚyamlÚ safe_loadÚjsonÚload)r'Ú file_pathÚfhs r1Ú_load_structured_datar^[s“Þ ØÜT“
×'€IØ × Ñ × Ñ ÜÐ"9¸)¸Ð EÓ˜ gˆÑ .°"Ø × Ñ × #Ð'8Ó —>> 
/Ñ .ôyŠy˜
/× .× .úsÁ4B2ÂB2Â2
CÚsymbolÚfast_winÚslow_winc
óDU(dg[[5SUSUSUSUS3 - nURSSS9n[R"XS S
S 9 SSS5 [ UR
[55$!,(df  N-=f![a [ U5s$f=f) data_Ú_H1_Ú.jsonÚwrQrRéÚindentÚ ensure_ascii) rÚDATA_REPORT_DIRrUrZÚdumprKrLrMÚ
ValueError)rEr_r`rarVÚ report_pathr]s r1Ú_write_data_reportrqgÞ ØÜÓ'¨E°&°¸¸h¸ZÀqÈÈ
ÐRSÐTZÐS[Ð[`Ð*aÑa€KØ × Ñ ˜Ð Ñ 0°BÜ Š & Q°UÒ
 Ü*¬8Ó
1Õ 0ûô ó ÜÒð ús¸A6ÁBÁ6
BÂBÂBcóÈU(aU(dg[R"[R5R S5n[ U5U- nUR
SSS9 X#4$)N)NNz
%Y%m%d_%H%M%ST)Úparentsr#)rÚnowrÚutcÚstrftimerÚmkdir)ÚenabledÚ results_dirÚrun_idÚrun_paths r1Ú_prepare_run_dirr|ssOÞ ž+ØÜ
\Š\œ(Ÿ,™,Ó
'×
Ó
A€FÜ  )€HØ ‡NN˜4¨$€NÑ Ð ÐrHcóNUS- nURSSS9n[R"XSSS9 SSS5 US- nURSSS9n[R"URS 05USSS9 SSS5 [ U5$!,(df  N^=f!,(df  N*=f)
Nz summary.jsonrhrQrRriFrjz metrics.jsonÚmetrics)rUrZrnr=rK)r{ÚsummaryÚ summary_pathr]Ú metrics_paths r1Ú_write_run_summaryr|s”ؘnÑ,€LØ × Ñ ˜3¨Ð Ñ 1°RÜ Š ' a°eÒ
˜nÑ,€LØ × Ñ ˜3¨Ð Ñ 1°RÜ Š '—++˜Ó,¨b¸ÈÒ
ˆ Ð÷
2Õ 1ú÷
2Õ 1úsBÁ
(BÂ
BÂ
B$ÚEURUSDz
EURUSD_H1.csvçjø@é'ÚUSDéédç@gÐ?g333333Ó?é2çø?çð?gà?ééÈÚ first_hitgÚ initial_cashÚqtyÚ account_ccyÚfx_ratesÚ spread_pipsÚcommission_per_millionÚ
slippage_pipsÚstop_loss_pipsÚtake_profit_pipsÚatr_slÚatr_tpÚ
atr_windowÚ
rsi_periodÚrsi_long_threshÚrsi_short_threshÚenable_trailingÚtrailing_enable_atr_multÚtrailing_atr_multÚ
htf_factorÚhtf_ema_windowÚhtf_rsi_periodÚregime_ema_windowÚregime_slope_minÚregime_atr_minÚregime_atr_percentile_minÚregime_atr_percentile_windowÚregime_trend_min_barsÚlong_only_above_slowÚslope_lookbackÚcooldownÚ allow_shortÚshort_only_below_slowÚ
strategiesÚ
cost_profilesÚslippage_modelÚ
strategy_modeÚstrategy_vote_thresholdÚstress_cost_spread_multÚstress_cost_comm_multÚstress_slippage_multÚstress_price_vol_multÚstress_skip_trade_pctÚrisk_per_trade_pctÚmax_drawdown_pctÚmax_position_unitsÚskip_outlier_entriesc6ó:
^H•[R"[SS9 [R"[SS9 [R"[SS9 [ U5U45un6n7Sn8U2(aU(a
[
UU35n8[So0SU_SU_SU_SU_SU _S U
_S
U _S U _S U
_S
U_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU_SU _S U!_S!U_S"U_S#U_S$U$_S%U%_S&U&_S'U'_S(U(_S)U)_S*U*_S+U+_S,U,_S-U-_S.U1_S/U"_S0U#_S1U._S2U/_S3U0_S4[[[S5._6n:U:RU5 [5n;[U;[U5US69n<[R"S7US8U35 U<R!5 U;R#S9S:9n=U=R#S@5SA:waM(U:R-U=5 M:![a e[an9[SU935U9eSn9A9ff=f![$a8 ['U<S;5(aU<R)S<S=9 [+U<S>S?5(aOf=fU:R/5 U:R15n>U:R3XgU>5n?[5U8XUU>5n@U:R7XgU>5mHTHSBbTHSBO U:R8nAUAU- SC-
SD-nB[R"SEU:R:SFU:R<35 [R"SGUASHSIUBSJSK35 [?UH4SLjSM55(a<[R"SNTHSOSPSQTHSRSS-SHSTTHSUSS-SHSVTHSWSS-SHSK3 5 SnCU8(aU8R#SX5=(d 0nDU8R#SY5U8R#SZ5U8R#S[5UDR#S\5UDR#S]5S^.nC[R"S_UCSYUCS`5 W@(a1W@THSa'WC(aWCSYOSU8(aU8R#Sb5OSSc.THSd'U7(Ga0SU_SU_SU_SU _S U
_S
U _S U _S U
_S
U_SU_SU_SU_SeU1_SfU'_S(U(_S)U)_S*U*_U+U,U-Sg.EnEU6[@RB"[DRF5RI5UU(a$[RJRMU[N5OSWETHWC[QU?R#Sh55[QU?R#Si55[QU?R#Sj55Sk.Sl.nF[SU7UF5nGU6THSm'UGTHSn'TH$)pNTr"zData validation error: r_r`rarr—r˜r™rrr r­r“r”r•Ústrategy_specsr³r´Ústrategy_combine_moder¶r¸Úskip_outlier_barsr°Ú output_dirs)rrr)r'r_z Using CSV: z for gš™™™™™©?)ÚtimeoutÚpumprŠ)ÚfinishedFÚtypeÚbarÚ final_equityrŽgY@zBars processed: z, Trades executed: u策略最终æƒç›Š: z.2fu,累计收益: r7Ú%c3óJ># UHnTRU5SLv M g7frJ)r=)Ú.0Úresults €r1Ú <genexpr>Úrun_once.<locals>.<genexpr>$s øéÐ
bÒ.a¨ˆ6:‰:a= Õ $Ò.aùsƒ #)ÚsharpeÚ
ann_returnÚann_volÚ max_drawdownzSharpe=rÓz.3fz AnnRet=rÔrˆz
% AnnVol=rÕz % MaxDD=rÖÚmanifestr5r6r8Úsha256r')r5r6r8Úhashr'z#Data signature: severity={} hash={}rÙÚ data_reportr:)r5r:Údata_validationr¿)rrÚ trade_stats)rr)rzÚ timestampr_r$Ú
parametersr~Ú artifactsrzr€©)*r&ÚmakedirsÚ
EQUITY_DIRÚ
TRADES_DIRÚ STATS_DIRr|rGrBr+rÚset_initial_cashrrrKr rAÚstartr=rÚhasattrrÆÚgetattrÚ
handle_barÚfinalizeÚcompute_suffixÚexport_outputsrqrÚcashÚ bar_countÚ trade_countÚallrrtrruÚ isoformatr'ÚrelpathrMrNr)Ir_r$rr“r”r•r`rarr—r˜r™rrr r­r¿Ú
validate_datar-ryÚ
write_summaryrzÚrun_dirrÚr0ÚengineÚqrÚevrVÚ output_filesÚdata_report_pathrËÚret_pctÚ data_summaryÚ
manifest_infoÚparam_snapshotrr€sI @r1Úrun_oncerÿsø€ôr‡K‚K”
 ‡KK”
 TÒ‡KK”  & }°kÓBO€Fˆ€KÞžð IÜ1°(¸MÓJˆKô ò6Ùð6áð6ñð6ñ ð 6ñ
6ñ 
6ñ6ñ6ñð6ñð6ñð6ñ6ñ6ñ6ñ#<ð6ñ &Bð!6ñ"4ð#6ñ$ð%6ñ&(ð'6ñ(*ð)6ñ*(ð+6ñ,":ð-6ñ.,ð/6ñ0ð16ñ2&ð36ñ4&ð56ñ62ð76ñ8&ð96ñ:ð;6ñ<
ð=6ñ> ð?6ñ@ðA6ñB"ðC6ñD$ðE6ñF&ðG6ñH,ðI6ñJ!8ðK6ñL!8ðM6ñN4ðO6ñP2ðQ6ñR4ðS6ñT4ðU6ñV/ðW6ñX ðY6ñZ4ð[6ñ\.ð]6ñ^*ð_6ñ`.ða6ôd Üò
ðc6€Fðn ×јLÔ
€AÜ 1œ3˜x›=°Ñ 8€DÜ
‡KK+˜h˜Z u¨V¨HЇJJ„Là
ð Ø˜tÐ$ˆ 6‰6&>˜ Ø×јñ øôGó Ø Üó IÜÐ!8¸¸Ð?ÀSÐ Hûð IûôHó Üt˜V×— ‘ ˜BÜt˜Z¨×Ú ð  úð ‡Oà
×
$€FØ×¸VÓD€LÜ)¨+°vÈÐSYÓØ
^‰^˜Ó
7€Fà-3°NÑ-CÑ-O6˜)ÐU[×U`ÑU`€Lؘ*¨SÑ0°EÑ9€GÜ
‡K" 6×#3Ñ#3Ð"4Ð4GÈ×HZÑHZÐG[Ð
‡K& |°CÐ&8Ð8IÈ'ÐRUÈÐVWÐ
Ô
bÑ.aÓ
 Š Øf˜& +¨9°V¸LÑ5IÈ#Ñ5MÈcÐ4RðSؘÑ+¨CиÑ:PÐQTÑ:TÐUXÐ9YÐYZð
\ô
ð
€LÞØ¨Óˆ
à¨
Ó¨Ó5Ø$/§O¡OÐ4JÓ$KØ!×% !×%  
ˆ ô  Š Ø ˜Ñ ˜Ñ ô
ö Ø 0ˆˆ}Ñæ4@˜  ZÒ0ÀdÞ7B˜ Ÿ¨
Ôñ%
ˆÐ Ñ
ð
Ø ˜ð
à ˜ð
ð
˜
ð
%Ð&<ð 
ð
˜ 
ð
˜

ð
Ð 0ð
ð

ð

ð
˜
ð
˜
ð
Ð!2ð
ð
#Ð$8ð
ð
˜
ð
&Ð'>ð
ð
&Ð'>ð!
ð"
$Ð%:ð#
ð$%9Ø%:Ø%:ò)
ˆð.Üš¤h§l¡lÓÞ?GœŸŸ¨´(Ô;ÈTØØ)¨,×*:Ñ*:¸8Ó*DÓ)¨,×*:Ñ*:¸8Ó*DÓ.¨|×/?Ñ/?À
Ó/NÓñ

ˆô*¨'°7Ó ØˆxÑØ!-ˆˆ~Ñà €Ms*Á- F;ÆG&Æ;G#ÇGÇG#Ç&<H(È'H(c ó[S0UD6$)z€
Backwards-compatible wrapper for legacy callers that imported
scripts.backtest_strategy.main. It simply proxies to run_once().
)rÿ)Úkwargss r1Úmainrlsô
Ñ  ÐrHçš™™™™™É?c"óˆ SSKnSSKnU =(d /SQn U =(d /SQn U
=(d SS/n
U=(d /SQnU=(d SS /nU=(d /S
QnU=(d SS /nU=(d U/nU=(d U/nU=(d U/n/nSnU GnU GnUUaM U
GnUGnUGH¸nUGH­nUGnUGH—n UGn!UGHn"US -
n[R"S
USUSUSUSUcSO
S[ U5-SUSUSUSU SU!SU"35 [ SJ0SU_SU_S[
U5_S[
U5_S[U 5_S[U"5_S [U!5_S!S_S"S_S#Ub [U5OS_S$Ub [U5OS_S%[
U 5_S&[
U5_S'[U5_S([ U5_S)U_S*[U5_S+[
U5_S,[
U5_S-U
_S.S_6n#U#RU[U 5[U!5[U"5[U5[
U5[
U5S/.5 URU#5 GM„ GM G G G G G G G G UR"U5n$[R"[S S09 [R"[S S09 [R R#[S1US235n%U$R%U%SS39 [R"S4US5U%35 U$R&(a[R("S65 gUR*"U$S7S8S99U$S7'U$R-S7SS:S;9n&[R"S<U&R/S=5R1SS39-5 U&R2SR55n'[R R#[S>US?35n([7U(S@SASB9nUR8"U'USSCSD9 SSS5 [R"SEU(35 [R R#[SFUSG35n)U&R/S=5R%U)SS39 [R"SHU)35 g!,(df  Nˆ=f![:a#n*[R("SIU*35 Sn*A*gSn*A*ff=f)Ku

å¤šç»´å‚æ•°ç½‘æ ¼æœç´¢ã€‚
- è‹¥ *_list 为 None,则采用åˆç†çš„默认网格;å¦åˆ™ä½¿ç”¨ä¼ å…¥åˆ—表。
- 结果会输出:
data/grid/grid_{symbol}_H1_ATR.csv
data/grid/grid_top10_by_sharpe_{symbol}.csv
data/params/best_params_grid_{symbol}.json
rN)r‡é)rˆé–rrr‰)Nr‰FT)réé éééz [GRID] sym=z fast=z slow=u SL=ATR×z TP=ÚNoneuATR×z ABOVE=z CD=z SLOPE=z spread=z slip=z comm=r_r$r`rarr—r˜r™rrr“rr”r•r­r¿)r_ÚspreadÚslipÚcommr­r"Úgrid_z _H1_ATR.csv)Úindexu [GRID] 扫æå®Œæˆï¼ˆç»„åˆæ•°=u),已ä¿å­˜: u)[GRID] 无结果,跳过排å/ä¿å­˜ã€‚rÓÚcoerce)ÚerrorsÚlast)Ú ascendingÚ na_positionz
[GRID] Top 10 by Sharpe:
é
Úbest_params_grid_rgrhrQrRri)rlrku[GRID] æœ€ä¼˜å‚æ•°å·²ä¿å­˜: Úgrid_top10_by_sharpe_z.csvu[GRID] Top 10 å·²ä¿å­˜: u[GRID] 排åº/ä¿å­˜å¤±è´¥: rà)ÚpandasrZr rArKrÿr?r@ÚboolÚupdateÚappendÚ DataFramer&ÚGRID_DIRÚ
PARAMS_DIRr'r(Úto_csvÚemptyr,Ú
to_numericÚ sort_valuesÚheadÚ to_stringÚilocÚto_dictrUrnr+)+r_r$r“rr”r•r
rrrr¿Ú fast_listÚ slow_listÚ atr_sl_listÚ atr_tp_listÚlong_only_listÚ
cooldown_listÚ
slope_listÚ spread_listÚ slip_listÚ comm_listÚpdrZÚrowsÚtotalÚsrÏÚloÚcdÚslpÚspÚsp_slipÚcmÚresÚdfÚoutÚ df_sortedÚbestÚ best_pathÚ
top10_pathÚes+ r1Ú grid_searchrGsó>Ûð×)š\€IØ×,š_€IØ×+ # s €KØ×1Ò!1€Kبt }€NØ3¢^€MØ×%  1˜v€JØ×) & €KØ×#˜d˜V€IØ×#˜d˜V€Ià
€DØ
€EÜ
ˆÜˆAØA‹vÙÜ Ü$,˜Ü"/˜BÜ'1 Ü*5 BÜ3<¨Ü2;¨BØ,1°Q©J¨EÜ,2¯KªKØ2=¸f¸XÀVÈAÈ3ÈfÐUVÐTWðX;Ø;<¸#¸TÈAÉIÁ&Ð[bÔcfÐghÓciÑ[iÐAjðk9Ø9;¸¸ÀÀGÈCÈ5ðQ:Ø:<¸¸VÀGÀ9ÈFÐSUÐRVð1Xô-.ô 3;ò3.Ù7=ð3.á9Að3.ô:=¸ð3.ôKNÈaÌ&ð3.ô=BÀ"¼Ið 3.ô
HMÈRÄyð 3.ô ?DÀG¼nð
3.ñ@Dð3.ñBFð3.ðDEÁ=´u¸Q´xÐVZøð3.ðDEÁ=´u¸Q´xÐVZøð3.ô<?¸z¼?ð3.ô58¸´3.ô>CÀ<Ô=Pð3.ô=@À Ô<Lð3.ñ :Bð!3.ô"FJÈ"ÄXð#3.ô$:=¸ð%3.ô&@CÀ3¼xð'3.ñ(FZð)3.ñ*?Dð+3.¨Cð0-0¯J©JØ:@Ü:?À»)Ü8=¸Ü8=¸b» ÜHLÈRËÜ<?À»GÜBEÀcÃ(ñ8.ô-/ð-1¯K©K¸×,<ôS3<ô4=ô+6ô(2ô#0ôñðl
Š€B܇K‚K” 4Ò‡K‚K”
 
'‰',‰,”x ¨° Ð!<Ó
=€C؇IIˆc˜€IÑÜ
‡K2°5°'Ð9JÈ3È%Ð
8 NŠNÐ à—}’} R¨¡\¸(ш8‰ Ø—NN 8°uÈ&Qˆ ä Š Ð2°Y·^±^ÀBÓ5G×5QÑ5QÐX]Ð5QÐ5^Ñ~‰~˜aÑ ×Ü—G‘G—L‘L¤Ð/@ÀÀÈÐ-NÓOˆ Ü
)˜S¨7Ò
3°qØ IŠId˜A¨E¸  Š Ð4°Y°KЗWW—\\¤(Ð.CÀFÀ8È4Ð,PÓQˆ
Ø×! *°EÐ Š Ð