diff --git a/catboost_info/catboost_training.json b/catboost_info/catboost_training.json index 77ce259..dae8ac9 100644 --- a/catboost_info/catboost_training.json +++ b/catboost_info/catboost_training.json @@ -1,832 +1,754 @@ { -"meta":{"test_sets":["test"],"test_metrics":[{"best_value":"Min","name":"Logloss"}],"learn_metrics":[{"best_value":"Min","name":"Logloss"}],"launch_mode":"Train","parameters":"","iteration_count":1500,"learn_sets":["learn"],"name":"experiment"}, +"meta":{"test_sets":["test"],"test_metrics":[{"best_value":"Min","name":"Logloss"}],"learn_metrics":[{"best_value":"Min","name":"Logloss"}],"launch_mode":"Train","parameters":"","iteration_count":750,"learn_sets":["learn"],"name":"experiment"}, "iterations":[ -{"learn":[0.6890148066],"iteration":0,"passed_time":0.1138478885,"remaining_time":170.6579848,"test":[0.6905107621]}, -{"learn":[0.6847203588],"iteration":1,"passed_time":0.2767670619,"remaining_time":207.2985293,"test":[0.6871090123]}, -{"learn":[0.6805131174],"iteration":2,"passed_time":0.4395544996,"remaining_time":219.3376953,"test":[0.6844606439]}, -{"learn":[0.6765803301],"iteration":3,"passed_time":0.561362958,"remaining_time":209.9497463,"test":[0.6809286346]}, -{"learn":[0.672688954],"iteration":4,"passed_time":0.7195976032,"remaining_time":215.1596834,"test":[0.6774402846]}, -{"learn":[0.6687407432],"iteration":5,"passed_time":0.8768425065,"remaining_time":218.3337841,"test":[0.6740356614]}, -{"learn":[0.6648982259],"iteration":6,"passed_time":1.030691616,"remaining_time":219.8317975,"test":[0.670788834]}, -{"learn":[0.6610826468],"iteration":7,"passed_time":1.110033483,"remaining_time":207.0212445,"test":[0.6676456076]}, -{"learn":[0.6574268492],"iteration":8,"passed_time":1.275268565,"remaining_time":211.2694923,"test":[0.6652955508]}, -{"learn":[0.65394726],"iteration":9,"passed_time":1.321769168,"remaining_time":196.943606,"test":[0.6623008216]}, -{"learn":[0.6507643624],"iteration":10,"passed_time":1.35176479,"remaining_time":182.9797975,"test":[0.6593458408]}, -{"learn":[0.6472299985],"iteration":11,"passed_time":1.512444638,"remaining_time":187.5431351,"test":[0.6572208646]}, -{"learn":[0.6437878061],"iteration":12,"passed_time":1.667335265,"remaining_time":190.717503,"test":[0.6543805391]}, -{"learn":[0.640600947],"iteration":13,"passed_time":1.743596306,"remaining_time":185.0702936,"test":[0.6523374539]}, -{"learn":[0.637173016],"iteration":14,"passed_time":1.898478946,"remaining_time":187.9494157,"test":[0.6502893403]}, -{"learn":[0.6339055531],"iteration":15,"passed_time":2.061222954,"remaining_time":191.178429,"test":[0.6482932666]}, -{"learn":[0.6307334308],"iteration":16,"passed_time":2.220020808,"remaining_time":193.6641681,"test":[0.6463517071]}, -{"learn":[0.6279293074],"iteration":17,"passed_time":2.250509618,"remaining_time":185.2919586,"test":[0.6438804101]}, -{"learn":[0.6248787246],"iteration":18,"passed_time":2.375607204,"remaining_time":185.1723299,"test":[0.6413201184]}, -{"learn":[0.6219098548],"iteration":19,"passed_time":2.527273908,"remaining_time":187.0182692,"test":[0.6394763732]}, -{"learn":[0.6189836637],"iteration":20,"passed_time":2.675228462,"remaining_time":188.4125188,"test":[0.6374437837]}, -{"learn":[0.616222272],"iteration":21,"passed_time":2.826878151,"remaining_time":189.914814,"test":[0.6349617515]}, -{"learn":[0.6133246039],"iteration":22,"passed_time":2.98240609,"remaining_time":191.5223389,"test":[0.6331451835]}, -{"learn":[0.6107683661],"iteration":23,"passed_time":3.0276857,"remaining_time":186.2026705,"test":[0.63127905]}, -{"learn":[0.6082103325],"iteration":24,"passed_time":3.179434954,"remaining_time":187.5866623,"test":[0.6299628473]}, -{"learn":[0.6056643419],"iteration":25,"passed_time":3.222660728,"remaining_time":182.7000736,"test":[0.6278537944]}, -{"learn":[0.6030026748],"iteration":26,"passed_time":3.381082221,"remaining_time":184.4568189,"test":[0.6262740798]}, -{"learn":[0.6006296178],"iteration":27,"passed_time":3.540965855,"remaining_time":186.1536335,"test":[0.6239180368]}, -{"learn":[0.5981683509],"iteration":28,"passed_time":3.695909669,"remaining_time":187.4718318,"test":[0.6223892049]}, -{"learn":[0.5957749581],"iteration":29,"passed_time":3.850847722,"remaining_time":188.6915384,"test":[0.6207937267]}, -{"learn":[0.5935372267],"iteration":30,"passed_time":4.010229965,"remaining_time":190.0331555,"test":[0.6186735394]}, -{"learn":[0.5913527909],"iteration":31,"passed_time":4.088116719,"remaining_time":187.5423545,"test":[0.6166546384]}, -{"learn":[0.589131064],"iteration":32,"passed_time":4.156891506,"remaining_time":184.7927224,"test":[0.6144865217]}, -{"learn":[0.5869613123],"iteration":33,"passed_time":4.310560191,"remaining_time":185.8612129,"test":[0.6129900551]}, -{"learn":[0.5849154242],"iteration":34,"passed_time":4.355687168,"remaining_time":182.31662,"test":[0.6113005539]}, -{"learn":[0.5827890907],"iteration":35,"passed_time":4.399760171,"remaining_time":178.9235803,"test":[0.6095609284]}, -{"learn":[0.5805853755],"iteration":36,"passed_time":4.550975907,"remaining_time":179.9480474,"test":[0.6077097603]}, -{"learn":[0.5785595591],"iteration":37,"passed_time":4.703718986,"remaining_time":180.9693989,"test":[0.6066736713]}, -{"learn":[0.5765794322],"iteration":38,"passed_time":4.865720864,"remaining_time":182.2773893,"test":[0.6054699292]}, -{"learn":[0.5745794977],"iteration":39,"passed_time":5.027552141,"remaining_time":183.5056531,"test":[0.6045189637]}, -{"learn":[0.5726601141],"iteration":40,"passed_time":5.187739686,"remaining_time":184.6076147,"test":[0.6028666966]}, -{"learn":[0.5707947657],"iteration":41,"passed_time":5.310405192,"remaining_time":184.3469231,"test":[0.6014614195]}, -{"learn":[0.5690099154],"iteration":42,"passed_time":5.456808459,"remaining_time":184.896975,"test":[0.5996695546]}, -{"learn":[0.5671066949],"iteration":43,"passed_time":5.608493212,"remaining_time":185.590139,"test":[0.5983460089]}, -{"learn":[0.5655948198],"iteration":44,"passed_time":5.630353889,"remaining_time":182.0481091,"test":[0.5966810112]}, -{"learn":[0.5637785414],"iteration":45,"passed_time":5.697887507,"remaining_time":180.1027921,"test":[0.5956450418]}, -{"learn":[0.5620515294],"iteration":46,"passed_time":5.850413598,"remaining_time":180.864914,"test":[0.5945786627]}, -{"learn":[0.5604507578],"iteration":47,"passed_time":6.007150579,"remaining_time":181.716305,"test":[0.5931140825]}, -{"learn":[0.5588915557],"iteration":48,"passed_time":6.161082921,"remaining_time":182.4434963,"test":[0.5916339781]}, -{"learn":[0.5573862832],"iteration":49,"passed_time":6.204280658,"remaining_time":179.9241391,"test":[0.5901821684]}, -{"learn":[0.5557730988],"iteration":50,"passed_time":6.366421292,"remaining_time":180.8812638,"test":[0.5886845045]}, -{"learn":[0.5542890073],"iteration":51,"passed_time":6.493389385,"remaining_time":180.8159198,"test":[0.5873437186]}, -{"learn":[0.5528272586],"iteration":52,"passed_time":6.568065505,"remaining_time":179.3205809,"test":[0.5858138491]}, -{"learn":[0.5513183415],"iteration":53,"passed_time":6.721499749,"remaining_time":179.9868266,"test":[0.584880044]}, -{"learn":[0.5497871871],"iteration":54,"passed_time":6.845617938,"remaining_time":179.8530531,"test":[0.5836002773]}, -{"learn":[0.5484578589],"iteration":55,"passed_time":6.922503146,"remaining_time":178.5016883,"test":[0.5822230555]}, -{"learn":[0.5470301794],"iteration":56,"passed_time":7.082629537,"remaining_time":179.3023583,"test":[0.5812704937]}, -{"learn":[0.5456861672],"iteration":57,"passed_time":7.233836273,"remaining_time":179.8481363,"test":[0.5802902358]}, -{"learn":[0.5441976387],"iteration":58,"passed_time":7.389141192,"remaining_time":180.4703806,"test":[0.5795422819]}, -{"learn":[0.5428836813],"iteration":59,"passed_time":7.514997725,"remaining_time":180.3599454,"test":[0.5781728022]}, -{"learn":[0.5415324327],"iteration":60,"passed_time":7.6731594,"remaining_time":181.0110881,"test":[0.5770815604]}, -{"learn":[0.5401875226],"iteration":61,"passed_time":7.832404103,"remaining_time":181.6612435,"test":[0.5761339871]}, -{"learn":[0.539078455],"iteration":62,"passed_time":7.866617942,"remaining_time":179.4338093,"test":[0.5754830094]}, -{"learn":[0.5379310928],"iteration":63,"passed_time":7.905017945,"remaining_time":177.3688401,"test":[0.5744535051]}, -{"learn":[0.5367787126],"iteration":64,"passed_time":8.025001801,"remaining_time":177.1673475,"test":[0.5735182634]}, -{"learn":[0.5356254873],"iteration":65,"passed_time":8.181012269,"remaining_time":177.7510848,"test":[0.5725989848]}, -{"learn":[0.5344064479],"iteration":66,"passed_time":8.343370838,"remaining_time":178.4485136,"test":[0.5722099226]}, -{"learn":[0.5334278464],"iteration":67,"passed_time":8.37640452,"remaining_time":176.3972246,"test":[0.5710864752]}, -{"learn":[0.5322656417],"iteration":68,"passed_time":8.528695174,"remaining_time":176.8777217,"test":[0.5703172104]}, -{"learn":[0.5311180153],"iteration":69,"passed_time":8.681536543,"remaining_time":177.3513894,"test":[0.5693944997]}, -{"learn":[0.530093513],"iteration":70,"passed_time":8.844956425,"remaining_time":178.0203202,"test":[0.5683641574]}, -{"learn":[0.5290449247],"iteration":71,"passed_time":8.995392082,"remaining_time":178.4086096,"test":[0.5672884797]}, -{"learn":[0.5279487981],"iteration":72,"passed_time":9.153540827,"remaining_time":178.9329145,"test":[0.5666464014]}, -{"learn":[0.5270186329],"iteration":73,"passed_time":9.20995653,"remaining_time":177.4783515,"test":[0.5655809402]}, -{"learn":[0.5260421971],"iteration":74,"passed_time":9.366497211,"remaining_time":177.963447,"test":[0.5646614221]}, -{"learn":[0.5250840899],"iteration":75,"passed_time":9.525457382,"remaining_time":178.4769909,"test":[0.5640993193]}, -{"learn":[0.5241200668],"iteration":76,"passed_time":9.599963928,"remaining_time":177.4123204,"test":[0.5637132103]}, -{"learn":[0.5232151497],"iteration":77,"passed_time":9.752244272,"remaining_time":177.7909148,"test":[0.5630272732]}, -{"learn":[0.5223893573],"iteration":78,"passed_time":9.779543852,"remaining_time":175.9079976,"test":[0.5621769954]}, -{"learn":[0.5217720995],"iteration":79,"passed_time":9.80248681,"remaining_time":173.9941409,"test":[0.5613964367]}, -{"learn":[0.5210962111],"iteration":80,"passed_time":9.824029174,"remaining_time":172.102437,"test":[0.5605600867]}, -{"learn":[0.5201933011],"iteration":81,"passed_time":9.977345244,"remaining_time":172.5350678,"test":[0.5602561082]}, -{"learn":[0.5194253998],"iteration":82,"passed_time":10.09210548,"remaining_time":172.2953429,"test":[0.5594923108]}, -{"learn":[0.5185833388],"iteration":83,"passed_time":10.24865345,"remaining_time":172.7630153,"test":[0.5590696861]}, -{"learn":[0.5179518723],"iteration":84,"passed_time":10.275034,"remaining_time":171.0490955,"test":[0.5583184996]}, -{"learn":[0.5171273476],"iteration":85,"passed_time":10.42595546,"remaining_time":171.4221049,"test":[0.5575170291]}, -{"learn":[0.5163828985],"iteration":86,"passed_time":10.54618354,"remaining_time":171.2845671,"test":[0.5569801481]}, -{"learn":[0.515581826],"iteration":87,"passed_time":10.69837335,"remaining_time":171.6602632,"test":[0.556224013]}, -{"learn":[0.5148885069],"iteration":88,"passed_time":10.85726016,"remaining_time":172.1302706,"test":[0.5554498395]}, -{"learn":[0.5141455896],"iteration":89,"passed_time":11.01250207,"remaining_time":172.5291991,"test":[0.555041422]}, -{"learn":[0.5133925308],"iteration":90,"passed_time":11.16200032,"remaining_time":172.8270159,"test":[0.5546903123]}, -{"learn":[0.5126036598],"iteration":91,"passed_time":11.32337796,"remaining_time":173.2969149,"test":[0.5543524519]}, -{"learn":[0.5119108689],"iteration":92,"passed_time":11.4751288,"remaining_time":173.6075938,"test":[0.5539176154]}, -{"learn":[0.511192513],"iteration":93,"passed_time":11.62506645,"remaining_time":173.8813131,"test":[0.5533663276]}, -{"learn":[0.5104440496],"iteration":94,"passed_time":11.78492859,"remaining_time":174.2928913,"test":[0.5532664381]}, -{"learn":[0.5096263916],"iteration":95,"passed_time":11.93868302,"remaining_time":174.6032392,"test":[0.5530306622]}, -{"learn":[0.5089504503],"iteration":96,"passed_time":12.06885013,"remaining_time":174.5628528,"test":[0.552612587]}, -{"learn":[0.508298067],"iteration":97,"passed_time":12.22678559,"remaining_time":174.9178919,"test":[0.5520417044]}, -{"learn":[0.5076842424],"iteration":98,"passed_time":12.35856041,"remaining_time":174.8923548,"test":[0.5516118164]}, -{"learn":[0.5070971978],"iteration":99,"passed_time":12.38788048,"remaining_time":173.4303267,"test":[0.5513018517]}, -{"learn":[0.5064180874],"iteration":100,"passed_time":12.54569873,"remaining_time":173.7765596,"test":[0.5509188955]}, -{"learn":[0.5058459908],"iteration":101,"passed_time":12.59603137,"remaining_time":172.6397241,"test":[0.5506174312]}, -{"learn":[0.50521463],"iteration":102,"passed_time":12.74966595,"remaining_time":172.925081,"test":[0.5500083168]}, -{"learn":[0.5046090454],"iteration":103,"passed_time":12.80499913,"remaining_time":171.8824883,"test":[0.5498264565]}, -{"learn":[0.5039198463],"iteration":104,"passed_time":12.96538874,"remaining_time":172.2544505,"test":[0.5493285255]}, -{"learn":[0.5032194493],"iteration":105,"passed_time":13.12918941,"remaining_time":172.6612268,"test":[0.5490933483]}, -{"learn":[0.5025859228],"iteration":106,"passed_time":13.2925502,"remaining_time":173.0516114,"test":[0.5489701925]}, -{"learn":[0.5019990366],"iteration":107,"passed_time":13.44909509,"remaining_time":173.3438923,"test":[0.5489353529]}, -{"learn":[0.5015241822],"iteration":108,"passed_time":13.48528789,"remaining_time":172.0920683,"test":[0.5486229538]}, -{"learn":[0.5009603784],"iteration":109,"passed_time":13.63371113,"remaining_time":172.2805316,"test":[0.5482983828]}, -{"learn":[0.5004143223],"iteration":110,"passed_time":13.75682516,"remaining_time":172.1462175,"test":[0.5480394603]}, -{"learn":[0.4998890246],"iteration":111,"passed_time":13.90628126,"remaining_time":172.338557,"test":[0.5476499591]}, -{"learn":[0.4994227799],"iteration":112,"passed_time":14.05912313,"remaining_time":172.5664051,"test":[0.5475116383]}, -{"learn":[0.4989407948],"iteration":113,"passed_time":14.10521319,"remaining_time":171.4896972,"test":[0.5473223951]}, -{"learn":[0.498384069],"iteration":114,"passed_time":14.26402653,"remaining_time":171.7884934,"test":[0.5470852623]}, -{"learn":[0.4979274376],"iteration":115,"passed_time":14.41527952,"remaining_time":171.9891971,"test":[0.5466578885]}, -{"learn":[0.4974348356],"iteration":116,"passed_time":14.5676042,"remaining_time":172.1965522,"test":[0.5462014618]}, -{"learn":[0.4968953292],"iteration":117,"passed_time":14.73179893,"remaining_time":172.5368315,"test":[0.5458354664]}, -{"learn":[0.4963974452],"iteration":118,"passed_time":14.89296206,"remaining_time":172.8334505,"test":[0.5455954204]}, -{"learn":[0.4959457261],"iteration":119,"passed_time":15.05701278,"remaining_time":173.155647,"test":[0.5454222999]}, -{"learn":[0.495519572],"iteration":120,"passed_time":15.10807594,"remaining_time":172.1821216,"test":[0.5450386253]}, -{"learn":[0.4950652647],"iteration":121,"passed_time":15.27124614,"remaining_time":172.4899769,"test":[0.5448259161]}, -{"learn":[0.4946823177],"iteration":122,"passed_time":15.43107919,"remaining_time":172.7528134,"test":[0.5443499745]}, -{"learn":[0.4942624492],"iteration":123,"passed_time":15.55600711,"remaining_time":172.6214982,"test":[0.5441528294]}, -{"learn":[0.4938697304],"iteration":124,"passed_time":15.62676394,"remaining_time":171.8944034,"test":[0.5437510366]}, -{"learn":[0.4934123595],"iteration":125,"passed_time":15.78180804,"remaining_time":172.0968591,"test":[0.5433484058]}, -{"learn":[0.4929984069],"iteration":126,"passed_time":15.94232122,"remaining_time":172.3528113,"test":[0.542928415]}, -{"learn":[0.4925803872],"iteration":127,"passed_time":16.10447718,"remaining_time":172.6198648,"test":[0.5425288969]}, -{"learn":[0.4921483701],"iteration":128,"passed_time":16.26503337,"remaining_time":172.8632616,"test":[0.5422919637]}, -{"learn":[0.4916839213],"iteration":129,"passed_time":16.41918544,"remaining_time":173.0329542,"test":[0.5420541924]}, -{"learn":[0.4913673693],"iteration":130,"passed_time":16.57755815,"remaining_time":173.2418099,"test":[0.5417351686]}, -{"learn":[0.4908799965],"iteration":131,"passed_time":16.73531081,"remaining_time":173.4386757,"test":[0.5413339345]}, -{"learn":[0.4904615014],"iteration":132,"passed_time":16.85838532,"remaining_time":173.27378,"test":[0.5411060205]}, -{"learn":[0.4900727969],"iteration":133,"passed_time":17.01360049,"remaining_time":173.4371513,"test":[0.5406589721]}, -{"learn":[0.4896833529],"iteration":134,"passed_time":17.14251665,"remaining_time":173.3298906,"test":[0.5402045009]}, -{"learn":[0.4893555503],"iteration":135,"passed_time":17.21812494,"remaining_time":172.6876649,"test":[0.5401062476]}, -{"learn":[0.488954433],"iteration":136,"passed_time":17.3743198,"remaining_time":172.855459,"test":[0.5396592791]}, -{"learn":[0.4887286263],"iteration":137,"passed_time":17.39752889,"remaining_time":171.706046,"test":[0.5392798347]}, -{"learn":[0.488321329],"iteration":138,"passed_time":17.54996058,"remaining_time":171.8381032,"test":[0.5389907818]}, -{"learn":[0.4879829095],"iteration":139,"passed_time":17.71272949,"remaining_time":172.0665151,"test":[0.5389436904]}, -{"learn":[0.4875670025],"iteration":140,"passed_time":17.87001358,"remaining_time":172.2365139,"test":[0.5386680465]}, -{"learn":[0.4873085001],"iteration":141,"passed_time":17.90243243,"remaining_time":171.2077693,"test":[0.5383553282]}, -{"learn":[0.4869168904],"iteration":142,"passed_time":18.06220245,"remaining_time":171.4014596,"test":[0.5380886636]}, -{"learn":[0.486518467],"iteration":143,"passed_time":18.22356027,"remaining_time":171.6051925,"test":[0.5380264471]}, -{"learn":[0.4861425979],"iteration":144,"passed_time":18.38104346,"remaining_time":171.767682,"test":[0.5378110243]}, -{"learn":[0.4858837256],"iteration":145,"passed_time":18.54322547,"remaining_time":171.9693649,"test":[0.5377516413]}, -{"learn":[0.4855419256],"iteration":146,"passed_time":18.71177301,"remaining_time":172.2246863,"test":[0.537631319]}, -{"learn":[0.4852116931],"iteration":147,"passed_time":18.87448651,"remaining_time":172.4209849,"test":[0.5375976367]}, -{"learn":[0.484938401],"iteration":148,"passed_time":19.0257804,"remaining_time":172.5089216,"test":[0.5372723074]}, -{"learn":[0.4845426186],"iteration":149,"passed_time":19.182238,"remaining_time":172.640142,"test":[0.5370383673]}, -{"learn":[0.4842311373],"iteration":150,"passed_time":19.34420426,"remaining_time":172.8167652,"test":[0.5368126083]}, -{"learn":[0.4839309068],"iteration":151,"passed_time":19.5021857,"remaining_time":172.9535942,"test":[0.5364298117]}, -{"learn":[0.4836141436],"iteration":152,"passed_time":19.6590448,"remaining_time":173.0766885,"test":[0.5363292038]}, -{"learn":[0.4832906721],"iteration":153,"passed_time":19.8136852,"remaining_time":173.176755,"test":[0.5362669076]}, -{"learn":[0.4830399871],"iteration":154,"passed_time":19.97556041,"remaining_time":173.3363145,"test":[0.5361287065]}, -{"learn":[0.482840432],"iteration":155,"passed_time":20.01088012,"remaining_time":172.4014287,"test":[0.5359287679]}, -{"learn":[0.4825772285],"iteration":156,"passed_time":20.12774505,"remaining_time":172.1755516,"test":[0.5357148216]}, -{"learn":[0.4822856077],"iteration":157,"passed_time":20.27977464,"remaining_time":172.2497314,"test":[0.5355527157]}, -{"learn":[0.4820066638],"iteration":158,"passed_time":20.43587103,"remaining_time":172.3553651,"test":[0.5354150334]}, -{"learn":[0.481777952],"iteration":159,"passed_time":20.5172772,"remaining_time":171.8321966,"test":[0.5351407863]}, -{"learn":[0.4815088326],"iteration":160,"passed_time":20.67229614,"remaining_time":171.9267362,"test":[0.5348638654]}, -{"learn":[0.4811545141],"iteration":161,"passed_time":20.82941068,"remaining_time":172.035503,"test":[0.5347473742]}, -{"learn":[0.4808466247],"iteration":162,"passed_time":20.98547963,"remaining_time":172.132431,"test":[0.5346073772]}, -{"learn":[0.480584953],"iteration":163,"passed_time":21.14887984,"remaining_time":172.2859967,"test":[0.5345715399]}, -{"learn":[0.4802866768],"iteration":164,"passed_time":21.30580932,"remaining_time":172.3833663,"test":[0.5344203289]}, -{"learn":[0.4800326112],"iteration":165,"passed_time":21.45786409,"remaining_time":172.4384981,"test":[0.5341423703]}, -{"learn":[0.4797512376],"iteration":166,"passed_time":21.61849177,"remaining_time":172.559578,"test":[0.5341244916]}, -{"learn":[0.4794567117],"iteration":167,"passed_time":21.7840448,"remaining_time":172.7163552,"test":[0.5340588431]}, -{"learn":[0.4791987374],"iteration":168,"passed_time":21.91503468,"remaining_time":172.5971075,"test":[0.5339983028]}, -{"learn":[0.4789246529],"iteration":169,"passed_time":22.07618579,"remaining_time":172.7136888,"test":[0.5338498454]}, -{"learn":[0.4787111533],"iteration":170,"passed_time":22.14426062,"remaining_time":172.1036395,"test":[0.5338024747]}, -{"learn":[0.4784767897],"iteration":171,"passed_time":22.29400944,"remaining_time":172.1304915,"test":[0.5335969091]}, -{"learn":[0.4782688891],"iteration":172,"passed_time":22.44483919,"remaining_time":172.1635931,"test":[0.533564464]}, -{"learn":[0.4780129748],"iteration":173,"passed_time":22.4802556,"remaining_time":171.3150513,"test":[0.5333060603]}, -{"learn":[0.4777808824],"iteration":174,"passed_time":22.63188353,"remaining_time":171.3556896,"test":[0.5330650165]}, -{"learn":[0.4775515896],"iteration":175,"passed_time":22.79554402,"remaining_time":171.4846607,"test":[0.533035764]}, -{"learn":[0.4772707969],"iteration":176,"passed_time":22.95870845,"remaining_time":171.6066174,"test":[0.532890619]}, -{"learn":[0.4770373313],"iteration":177,"passed_time":23.10763628,"remaining_time":171.6196357,"test":[0.5327280741]}, -{"learn":[0.4767772442],"iteration":178,"passed_time":23.26576949,"remaining_time":171.6987793,"test":[0.532661787]}, -{"learn":[0.476497772],"iteration":179,"passed_time":23.43366368,"remaining_time":171.846867,"test":[0.5323550948]}, -{"learn":[0.4762753986],"iteration":180,"passed_time":23.59527661,"remaining_time":171.9456898,"test":[0.5320937379]}, -{"learn":[0.4760106634],"iteration":181,"passed_time":23.75897893,"remaining_time":172.0567815,"test":[0.5319976397]}, -{"learn":[0.4757992238],"iteration":182,"passed_time":23.91001288,"remaining_time":172.0736992,"test":[0.5319445622]}, -{"learn":[0.4755742622],"iteration":183,"passed_time":24.0748372,"remaining_time":172.1874226,"test":[0.5317927924]}, -{"learn":[0.4753871199],"iteration":184,"passed_time":24.22761106,"remaining_time":172.2124786,"test":[0.5315881447]}, -{"learn":[0.4752141334],"iteration":185,"passed_time":24.28366364,"remaining_time":171.5523334,"test":[0.5313290226]}, -{"learn":[0.4748972117],"iteration":186,"passed_time":24.44082179,"remaining_time":171.6085508,"test":[0.5313750365]}, -{"learn":[0.4746180037],"iteration":187,"passed_time":24.60655271,"remaining_time":171.7223253,"test":[0.5311831592]}, -{"learn":[0.4744396824],"iteration":188,"passed_time":24.72838362,"remaining_time":171.5286292,"test":[0.5311377041]}, -{"learn":[0.4742329438],"iteration":189,"passed_time":24.88472488,"remaining_time":171.5736294,"test":[0.5309481017]}, -{"learn":[0.474052721],"iteration":190,"passed_time":25.03686574,"remaining_time":171.5877343,"test":[0.5308184409]}, -{"learn":[0.4738736602],"iteration":191,"passed_time":25.09416241,"remaining_time":170.9539814,"test":[0.5306155092]}, -{"learn":[0.4735943465],"iteration":192,"passed_time":25.25208222,"remaining_time":171.0076241,"test":[0.5304099835]}, -{"learn":[0.4733345764],"iteration":193,"passed_time":25.40594188,"remaining_time":171.0317531,"test":[0.5302349873]}, -{"learn":[0.4731217634],"iteration":194,"passed_time":25.53327257,"remaining_time":170.8765164,"test":[0.5301382506]}, -{"learn":[0.4729052003],"iteration":195,"passed_time":25.69135542,"remaining_time":170.9261605,"test":[0.5299927064]}, -{"learn":[0.4726750095],"iteration":196,"passed_time":25.84986562,"remaining_time":170.9765224,"test":[0.5299585852]}, -{"learn":[0.4724771447],"iteration":197,"passed_time":26.00037911,"remaining_time":170.9721899,"test":[0.52993484]}, -{"learn":[0.472306588],"iteration":198,"passed_time":26.14753661,"remaining_time":170.9444479,"test":[0.529872863]}, -{"learn":[0.4721346051],"iteration":199,"passed_time":26.30955045,"remaining_time":171.0120779,"test":[0.5297793588]}, -{"learn":[0.4718955933],"iteration":200,"passed_time":26.46435129,"remaining_time":171.0308076,"test":[0.5298054585]}, -{"learn":[0.4716859496],"iteration":201,"passed_time":26.58396383,"remaining_time":170.8217082,"test":[0.5298823212]}, -{"learn":[0.4714805843],"iteration":202,"passed_time":26.73668926,"remaining_time":170.825054,"test":[0.5297468737]}, -{"learn":[0.471280818],"iteration":203,"passed_time":26.88959935,"remaining_time":170.8280429,"test":[0.5297105575]}, -{"learn":[0.4711345586],"iteration":204,"passed_time":27.04594512,"remaining_time":170.8512143,"test":[0.5297793588]}, -{"learn":[0.4709766788],"iteration":205,"passed_time":27.20158152,"remaining_time":170.8681868,"test":[0.5297511838]}, -{"learn":[0.4708556675],"iteration":206,"passed_time":27.35746546,"remaining_time":170.8850379,"test":[0.5296674171]}, -{"learn":[0.4706085214],"iteration":207,"passed_time":27.51854656,"remaining_time":170.9325104,"test":[0.5295779436]}, -{"learn":[0.4704746748],"iteration":208,"passed_time":27.57112218,"remaining_time":170.3077452,"test":[0.5294034263]}, -{"learn":[0.4703067063],"iteration":209,"passed_time":27.72732939,"remaining_time":170.3250234,"test":[0.529342447]}, -{"learn":[0.4701873852],"iteration":210,"passed_time":27.80493634,"remaining_time":169.8604879,"test":[0.5292063611]}, -{"learn":[0.4699815974],"iteration":211,"passed_time":27.96705152,"remaining_time":169.91303,"test":[0.529140952]}, -{"learn":[0.4697822537],"iteration":212,"passed_time":28.13325516,"remaining_time":169.9882601,"test":[0.5288928446]}, -{"learn":[0.4696142323],"iteration":213,"passed_time":28.29280533,"remaining_time":170.0212507,"test":[0.5288243227]}, -{"learn":[0.4693953451],"iteration":214,"passed_time":28.45513825,"remaining_time":170.0690821,"test":[0.5287417133]}, -{"learn":[0.4692302288],"iteration":215,"passed_time":28.60674574,"remaining_time":170.0512108,"test":[0.528545566]}, -{"learn":[0.4690629998],"iteration":216,"passed_time":28.75973949,"remaining_time":170.0403031,"test":[0.5284297532]}, -{"learn":[0.468853673],"iteration":217,"passed_time":28.91989423,"remaining_time":170.0702037,"test":[0.5284121139]}, -{"learn":[0.4686768307],"iteration":218,"passed_time":29.07190134,"remaining_time":170.0507106,"test":[0.5285319973]}, -{"learn":[0.468512454],"iteration":219,"passed_time":29.23264497,"remaining_time":170.0808435,"test":[0.5284131515]}, -{"learn":[0.4682854852],"iteration":220,"passed_time":29.40238524,"remaining_time":170.1613155,"test":[0.5283043227]}, -{"learn":[0.4680980788],"iteration":221,"passed_time":29.55746679,"remaining_time":170.1551467,"test":[0.528141259]}, -{"learn":[0.4679088237],"iteration":222,"passed_time":29.68133283,"remaining_time":169.968888,"test":[0.5280515859]}, -{"learn":[0.4677077369],"iteration":223,"passed_time":29.83990174,"remaining_time":169.9808689,"test":[0.5280135936]}, -{"learn":[0.4675551919],"iteration":224,"passed_time":30.00190251,"remaining_time":170.0107809,"test":[0.5280392544]}, -{"learn":[0.4673934034],"iteration":225,"passed_time":30.15882227,"remaining_time":170.0103521,"test":[0.5280392145]}, -{"learn":[0.4673336108],"iteration":226,"passed_time":30.18497061,"remaining_time":169.2751876,"test":[0.5279079973]}, -{"learn":[0.4671836012],"iteration":227,"passed_time":30.33856754,"remaining_time":169.2572715,"test":[0.527942358]}, -{"learn":[0.4670666043],"iteration":228,"passed_time":30.37160705,"remaining_time":168.5690505,"test":[0.5279882521]}, -{"learn":[0.4669395187],"iteration":229,"passed_time":30.41707707,"remaining_time":167.9551647,"test":[0.5278810594]}, -{"learn":[0.4667662153],"iteration":230,"passed_time":30.53851059,"remaining_time":167.7635062,"test":[0.5277614155]}, -{"learn":[0.4666467358],"iteration":231,"passed_time":30.69721843,"remaining_time":167.7761766,"test":[0.5277468092]}, -{"learn":[0.466536183],"iteration":232,"passed_time":30.86072593,"remaining_time":167.8134753,"test":[0.5276640802]}, -{"learn":[0.4663676334],"iteration":233,"passed_time":31.02554445,"remaining_time":167.8561507,"test":[0.5277021922]}, -{"learn":[0.4661768994],"iteration":234,"passed_time":31.18964249,"remaining_time":167.8931819,"test":[0.5277501216]}, -{"learn":[0.4660384046],"iteration":235,"passed_time":31.31768057,"remaining_time":167.7353739,"test":[0.5276416918]}, -{"learn":[0.4658624074],"iteration":236,"passed_time":31.4847515,"remaining_time":167.7858276,"test":[0.5275160218]}, -{"learn":[0.4657251803],"iteration":237,"passed_time":31.64621862,"remaining_time":167.8047391,"test":[0.5274325345]}, -{"learn":[0.4655313826],"iteration":238,"passed_time":31.79609372,"remaining_time":167.7609798,"test":[0.5274650993]}, -{"learn":[0.465325542],"iteration":239,"passed_time":31.95110683,"remaining_time":167.7433109,"test":[0.5273778607]}, -{"learn":[0.4651989846],"iteration":240,"passed_time":32.10779765,"remaining_time":167.7332666,"test":[0.5272706281]}, -{"learn":[0.4650546267],"iteration":241,"passed_time":32.26293505,"remaining_time":167.7139351,"test":[0.5271754478]}, -{"learn":[0.4648722911],"iteration":242,"passed_time":32.41443981,"remaining_time":167.6746948,"test":[0.5271913311]}, -{"learn":[0.4647227041],"iteration":243,"passed_time":32.57242304,"remaining_time":167.6678825,"test":[0.5270974278]}, -{"learn":[0.4645644545],"iteration":244,"passed_time":32.73760084,"remaining_time":167.69669,"test":[0.5270226803]}, -{"learn":[0.464447035],"iteration":245,"passed_time":32.77494931,"remaining_time":167.0723026,"test":[0.5269694432]}, -{"learn":[0.464317995],"iteration":246,"passed_time":32.92819363,"remaining_time":167.0405936,"test":[0.5269732743]}, -{"learn":[0.4641463291],"iteration":247,"passed_time":33.08856314,"remaining_time":167.0438752,"test":[0.5269544777]}, -{"learn":[0.4639036727],"iteration":248,"passed_time":33.25750829,"remaining_time":167.0889272,"test":[0.5267942075]}, -{"learn":[0.4637813937],"iteration":249,"passed_time":33.42341649,"remaining_time":167.1170824,"test":[0.5267131945]}, -{"learn":[0.4636937121],"iteration":250,"passed_time":33.58001307,"remaining_time":167.0973559,"test":[0.526730754]}, -{"learn":[0.463614957],"iteration":251,"passed_time":33.62073242,"remaining_time":166.5026748,"test":[0.5266016519]}, -{"learn":[0.4635092636],"iteration":252,"passed_time":33.65561412,"remaining_time":165.8836,"test":[0.5266562459]}, -{"learn":[0.4633952246],"iteration":253,"passed_time":33.81379257,"remaining_time":165.8739588,"test":[0.5265934309]}, -{"learn":[0.4632521345],"iteration":254,"passed_time":33.97013232,"remaining_time":165.8541755,"test":[0.5265000464]}, -{"learn":[0.4631547867],"iteration":255,"passed_time":34.1304955,"remaining_time":165.8528766,"test":[0.52657647]}, -{"learn":[0.4630138093],"iteration":256,"passed_time":34.28500724,"remaining_time":165.8220389,"test":[0.5265735966]}, -{"learn":[0.4628916888],"iteration":257,"passed_time":34.44853489,"remaining_time":165.8336447,"test":[0.5264673219]}, -{"learn":[0.4627510812],"iteration":258,"passed_time":34.57385568,"remaining_time":165.6608297,"test":[0.5265288599]}, -{"learn":[0.4626029731],"iteration":259,"passed_time":34.72268664,"remaining_time":165.6005055,"test":[0.5264186342]}, -{"learn":[0.4625061007],"iteration":260,"passed_time":34.87884025,"remaining_time":165.5742646,"test":[0.5263493142]}, -{"learn":[0.4623717259],"iteration":261,"passed_time":35.04004141,"remaining_time":165.5708827,"test":[0.5263282827]}, -{"learn":[0.4622839914],"iteration":262,"passed_time":35.20003362,"remaining_time":165.5606144,"test":[0.5262348583]}, -{"learn":[0.4622010108],"iteration":263,"passed_time":35.35611219,"remaining_time":165.5308889,"test":[0.5261702874]}, -{"learn":[0.4621094732],"iteration":264,"passed_time":35.42542248,"remaining_time":165.0958368,"test":[0.5261617471]}, -{"learn":[0.4619561359],"iteration":265,"passed_time":35.58231398,"remaining_time":165.0698325,"test":[0.5260771423]}, -{"learn":[0.461855883],"iteration":266,"passed_time":35.74001939,"remaining_time":165.0466064,"test":[0.5261783088]}, -{"learn":[0.4617580598],"iteration":267,"passed_time":35.89754242,"remaining_time":165.0215383,"test":[0.5261205621]}, -{"learn":[0.4616690048],"iteration":268,"passed_time":36.05044817,"remaining_time":164.9743557,"test":[0.5262331423]}, -{"learn":[0.4615131322],"iteration":269,"passed_time":36.2082101,"remaining_time":164.9485127,"test":[0.5261472605]}, -{"learn":[0.4613585272],"iteration":270,"passed_time":36.36647079,"remaining_time":164.923958,"test":[0.5261270671]}, -{"learn":[0.4612326036],"iteration":271,"passed_time":36.52514843,"remaining_time":164.9003025,"test":[0.5260799359]}, -{"learn":[0.4610718187],"iteration":272,"passed_time":36.68984635,"remaining_time":164.902716,"test":[0.5260288138]}, -{"learn":[0.4609134635],"iteration":273,"passed_time":36.85024293,"remaining_time":164.8846636,"test":[0.5260414247]}, -{"learn":[0.4607590698],"iteration":274,"passed_time":37.01143924,"remaining_time":164.8691385,"test":[0.5260683227]}, -{"learn":[0.4606531651],"iteration":275,"passed_time":37.08681647,"remaining_time":164.4719687,"test":[0.525982361]}, -{"learn":[0.4605304636],"iteration":276,"passed_time":37.24714668,"remaining_time":164.4522036,"test":[0.5259617286]}, -{"learn":[0.4604467434],"iteration":277,"passed_time":37.40772547,"remaining_time":164.4325199,"test":[0.5259804055]}, -{"learn":[0.4603158019],"iteration":278,"passed_time":37.55823928,"remaining_time":164.3677784,"test":[0.5259454063]}, -{"learn":[0.4601732928],"iteration":279,"passed_time":37.71444901,"remaining_time":164.3272421,"test":[0.525910008]}, -{"learn":[0.4599872597],"iteration":280,"passed_time":37.87114097,"remaining_time":164.2879745,"test":[0.5257917609]}, -{"learn":[0.459809361],"iteration":281,"passed_time":38.02875387,"remaining_time":164.2518518,"test":[0.5258267202]}, -{"learn":[0.4595980271],"iteration":282,"passed_time":38.1833214,"remaining_time":164.2017744,"test":[0.5257332958]}, -{"learn":[0.4594952916],"iteration":283,"passed_time":38.34264114,"remaining_time":164.1713085,"test":[0.5257140602]}, -{"learn":[0.4593488209],"iteration":284,"passed_time":38.50737761,"remaining_time":164.1630309,"test":[0.5256252252]}, -{"learn":[0.4591309373],"iteration":285,"passed_time":38.67342803,"remaining_time":164.1592365,"test":[0.5255676381]}, -{"learn":[0.4589785507],"iteration":286,"passed_time":38.83052659,"remaining_time":164.1164765,"test":[0.5255896273]}, -{"learn":[0.4588693712],"iteration":287,"passed_time":38.8880447,"remaining_time":163.6538548,"test":[0.5255241385]}, -{"learn":[0.4587822177],"iteration":288,"passed_time":39.04709443,"remaining_time":163.6194857,"test":[0.5254505084]}, -{"learn":[0.4586388635],"iteration":289,"passed_time":39.17703284,"remaining_time":163.4627922,"test":[0.5254376979]}, -{"learn":[0.4584244131],"iteration":290,"passed_time":39.33793541,"remaining_time":163.4349275,"test":[0.5253732866]}, -{"learn":[0.4582788404],"iteration":291,"passed_time":39.49315052,"remaining_time":163.3826227,"test":[0.5252943088]}, -{"learn":[0.4581941167],"iteration":292,"passed_time":39.64430577,"remaining_time":163.312891,"test":[0.5251989688]}, -{"learn":[0.4581090232],"iteration":293,"passed_time":39.71084431,"remaining_time":162.8955042,"test":[0.5252052743]}, -{"learn":[0.4580109359],"iteration":294,"passed_time":39.86160357,"remaining_time":162.8245163,"test":[0.5252333695]}, -{"learn":[0.4579066158],"iteration":295,"passed_time":40.02199195,"remaining_time":162.7921565,"test":[0.525173787]}, -{"learn":[0.4578431787],"iteration":296,"passed_time":40.06856473,"remaining_time":162.2979238,"test":[0.5250960863]}, -{"learn":[0.4576744707],"iteration":297,"passed_time":40.22547452,"remaining_time":162.2517462,"test":[0.5252196012]}, -{"learn":[0.4575625445],"iteration":298,"passed_time":40.38080745,"remaining_time":162.1984941,"test":[0.5251910272]}, -{"learn":[0.4573806314],"iteration":299,"passed_time":40.53046321,"remaining_time":162.1218528,"test":[0.5251004761]}, -{"learn":[0.4572719273],"iteration":300,"passed_time":40.68632082,"remaining_time":162.0694308,"test":[0.5250343487]}, -{"learn":[0.4571713575],"iteration":301,"passed_time":40.85235835,"remaining_time":162.0567063,"test":[0.5249854216]}, -{"learn":[0.45706334],"iteration":302,"passed_time":40.92527847,"remaining_time":161.67511,"test":[0.5249281139]}, -{"learn":[0.4569449697],"iteration":303,"passed_time":41.08671218,"remaining_time":161.6437755,"test":[0.5249040095]}, -{"learn":[0.4568074785],"iteration":304,"passed_time":41.25561899,"remaining_time":161.6408678,"test":[0.5247956596]}, -{"learn":[0.4566027471],"iteration":305,"passed_time":41.42500514,"remaining_time":161.6387455,"test":[0.524769041]}, -{"learn":[0.4565386761],"iteration":306,"passed_time":41.58335646,"remaining_time":161.5926523,"test":[0.5247227877]}, -{"learn":[0.4564468744],"iteration":307,"passed_time":41.73529474,"remaining_time":161.5210108,"test":[0.5246661983]}, -{"learn":[0.4562576721],"iteration":308,"passed_time":41.89463236,"remaining_time":161.4773694,"test":[0.5244936365]}, -{"learn":[0.4561567326],"iteration":309,"passed_time":42.06159759,"remaining_time":161.4622617,"test":[0.5244552451]}, -{"learn":[0.4559678472],"iteration":310,"passed_time":42.22494026,"remaining_time":161.4323279,"test":[0.5244272298]}, -{"learn":[0.455821535],"iteration":311,"passed_time":42.39086764,"remaining_time":161.4113806,"test":[0.52448346]}, -{"learn":[0.4557563548],"iteration":312,"passed_time":42.55279323,"remaining_time":161.3743309,"test":[0.52461779]}, -{"learn":[0.4555635608],"iteration":313,"passed_time":42.71334258,"remaining_time":161.3312876,"test":[0.5245773234]}, -{"learn":[0.4554664243],"iteration":314,"passed_time":42.87985214,"remaining_time":161.3099199,"test":[0.5245368967]}, -{"learn":[0.4553908384],"iteration":315,"passed_time":43.04023872,"remaining_time":161.2646919,"test":[0.5245054094]}, -{"learn":[0.4552511288],"iteration":316,"passed_time":43.19753222,"remaining_time":161.2071944,"test":[0.5245349013]}, -{"learn":[0.4551686235],"iteration":317,"passed_time":43.3589167,"remaining_time":161.1642753,"test":[0.5245200556]}, -{"learn":[0.4550458163],"iteration":318,"passed_time":43.51286151,"remaining_time":161.0930704,"test":[0.5246046204]}, -{"learn":[0.4549037826],"iteration":319,"passed_time":43.67290712,"remaining_time":161.043845,"test":[0.5245359389]}, -{"learn":[0.4548248691],"iteration":320,"passed_time":43.83440992,"remaining_time":160.9992813,"test":[0.5245240863]}, -{"learn":[0.4547239295],"iteration":321,"passed_time":43.99454329,"remaining_time":160.9489814,"test":[0.5245902935]}, -{"learn":[0.454637357],"iteration":322,"passed_time":44.15845112,"remaining_time":160.9117553,"test":[0.524544559]}, -{"learn":[0.454509215],"iteration":323,"passed_time":44.32121162,"remaining_time":160.8695829,"test":[0.5246986035]}, -{"learn":[0.4543753156],"iteration":324,"passed_time":44.48319762,"remaining_time":160.8238683,"test":[0.524655942]}, -{"learn":[0.4542463813],"iteration":325,"passed_time":44.63528146,"remaining_time":160.7417805,"test":[0.52455278]}, -{"learn":[0.4540974281],"iteration":326,"passed_time":44.7900518,"remaining_time":160.6689014,"test":[0.5245547754]}, -{"learn":[0.4540544852],"iteration":327,"passed_time":44.81805858,"remaining_time":160.1425752,"test":[0.5246175905]}, -{"learn":[0.4539036833],"iteration":328,"passed_time":44.97338574,"remaining_time":160.0724459,"test":[0.5246331945]}, -{"learn":[0.4538263544],"iteration":329,"passed_time":45.11877938,"remaining_time":159.9665815,"test":[0.5247260602]}, -{"learn":[0.4537480747],"iteration":330,"passed_time":45.16257159,"remaining_time":159.5016501,"test":[0.524748648]}, -{"learn":[0.4535955825],"iteration":331,"passed_time":45.31539813,"remaining_time":159.4228464,"test":[0.5247041108]}, -{"learn":[0.4535004004],"iteration":332,"passed_time":45.47076498,"remaining_time":159.3525007,"test":[0.5246998008]}, -{"learn":[0.4534363294],"iteration":333,"passed_time":45.62468722,"remaining_time":159.2766027,"test":[0.524646404]}, -{"learn":[0.4533120961],"iteration":334,"passed_time":45.79144997,"remaining_time":159.2448932,"test":[0.5246238161]}, -{"learn":[0.4532527789],"iteration":335,"passed_time":45.95152375,"remaining_time":159.1892073,"test":[0.5245842275]}, -{"learn":[0.4531084739],"iteration":336,"passed_time":46.08282818,"remaining_time":159.0336177,"test":[0.5245910916]}, -{"learn":[0.4529905262],"iteration":337,"passed_time":46.24283953,"remaining_time":158.9768625,"test":[0.524564952]}, -{"learn":[0.4529275116],"iteration":338,"passed_time":46.39685851,"remaining_time":158.8989756,"test":[0.524502097]}, -{"learn":[0.4528593206],"iteration":339,"passed_time":46.54814838,"remaining_time":158.8113298,"test":[0.5244784715]}, -{"learn":[0.4527550533],"iteration":340,"passed_time":46.71226878,"remaining_time":158.7669194,"test":[0.5244739619]}, -{"learn":[0.4526868095],"iteration":341,"passed_time":46.84011873,"remaining_time":158.5989985,"test":[0.5244371668]}, -{"learn":[0.4525645305],"iteration":342,"passed_time":47.00067567,"remaining_time":158.5416378,"test":[0.5244161354]}, -{"learn":[0.4524657038],"iteration":343,"passed_time":47.16341533,"remaining_time":158.491012,"test":[0.5243407493]}, -{"learn":[0.4524050661],"iteration":344,"passed_time":47.32479954,"remaining_time":158.4351985,"test":[0.5243126143]}, -{"learn":[0.4523432664],"iteration":345,"passed_time":47.48347922,"remaining_time":158.3697544,"test":[0.5243770655]}, -{"learn":[0.4521117022],"iteration":346,"passed_time":47.63938583,"remaining_time":158.2945587,"test":[0.5243654523]}, -{"learn":[0.4520467333],"iteration":347,"passed_time":47.79879118,"remaining_time":158.2304812,"test":[0.5242717486]}, -{"learn":[0.4519960258],"iteration":348,"passed_time":47.87535299,"remaining_time":157.8926398,"test":[0.5242066987]}, -{"learn":[0.4519254051],"iteration":349,"passed_time":48.03043569,"remaining_time":157.8142887,"test":[0.5241857071]}, -{"learn":[0.451832547],"iteration":350,"passed_time":48.18435067,"remaining_time":157.7316778,"test":[0.5241703426]}, -{"learn":[0.4516634165],"iteration":351,"passed_time":48.34739537,"remaining_time":157.6784372,"test":[0.5241180632]}, -{"learn":[0.4515800132],"iteration":352,"passed_time":48.50566705,"remaining_time":157.6090654,"test":[0.5241839911]}, -{"learn":[0.4514333841],"iteration":353,"passed_time":48.66106287,"remaining_time":157.5298815,"test":[0.5241755705]}, -{"learn":[0.4513670947],"iteration":354,"passed_time":48.82149348,"remaining_time":157.4665071,"test":[0.5241547785]}, -{"learn":[0.4512602392],"iteration":355,"passed_time":48.98619814,"remaining_time":157.4163221,"test":[0.5240910057]}, -{"learn":[0.4510774282],"iteration":356,"passed_time":49.15025222,"remaining_time":157.3634126,"test":[0.5240606358]}, -{"learn":[0.4510062793],"iteration":357,"passed_time":49.19123903,"remaining_time":156.9173044,"test":[0.5240552881]}, -{"learn":[0.4508566394],"iteration":358,"passed_time":49.3421667,"remaining_time":156.8228752,"test":[0.5240140233]}, -{"learn":[0.4507985371],"iteration":359,"passed_time":49.49849351,"remaining_time":156.7452295,"test":[0.5240000156]}, -{"learn":[0.4506634756],"iteration":360,"passed_time":49.65104853,"remaining_time":156.6552473,"test":[0.5240112298]}, -{"learn":[0.450561955],"iteration":361,"passed_time":49.80039032,"remaining_time":156.5548182,"test":[0.5240250379]}, -{"learn":[0.4504481273],"iteration":362,"passed_time":49.95736075,"remaining_time":156.4780142,"test":[0.5239875644]}, -{"learn":[0.4503394232],"iteration":363,"passed_time":50.08622639,"remaining_time":156.3130582,"test":[0.5240291085]}, -{"learn":[0.4502420754],"iteration":364,"passed_time":50.24858445,"remaining_time":156.2524475,"test":[0.5240442735]}, -{"learn":[0.4501235995],"iteration":365,"passed_time":50.4128757,"remaining_time":156.1972706,"test":[0.5240801108]}, -{"learn":[0.450039668],"iteration":366,"passed_time":50.57257313,"remaining_time":156.1273171,"test":[0.5240595183]}, -{"learn":[0.4499925523],"iteration":367,"passed_time":50.73091063,"remaining_time":156.0526925,"test":[0.5240408414]}, -{"learn":[0.4498961025],"iteration":368,"passed_time":50.88425837,"remaining_time":155.9623204,"test":[0.5240772773]}, -{"learn":[0.4497756722],"iteration":369,"passed_time":51.03783807,"remaining_time":155.8723163,"test":[0.524025876]}, -{"learn":[0.4496452061],"iteration":370,"passed_time":51.19660163,"remaining_time":155.7977446,"test":[0.5239988583]}, -{"learn":[0.4495702542],"iteration":371,"passed_time":51.36076645,"remaining_time":155.7390983,"test":[0.5239619435]}, -{"learn":[0.4495049155],"iteration":372,"passed_time":51.51285669,"remaining_time":155.6434035,"test":[0.523977308]}, -{"learn":[0.4494208256],"iteration":373,"passed_time":51.67009651,"remaining_time":155.5629109,"test":[0.5239592298]}, -{"learn":[0.4492928948],"iteration":374,"passed_time":51.8302705,"remaining_time":155.4908115,"test":[0.5239681691]}, -{"learn":[0.449179384],"iteration":375,"passed_time":51.98211362,"remaining_time":155.3933397,"test":[0.5240119481]}, -{"learn":[0.4491512836],"iteration":376,"passed_time":52.01400525,"remaining_time":154.9382703,"test":[0.5240491024]}, -{"learn":[0.4490658732],"iteration":377,"passed_time":52.06345607,"remaining_time":154.5375601,"test":[0.524017176]}, -{"learn":[0.448954845],"iteration":378,"passed_time":52.21902264,"remaining_time":154.4525709,"test":[0.5240107509]}, -{"learn":[0.4488382178],"iteration":379,"passed_time":52.37929989,"remaining_time":154.3810944,"test":[0.5240477854]}, -{"learn":[0.4486912718],"iteration":380,"passed_time":52.54238235,"remaining_time":154.3173907,"test":[0.5239433863]}, -{"learn":[0.448673577],"iteration":381,"passed_time":52.58659907,"remaining_time":153.9052821,"test":[0.5239456212]}, -{"learn":[0.4486297361],"iteration":382,"passed_time":52.7417111,"remaining_time":153.8185151,"test":[0.52396781]}, -{"learn":[0.4485145879],"iteration":383,"passed_time":52.90060457,"remaining_time":153.742382,"test":[0.5239154907]}, -{"learn":[0.4483253856],"iteration":384,"passed_time":53.05433354,"remaining_time":153.6508621,"test":[0.5238472482]}, -{"learn":[0.4482166815],"iteration":385,"passed_time":53.20536538,"remaining_time":153.5512358,"test":[0.5238477271]}, -{"learn":[0.4481055476],"iteration":386,"passed_time":53.35684055,"remaining_time":153.4526189,"test":[0.5237636411]}, -{"learn":[0.4480823067],"iteration":387,"passed_time":53.38944252,"remaining_time":153.0130415,"test":[0.5238468092]}, -{"learn":[0.4480307013],"iteration":388,"passed_time":53.54081583,"remaining_time":152.9147722,"test":[0.5238066219]}, -{"learn":[0.4479079469],"iteration":389,"passed_time":53.70523349,"remaining_time":152.8533568,"test":[0.5237445651]}, -{"learn":[0.4478744589],"iteration":390,"passed_time":53.77546781,"remaining_time":152.5242808,"test":[0.5238180356]}, -{"learn":[0.4478029402],"iteration":391,"passed_time":53.92697606,"remaining_time":152.4262486,"test":[0.523788823]}, -{"learn":[0.4477255056],"iteration":392,"passed_time":54.08587645,"remaining_time":152.3487665,"test":[0.5238235828]}, -{"learn":[0.4475660412],"iteration":393,"passed_time":54.2456191,"remaining_time":152.2732354,"test":[0.5237518284]}, -{"learn":[0.4474494668],"iteration":394,"passed_time":54.40977959,"remaining_time":152.2096366,"test":[0.5237233341]}, -{"learn":[0.4473260786],"iteration":395,"passed_time":54.57585739,"remaining_time":152.1508751,"test":[0.5236708153]}, -{"learn":[0.4472822378],"iteration":396,"passed_time":54.73254687,"remaining_time":152.0654892,"test":[0.5237228552]}, -{"learn":[0.4471496589],"iteration":397,"passed_time":54.89318799,"remaining_time":151.9906864,"test":[0.5236480279]}, -{"learn":[0.4471022263],"iteration":398,"passed_time":55.03993512,"remaining_time":151.8771142,"test":[0.5236367739]}, -{"learn":[0.447030285],"iteration":399,"passed_time":55.19144879,"remaining_time":151.7764842,"test":[0.523651899]}, -{"learn":[0.4469258065],"iteration":400,"passed_time":55.34849053,"remaining_time":151.6907508,"test":[0.5236269965]}, -{"learn":[0.4469129184],"iteration":401,"passed_time":55.38920318,"remaining_time":151.2869281,"test":[0.5236110732]}, -{"learn":[0.446814567],"iteration":402,"passed_time":55.44507103,"remaining_time":150.9261611,"test":[0.5236593219]}, -{"learn":[0.4467275192],"iteration":403,"passed_time":55.60277766,"remaining_time":150.843179,"test":[0.5236443165]}, -{"learn":[0.4466951931],"iteration":404,"passed_time":55.72937588,"remaining_time":150.67572,"test":[0.5236209305]}, -{"learn":[0.4466253647],"iteration":405,"passed_time":55.88204473,"remaining_time":150.5787117,"test":[0.5236522582]}, -{"learn":[0.4465769813],"iteration":406,"passed_time":56.03109582,"remaining_time":150.4717143,"test":[0.5236051269]}, -{"learn":[0.4465089488],"iteration":407,"passed_time":56.19052125,"remaining_time":150.3922775,"test":[0.5235003288]}, -{"learn":[0.4464336271],"iteration":408,"passed_time":56.35572942,"remaining_time":150.3278748,"test":[0.5234595828]}, -{"learn":[0.4464006672],"iteration":409,"passed_time":56.52098232,"remaining_time":150.2630993,"test":[0.5234415843]}, -{"learn":[0.4463606294],"iteration":410,"passed_time":56.6811029,"remaining_time":150.1842361,"test":[0.5234715552]}, -{"learn":[0.4460767204],"iteration":411,"passed_time":56.84216258,"remaining_time":150.1074585,"test":[0.5234680034]}, -{"learn":[0.4459628927],"iteration":412,"passed_time":56.99206014,"remaining_time":150.0008944,"test":[0.5234185176]}, -{"learn":[0.4458279897],"iteration":413,"passed_time":57.15069201,"remaining_time":149.9170327,"test":[0.5234071039]}, -{"learn":[0.4457970898],"iteration":414,"passed_time":57.30574082,"remaining_time":149.8234429,"test":[0.5234527585]}, -{"learn":[0.4457433188],"iteration":415,"passed_time":57.42757611,"remaining_time":149.6430108,"test":[0.5233959297]}, -{"learn":[0.4455423376],"iteration":416,"passed_time":57.58858573,"remaining_time":149.5646003,"test":[0.5234332037]}, -{"learn":[0.445509008],"iteration":417,"passed_time":57.61945695,"remaining_time":149.1489292,"test":[0.5234163625]}, -{"learn":[0.445434637],"iteration":418,"passed_time":57.77908549,"remaining_time":149.0672826,"test":[0.5233865114]}, -{"learn":[0.4454038956],"iteration":419,"passed_time":57.8239893,"remaining_time":148.6902582,"test":[0.523371107]}, -{"learn":[0.4453823449],"iteration":420,"passed_time":57.96873557,"remaining_time":148.5707023,"test":[0.523323417]}, -{"learn":[0.4452761233],"iteration":421,"passed_time":58.11822386,"remaining_time":148.4631406,"test":[0.5233568598]}, -{"learn":[0.4451756591],"iteration":422,"passed_time":58.27592848,"remaining_time":148.3763002,"test":[0.5233472021]}, -{"learn":[0.4451443895],"iteration":423,"passed_time":58.34601412,"remaining_time":148.0667717,"test":[0.5233202244]}, -{"learn":[0.4450389074],"iteration":424,"passed_time":58.49692496,"remaining_time":147.9628102,"test":[0.5232979159]}, -{"learn":[0.4450113352],"iteration":425,"passed_time":58.60924681,"remaining_time":147.7613405,"test":[0.5233085314]}, -{"learn":[0.4449789564],"iteration":426,"passed_time":58.72298972,"remaining_time":147.5638594,"test":[0.5232804761]}, -{"learn":[0.4449239177],"iteration":427,"passed_time":58.87414922,"remaining_time":147.4604859,"test":[0.523238054]}, -{"learn":[0.4448193335],"iteration":428,"passed_time":59.04120321,"remaining_time":147.3965702,"test":[0.523211196]}, -{"learn":[0.4447422159],"iteration":429,"passed_time":59.19506955,"remaining_time":147.2993591,"test":[0.5231854155]}, -{"learn":[0.4446471394],"iteration":430,"passed_time":59.34568053,"remaining_time":147.1938109,"test":[0.5231295843]}, -{"learn":[0.4445214271],"iteration":431,"passed_time":59.50259569,"remaining_time":147.1036393,"test":[0.5230442612]}, -{"learn":[0.4443971409],"iteration":432,"passed_time":59.65748294,"remaining_time":147.0081623,"test":[0.5230478529]}, -{"learn":[0.4443232982],"iteration":433,"passed_time":59.80714965,"remaining_time":146.8995888,"test":[0.5230585083]}, -{"learn":[0.4442969409],"iteration":434,"passed_time":59.96374903,"remaining_time":146.8077994,"test":[0.5230607831]}, -{"learn":[0.4442356165],"iteration":435,"passed_time":60.11970951,"remaining_time":146.7141535,"test":[0.5230641354]}, -{"learn":[0.4441891875],"iteration":436,"passed_time":60.28257679,"remaining_time":146.6370232,"test":[0.5230561538]}, -{"learn":[0.4441385328],"iteration":437,"passed_time":60.4359229,"remaining_time":146.5364158,"test":[0.5230684454]}, -{"learn":[0.4438870026],"iteration":438,"passed_time":60.59277507,"remaining_time":146.4440418,"test":[0.5231114262]}, -{"learn":[0.4437075193],"iteration":439,"passed_time":60.75733176,"remaining_time":146.3699356,"test":[0.5231342136]}, -{"learn":[0.4436420749],"iteration":440,"passed_time":60.90833207,"remaining_time":146.2628654,"test":[0.5231202459]}, -{"learn":[0.4435003053],"iteration":441,"passed_time":61.05871471,"remaining_time":146.154118,"test":[0.5231264715]}, -{"learn":[0.4433527254],"iteration":442,"passed_time":61.21325604,"remaining_time":146.0551053,"test":[0.5230611423]}, -{"learn":[0.4433024933],"iteration":443,"passed_time":61.36945519,"remaining_time":145.9597853,"test":[0.5230454585]}, -{"learn":[0.4432446023],"iteration":444,"passed_time":61.52740639,"remaining_time":145.8683455,"test":[0.5230618606]}, -{"learn":[0.4431795277],"iteration":445,"passed_time":61.68597045,"remaining_time":145.7780557,"test":[0.5230099404]}, -{"learn":[0.4431337325],"iteration":446,"passed_time":61.83951372,"remaining_time":145.675633,"test":[0.5230171238]}, -{"learn":[0.4430164187],"iteration":447,"passed_time":61.99248417,"remaining_time":145.5716369,"test":[0.523017483]}, -{"learn":[0.4428659601],"iteration":448,"passed_time":62.14577611,"remaining_time":145.4681753,"test":[0.522981087]}, -{"learn":[0.4428225946],"iteration":449,"passed_time":62.29988243,"remaining_time":145.3663923,"test":[0.5230335659]}, -{"learn":[0.4426428472],"iteration":450,"passed_time":62.4575178,"remaining_time":145.2725858,"test":[0.5230780632]}, -{"learn":[0.4424738223],"iteration":451,"passed_time":62.62498512,"remaining_time":145.2012929,"test":[0.5230968199]}, -{"learn":[0.4424119433],"iteration":452,"passed_time":62.77624394,"remaining_time":145.0921135,"test":[0.5231519727]}, -{"learn":[0.4422576024],"iteration":453,"passed_time":62.93064356,"remaining_time":144.989985,"test":[0.5230957823]}, -{"learn":[0.4422291059],"iteration":454,"passed_time":63.0494924,"remaining_time":144.805977,"test":[0.5231619895]}, -{"learn":[0.4421624731],"iteration":455,"passed_time":63.20562744,"remaining_time":144.7076207,"test":[0.5231427938]}, -{"learn":[0.442123254],"iteration":456,"passed_time":63.36383326,"remaining_time":144.6137376,"test":[0.5231407585]}, -{"learn":[0.4420691925],"iteration":457,"passed_time":63.53186125,"remaining_time":144.5419201,"test":[0.5231268307]}, -{"learn":[0.4419895923],"iteration":458,"passed_time":63.68882944,"remaining_time":144.4446001,"test":[0.5230903149]}, -{"learn":[0.4418486414],"iteration":459,"passed_time":63.83990992,"remaining_time":144.3337094,"test":[0.5231239174]}, -{"learn":[0.4418192733],"iteration":460,"passed_time":63.99282744,"remaining_time":144.2267846,"test":[0.5231105882]}, -{"learn":[0.4417889808],"iteration":461,"passed_time":64.15098412,"remaining_time":144.1314319,"test":[0.5231072359]}, -{"learn":[0.4417187035],"iteration":462,"passed_time":64.31785632,"remaining_time":144.0553283,"test":[0.5230663303]}, -{"learn":[0.4416921613],"iteration":463,"passed_time":64.47349718,"remaining_time":143.9537566,"test":[0.5230520034]}, -{"learn":[0.441611267],"iteration":464,"passed_time":64.62941181,"remaining_time":143.8525618,"test":[0.5231552052]}, -{"learn":[0.4415747418],"iteration":465,"passed_time":64.78512486,"remaining_time":143.7506848,"test":[0.5231227601]}, -{"learn":[0.4414475505],"iteration":466,"passed_time":64.93745973,"remaining_time":143.6411047,"test":[0.5231283073]}, -{"learn":[0.441401412],"iteration":467,"passed_time":65.0941464,"remaining_time":143.5409382,"test":[0.5231457869]}, -{"learn":[0.441264898],"iteration":468,"passed_time":65.25849,"remaining_time":143.4573629,"test":[0.5231242367]}, -{"learn":[0.4412250979],"iteration":469,"passed_time":65.41833021,"remaining_time":143.3635747,"test":[0.5231054799]}, -{"learn":[0.4411516777],"iteration":470,"passed_time":65.57637022,"remaining_time":143.2655732,"test":[0.5231052006]}, -{"learn":[0.4411195894],"iteration":471,"passed_time":65.74014403,"remaining_time":143.1798052,"test":[0.5230944654]}, -{"learn":[0.4409704513],"iteration":472,"passed_time":65.90015421,"remaining_time":143.0855357,"test":[0.5230880003]}, -{"learn":[0.4409550013],"iteration":473,"passed_time":65.94637873,"remaining_time":142.7446932,"test":[0.523081615]}, -{"learn":[0.4409130092],"iteration":474,"passed_time":65.99824817,"remaining_time":142.4172724,"test":[0.5230570717]}, -{"learn":[0.4406579401],"iteration":475,"passed_time":66.15875582,"remaining_time":142.3247184,"test":[0.5230114569]}, -{"learn":[0.4406162913],"iteration":476,"passed_time":66.31827171,"remaining_time":142.2297525,"test":[0.5230258637]}, -{"learn":[0.4405363742],"iteration":477,"passed_time":66.48091101,"remaining_time":142.1411947,"test":[0.5230545575]}, -{"learn":[0.4403470663],"iteration":478,"passed_time":66.63658243,"remaining_time":142.0374753,"test":[0.5230124945]}, -{"learn":[0.4403139479],"iteration":479,"passed_time":66.7892306,"remaining_time":141.927115,"test":[0.5230045129]}, -{"learn":[0.4402780301],"iteration":480,"passed_time":66.94955599,"remaining_time":141.8328431,"test":[0.5230198376]}, -{"learn":[0.4402373057],"iteration":481,"passed_time":67.11298399,"remaining_time":141.74485,"test":[0.5229702321]}, -{"learn":[0.4400009349],"iteration":482,"passed_time":67.28088908,"remaining_time":141.6659714,"test":[0.5229998836]}, -{"learn":[0.4398747737],"iteration":483,"passed_time":67.44164375,"remaining_time":141.571715,"test":[0.5229549074]}, -{"learn":[0.439848073],"iteration":484,"passed_time":67.60031061,"remaining_time":141.472815,"test":[0.5230846879]}, -{"learn":[0.4397764751],"iteration":485,"passed_time":67.75288714,"remaining_time":141.3609621,"test":[0.5230766664]}, -{"learn":[0.4396613797],"iteration":486,"passed_time":67.91557816,"remaining_time":141.2699809,"test":[0.5230417071]}, -{"learn":[0.4396378483],"iteration":487,"passed_time":68.07333374,"remaining_time":141.1684708,"test":[0.5229751008]}, -{"learn":[0.4396095366],"iteration":488,"passed_time":68.22751264,"remaining_time":141.0593359,"test":[0.5229996442]}, -{"learn":[0.4394663144],"iteration":489,"passed_time":68.3855493,"remaining_time":140.957969,"test":[0.5229788123]}, -{"learn":[0.4394229489],"iteration":490,"passed_time":68.53978222,"remaining_time":140.8485545,"test":[0.5229538698]}, -{"learn":[0.4393754107],"iteration":491,"passed_time":68.69165107,"remaining_time":140.7341144,"test":[0.5229369489]}, -{"learn":[0.4392023978],"iteration":492,"passed_time":68.85264812,"remaining_time":140.6381677,"test":[0.522943813]}, -{"learn":[0.4391009301],"iteration":493,"passed_time":69.01197044,"remaining_time":140.5385471,"test":[0.5229318007]}, -{"learn":[0.4390324221],"iteration":494,"passed_time":69.16836345,"remaining_time":140.4327379,"test":[0.5228958836]}, -{"learn":[0.4389297659],"iteration":495,"passed_time":69.32993203,"remaining_time":140.3372011,"test":[0.5229134431]}, -{"learn":[0.438822303],"iteration":496,"passed_time":69.48210171,"remaining_time":140.2224306,"test":[0.5229490809]}, -{"learn":[0.4387215219],"iteration":497,"passed_time":69.6071362,"remaining_time":140.0529126,"test":[0.5229017102]}, -{"learn":[0.4386502938],"iteration":498,"passed_time":69.76173604,"remaining_time":139.9428813,"test":[0.5229517547]}, -{"learn":[0.4385849551],"iteration":499,"passed_time":69.88558436,"remaining_time":139.7711687,"test":[0.522969394]}, -{"learn":[0.4384856265],"iteration":500,"passed_time":70.04602315,"remaining_time":139.672609,"test":[0.5229041446]}, -{"learn":[0.4384638118],"iteration":501,"passed_time":70.19562823,"remaining_time":139.5522649,"test":[0.5228783241]}, -{"learn":[0.4384542777],"iteration":502,"passed_time":70.2281579,"remaining_time":139.1997484,"test":[0.5228718192]}, -{"learn":[0.4384396993],"iteration":503,"passed_time":70.39177266,"remaining_time":139.1075507,"test":[0.5229268522]}, -{"learn":[0.4382679277],"iteration":504,"passed_time":70.55659601,"remaining_time":139.0174515,"test":[0.5229266925]}, -{"learn":[0.4382344397],"iteration":505,"passed_time":70.70793951,"remaining_time":138.9005768,"test":[0.5230010809]}, -{"learn":[0.4381823589],"iteration":506,"passed_time":70.86453338,"remaining_time":138.7938494,"test":[0.5230021185]}, -{"learn":[0.4381218796],"iteration":507,"passed_time":71.01867028,"remaining_time":138.6821278,"test":[0.5229993249]}, -{"learn":[0.4379384348],"iteration":508,"passed_time":71.17582312,"remaining_time":138.5761114,"test":[0.5229493602]}, -{"learn":[0.4378280668],"iteration":509,"passed_time":71.33420931,"remaining_time":138.4722887,"test":[0.5229711898]}, -{"learn":[0.4377054973],"iteration":510,"passed_time":71.49781605,"remaining_time":138.3783563,"test":[0.5229555459]}, -{"learn":[0.4376783741],"iteration":511,"passed_time":71.61408535,"remaining_time":138.1928053,"test":[0.5229590179]}, -{"learn":[0.437517193],"iteration":512,"passed_time":71.7753264,"remaining_time":138.094049,"test":[0.5229262935]}, -{"learn":[0.4374509828],"iteration":513,"passed_time":71.93095326,"remaining_time":137.98428,"test":[0.5228736948]}, -{"learn":[0.4373832143],"iteration":514,"passed_time":72.08748127,"remaining_time":137.8760564,"test":[0.5228265237]}, -{"learn":[0.437317638],"iteration":515,"passed_time":72.24575023,"remaining_time":137.7709655,"test":[0.5228191806]}, -{"learn":[0.4372261532],"iteration":516,"passed_time":72.39956,"remaining_time":137.6571905,"test":[0.5228468368]}, -{"learn":[0.4370933894],"iteration":517,"passed_time":72.55320735,"remaining_time":137.5429529,"test":[0.5228318713]}, -{"learn":[0.4370755626],"iteration":518,"passed_time":72.70412612,"remaining_time":137.423406,"test":[0.522833308]}, -{"learn":[0.4370412294],"iteration":519,"passed_time":72.75591785,"remaining_time":137.1169221,"test":[0.522861483]}, -{"learn":[0.4370063944],"iteration":520,"passed_time":72.91155277,"remaining_time":137.0065454,"test":[0.5228843902]}, -{"learn":[0.4369962265],"iteration":521,"passed_time":72.98348723,"remaining_time":136.7391772,"test":[0.5228509473]}, -{"learn":[0.4368221837],"iteration":522,"passed_time":73.137601,"remaining_time":136.626073,"test":[0.522768737]}, -{"learn":[0.4368066017],"iteration":523,"passed_time":73.16906731,"remaining_time":136.2843696,"test":[0.5227463088]}, -{"learn":[0.4367131362],"iteration":524,"passed_time":73.32924951,"remaining_time":136.182892,"test":[0.5227663825]}, -{"learn":[0.4365742981],"iteration":525,"passed_time":73.48725804,"remaining_time":136.077166,"test":[0.5227153403]}, -{"learn":[0.4365688048],"iteration":526,"passed_time":73.52245291,"remaining_time":135.7444908,"test":[0.5227093541]}, -{"learn":[0.4364445979],"iteration":527,"passed_time":73.68150624,"remaining_time":135.6409547,"test":[0.5226514078]}, -{"learn":[0.4363200476],"iteration":528,"passed_time":73.83913162,"remaining_time":135.5345875,"test":[0.522653922]}, -{"learn":[0.4363052844],"iteration":529,"passed_time":73.91367196,"remaining_time":135.2759657,"test":[0.5226686081]}, -{"learn":[0.4362704758],"iteration":530,"passed_time":74.06893128,"remaining_time":135.1653379,"test":[0.5226732773]}, -{"learn":[0.4361591042],"iteration":531,"passed_time":74.23409291,"remaining_time":135.07256,"test":[0.5226849304]}, -{"learn":[0.4361454766],"iteration":532,"passed_time":74.30237719,"remaining_time":134.80375,"test":[0.5226886419]}, -{"learn":[0.436116267],"iteration":533,"passed_time":74.45182026,"remaining_time":134.6825063,"test":[0.5227434753]}, -{"learn":[0.4360903322],"iteration":534,"passed_time":74.61297263,"remaining_time":134.5822777,"test":[0.5227471469]}, -{"learn":[0.4360751992],"iteration":535,"passed_time":74.65320045,"remaining_time":134.2643381,"test":[0.5228053326]}, -{"learn":[0.4360617036],"iteration":536,"passed_time":74.72567821,"remaining_time":134.0052665,"test":[0.5227919634]}, -{"learn":[0.4360393342],"iteration":537,"passed_time":74.88740847,"remaining_time":133.9064813,"test":[0.5227967524]}, -{"learn":[0.4359319506],"iteration":538,"passed_time":75.04895673,"remaining_time":133.8071381,"test":[0.5227892896]}, -{"learn":[0.4359098189],"iteration":539,"passed_time":75.21364758,"remaining_time":133.7131513,"test":[0.522829876]}, -{"learn":[0.4358879777],"iteration":540,"passed_time":75.36559974,"remaining_time":133.5963219,"test":[0.5228210164]}, -{"learn":[0.4358591906],"iteration":541,"passed_time":75.51358751,"remaining_time":133.4723558,"test":[0.5228551776]}, -{"learn":[0.4357868268],"iteration":542,"passed_time":75.6692514,"remaining_time":133.3618298,"test":[0.5228748522]}, -{"learn":[0.4357649328],"iteration":543,"passed_time":75.82901407,"remaining_time":133.2583409,"test":[0.5229222628]}, -{"learn":[0.4357355383],"iteration":544,"passed_time":75.88214605,"remaining_time":132.9677972,"test":[0.5229318007]}, -{"learn":[0.4357061703],"iteration":545,"passed_time":76.03372281,"remaining_time":132.8501311,"test":[0.5229322397]}, -{"learn":[0.4356943913],"iteration":546,"passed_time":76.19466685,"remaining_time":132.7486609,"test":[0.5229199082]}, -{"learn":[0.4356770135],"iteration":547,"passed_time":76.34429248,"remaining_time":132.627311,"test":[0.5229286081]}, -{"learn":[0.4355669096],"iteration":548,"passed_time":76.49524655,"remaining_time":132.5081593,"test":[0.5230504869]}, -{"learn":[0.4354876263],"iteration":549,"passed_time":76.65321548,"remaining_time":132.4010085,"test":[0.5229934185]}, -{"learn":[0.4353802163],"iteration":550,"passed_time":76.81705209,"remaining_time":132.3037794,"test":[0.5230091423]}, -{"learn":[0.4353536477],"iteration":551,"passed_time":76.96906405,"remaining_time":132.1860013,"test":[0.5230165651]}, -{"learn":[0.4352718554],"iteration":552,"passed_time":77.12286663,"remaining_time":132.0711658,"test":[0.5229696733]}, -{"learn":[0.4352601293],"iteration":553,"passed_time":77.27815185,"remaining_time":131.9587214,"test":[0.5230418268]}, -{"learn":[0.4351814007],"iteration":554,"passed_time":77.43740861,"remaining_time":131.8528849,"test":[0.5230120555]}, -{"learn":[0.4350829701],"iteration":555,"passed_time":77.59263576,"remaining_time":131.7400147,"test":[0.523007506]}, -{"learn":[0.4350163901],"iteration":556,"passed_time":77.75780163,"remaining_time":131.6438186,"test":[0.5230182812]}, -{"learn":[0.4349806044],"iteration":557,"passed_time":77.91510297,"remaining_time":131.5340986,"test":[0.5229983272]}, -{"learn":[0.4349619324],"iteration":558,"passed_time":78.06271727,"remaining_time":131.4079015,"test":[0.5230093817]}, -{"learn":[0.4349292103],"iteration":559,"passed_time":78.22484682,"remaining_time":131.3059929,"test":[0.5230354815]}, -{"learn":[0.4348939791],"iteration":560,"passed_time":78.29736983,"remaining_time":131.0538864,"test":[0.5230684055]}, -{"learn":[0.4348553939],"iteration":561,"passed_time":78.44930176,"remaining_time":130.9349556,"test":[0.5231038038]}, -{"learn":[0.4348175482],"iteration":562,"passed_time":78.60501713,"remaining_time":130.8222043,"test":[0.5231512543]}, -{"learn":[0.4347966842],"iteration":563,"passed_time":78.76091569,"remaining_time":130.7096048,"test":[0.5231319788]}, -{"learn":[0.4347820793],"iteration":564,"passed_time":78.81039023,"remaining_time":130.4207343,"test":[0.5231420356]}, -{"learn":[0.4347550354],"iteration":565,"passed_time":78.96926769,"remaining_time":130.3132439,"test":[0.523170011]}, -{"learn":[0.434640072],"iteration":566,"passed_time":79.12901412,"remaining_time":130.2070021,"test":[0.5232054492]}, -{"learn":[0.4345157331],"iteration":567,"passed_time":79.29544234,"remaining_time":130.1115357,"test":[0.5231761568]}, -{"learn":[0.4344660292],"iteration":568,"passed_time":79.4499035,"remaining_time":129.9962393,"test":[0.5232032543]}, -{"learn":[0.4344279721],"iteration":569,"passed_time":79.59948797,"remaining_time":129.8728488,"test":[0.5232200156]}, -{"learn":[0.4344101453],"iteration":570,"passed_time":79.74856384,"remaining_time":129.7485391,"test":[0.5232166235]}, -{"learn":[0.4343892021],"iteration":571,"passed_time":79.90103371,"remaining_time":129.6296491,"test":[0.5232150271]}, -{"learn":[0.4343576948],"iteration":572,"passed_time":80.05669509,"remaining_time":129.5158051,"test":[0.5232114354]}, -{"learn":[0.434319717],"iteration":573,"passed_time":80.21008227,"remaining_time":129.3981467,"test":[0.5232127125]}, -{"learn":[0.4343054555],"iteration":574,"passed_time":80.35530859,"remaining_time":129.2672356,"test":[0.5232166634]}, -{"learn":[0.4342626975],"iteration":575,"passed_time":80.50493967,"remaining_time":129.1433407,"test":[0.5232570502]}, -{"learn":[0.4342437878],"iteration":576,"passed_time":80.66406983,"remaining_time":129.0345519,"test":[0.5232562121]}, -{"learn":[0.4342213128],"iteration":577,"passed_time":80.82600089,"remaining_time":128.9300568,"test":[0.5232680648]}, -{"learn":[0.4340750006],"iteration":578,"passed_time":80.98703981,"remaining_time":128.8239442,"test":[0.5232951223]}, -{"learn":[0.4340425689],"iteration":579,"passed_time":81.14615585,"remaining_time":128.714592,"test":[0.5232734922]}, -{"learn":[0.4338611577],"iteration":580,"passed_time":81.29742874,"remaining_time":128.5926627,"test":[0.5233136795]}, -{"learn":[0.4338519405],"iteration":581,"passed_time":81.44788718,"remaining_time":128.4693478,"test":[0.5233617286]}, -{"learn":[0.433827115],"iteration":582,"passed_time":81.60135302,"remaining_time":128.3506702,"test":[0.5233616488]}, -{"learn":[0.4338011538],"iteration":583,"passed_time":81.74983302,"remaining_time":128.2240532,"test":[0.5233495966]}, -{"learn":[0.433731431],"iteration":584,"passed_time":81.90665043,"remaining_time":128.110402,"test":[0.5233318775]}, -{"learn":[0.433711148],"iteration":585,"passed_time":82.05843798,"remaining_time":127.9887582,"test":[0.5233067754]}, -{"learn":[0.4335983503],"iteration":586,"passed_time":82.22781147,"remaining_time":127.8943644,"test":[0.5233351898]}, -{"learn":[0.4335714648],"iteration":587,"passed_time":82.38615593,"remaining_time":127.7826092,"test":[0.5232900141]}, -{"learn":[0.4335145773],"iteration":588,"passed_time":82.54055099,"remaining_time":127.6645874,"test":[0.5232538176]}, -{"learn":[0.4335001838],"iteration":589,"passed_time":82.61379936,"remaining_time":127.4212838,"test":[0.5232485099]}, -{"learn":[0.4334615194],"iteration":590,"passed_time":82.77260308,"remaining_time":127.3101459,"test":[0.5232524209]}, -{"learn":[0.4334292726],"iteration":591,"passed_time":82.9274668,"remaining_time":127.1928038,"test":[0.5232687432]}, -{"learn":[0.433355958],"iteration":592,"passed_time":83.083317,"remaining_time":127.076844,"test":[0.5232477117]}, -{"learn":[0.4332864465],"iteration":593,"passed_time":83.24329718,"remaining_time":126.9670492,"test":[0.5232545759]}, -{"learn":[0.4332533018],"iteration":594,"passed_time":83.39442709,"remaining_time":126.8436244,"test":[0.523244998]}, -{"learn":[0.4332404665],"iteration":595,"passed_time":83.47337436,"remaining_time":126.6106215,"test":[0.5232617992]}, -{"learn":[0.4332047335],"iteration":596,"passed_time":83.59800054,"remaining_time":126.447227,"test":[0.5232426434]}, -{"learn":[0.4331100004],"iteration":597,"passed_time":83.76776962,"remaining_time":126.3520538,"test":[0.5232268798]}, -{"learn":[0.4330618283],"iteration":598,"passed_time":83.92861535,"remaining_time":126.2432094,"test":[0.5232590057]}, -{"learn":[0.4329813566],"iteration":599,"passed_time":84.08470248,"remaining_time":126.1270537,"test":[0.5232524209]}, -{"learn":[0.4329375949],"iteration":600,"passed_time":84.12675837,"remaining_time":125.8401926,"test":[0.5232754078]}, -{"learn":[0.4328643596],"iteration":601,"passed_time":84.28409843,"remaining_time":125.7261136,"test":[0.523300031]}, -{"learn":[0.4328343577],"iteration":602,"passed_time":84.43828235,"remaining_time":125.6071961,"test":[0.5232716964]}, -{"learn":[0.4327723731],"iteration":603,"passed_time":84.58643706,"remaining_time":125.4792179,"test":[0.5232841875]}, -{"learn":[0.4326699546],"iteration":604,"passed_time":84.74701583,"remaining_time":125.3695523,"test":[0.5232818729]}, -{"learn":[0.4326482718],"iteration":605,"passed_time":84.90117741,"remaining_time":125.2502518,"test":[0.523282711]}, -{"learn":[0.4326162627],"iteration":606,"passed_time":85.04948168,"remaining_time":125.1222193,"test":[0.5232781215]}, -{"learn":[0.4325593753],"iteration":607,"passed_time":85.20447396,"remaining_time":125.0039322,"test":[0.5232599235]}, -{"learn":[0.4325217672],"iteration":608,"passed_time":85.35936659,"remaining_time":124.8853787,"test":[0.5232415659]}, -{"learn":[0.4324898902],"iteration":609,"passed_time":85.51448466,"remaining_time":124.767035,"test":[0.5232594446]}, -{"learn":[0.432462899],"iteration":610,"passed_time":85.66535446,"remaining_time":124.6423897,"test":[0.5232917301]}, -{"learn":[0.4324404768],"iteration":611,"passed_time":85.78920889,"remaining_time":124.47846,"test":[0.5232865421]}, -{"learn":[0.432319492],"iteration":612,"passed_time":85.94678538,"remaining_time":124.3634562,"test":[0.5232459957]}, -{"learn":[0.4322954323],"iteration":613,"passed_time":85.99285292,"remaining_time":124.0874067,"test":[0.5232588859]}, -{"learn":[0.4322757568],"iteration":614,"passed_time":86.14279582,"remaining_time":123.9615842,"test":[0.5232828706]}, -{"learn":[0.4322003294],"iteration":615,"passed_time":86.26324002,"remaining_time":123.7933509,"test":[0.5232958806]}, -{"learn":[0.4321096634],"iteration":616,"passed_time":86.3961815,"remaining_time":123.6431576,"test":[0.5232828307]}, -{"learn":[0.4320241473],"iteration":617,"passed_time":86.54652278,"remaining_time":123.5178529,"test":[0.5232733326]}, -{"learn":[0.4319246867],"iteration":618,"passed_time":86.70689325,"remaining_time":123.4067414,"test":[0.5232422044]}, -{"learn":[0.4319043509],"iteration":619,"passed_time":86.86015587,"remaining_time":123.2853825,"test":[0.5232609212]}, -{"learn":[0.4318645772],"iteration":620,"passed_time":87.00708767,"remaining_time":123.1549598,"test":[0.5232268]}, -{"learn":[0.4318527191],"iteration":621,"passed_time":87.16154663,"remaining_time":123.0351092,"test":[0.5232017378]}, -{"learn":[0.4317747035],"iteration":622,"passed_time":87.20883716,"remaining_time":122.764286,"test":[0.5231963502]}, -{"learn":[0.4316558843],"iteration":623,"passed_time":87.36654267,"remaining_time":122.6491849,"test":[0.5231319389]}, -{"learn":[0.4315540468],"iteration":624,"passed_time":87.49325314,"remaining_time":122.4905544,"test":[0.523149219]}, -{"learn":[0.4314164499],"iteration":625,"passed_time":87.6564245,"remaining_time":122.3829313,"test":[0.5231252344]}, -{"learn":[0.4312442294],"iteration":626,"passed_time":87.82370487,"remaining_time":122.2808522,"test":[0.5231044423]}, -{"learn":[0.4310994226],"iteration":627,"passed_time":87.98817164,"remaining_time":122.1746587,"test":[0.5230896764]}, -{"learn":[0.4310544989],"iteration":628,"passed_time":88.15345928,"remaining_time":122.0694166,"test":[0.5230465759]}, -{"learn":[0.4309213918],"iteration":629,"passed_time":88.31659201,"remaining_time":121.961008,"test":[0.5230212743]}, -{"learn":[0.4308180225],"iteration":630,"passed_time":88.48017693,"remaining_time":121.8530487,"test":[0.5230591868]}, -{"learn":[0.4307432026],"iteration":631,"passed_time":88.643088,"remaining_time":121.7439879,"test":[0.5230783426]}, -{"learn":[0.4306346833],"iteration":632,"passed_time":88.80154534,"remaining_time":121.6286569,"test":[0.5230827723]}, -{"learn":[0.4306206331],"iteration":633,"passed_time":88.96058037,"remaining_time":121.5139789,"test":[0.5230903548]}, -{"learn":[0.4305275901],"iteration":634,"passed_time":89.12490707,"remaining_time":121.4063695,"test":[0.5230961016]}, -{"learn":[0.43043357],"iteration":635,"passed_time":89.27694974,"remaining_time":121.281894,"test":[0.5230887186]}, -{"learn":[0.4304329362],"iteration":636,"passed_time":89.30160813,"remaining_time":120.9847532,"test":[0.523092869]}, -{"learn":[0.4302760071],"iteration":637,"passed_time":89.45118407,"remaining_time":120.8572424,"test":[0.5230853265]}, -{"learn":[0.4302078954],"iteration":638,"passed_time":89.60563515,"remaining_time":120.7362314,"test":[0.5230822136]}, -{"learn":[0.4300681065],"iteration":639,"passed_time":89.76193947,"remaining_time":120.6176062,"test":[0.5230661707]}, -{"learn":[0.429970653],"iteration":640,"passed_time":89.91946185,"remaining_time":120.5004957,"test":[0.5230572712]}, -{"learn":[0.4298872234],"iteration":641,"passed_time":90.07464246,"remaining_time":120.3801296,"test":[0.5230463364]}, -{"learn":[0.4298472649],"iteration":642,"passed_time":90.22289252,"remaining_time":120.2504182,"test":[0.5230882397]}, -{"learn":[0.4297527694],"iteration":643,"passed_time":90.38672591,"remaining_time":120.1413624,"test":[0.52305344]}, -{"learn":[0.4295976362],"iteration":644,"passed_time":90.5493171,"remaining_time":120.0304901,"test":[0.5230494093]}, -{"learn":[0.4295214165],"iteration":645,"passed_time":90.70317634,"remaining_time":119.9079142,"test":[0.5230516841]}, -{"learn":[0.4294417107],"iteration":646,"passed_time":90.86536364,"remaining_time":119.7962213,"test":[0.5229983671]}, -{"learn":[0.4293799638],"iteration":647,"passed_time":90.9483344,"remaining_time":119.5802174,"test":[0.522962011]}, -{"learn":[0.429299809],"iteration":648,"passed_time":91.10175778,"remaining_time":119.4570044,"test":[0.5229696733]}, -{"learn":[0.429247332],"iteration":649,"passed_time":91.25457448,"remaining_time":119.3329051,"test":[0.5229587785]}, -{"learn":[0.4291443589],"iteration":650,"passed_time":91.41989603,"remaining_time":119.2250257,"test":[0.5229816058]}, -{"learn":[0.4290760623],"iteration":651,"passed_time":91.58534163,"remaining_time":119.1171314,"test":[0.5230001231]}, -{"learn":[0.4290398804],"iteration":652,"passed_time":91.7469538,"remaining_time":119.0040886,"test":[0.5230224316]}, -{"learn":[0.4290189635],"iteration":653,"passed_time":91.90578285,"remaining_time":118.8872971,"test":[0.5230725958]}, -{"learn":[0.4289683617],"iteration":654,"passed_time":92.06919205,"remaining_time":118.7762859,"test":[0.5230662904]}, -{"learn":[0.4289028381],"iteration":655,"passed_time":92.22686419,"remaining_time":118.6577338,"test":[0.5230620202]}, -{"learn":[0.4288822118],"iteration":656,"passed_time":92.38772376,"remaining_time":118.5431524,"test":[0.5230606235]}, -{"learn":[0.4288735493],"iteration":657,"passed_time":92.46469883,"remaining_time":118.3210888,"test":[0.5231221215]}, -{"learn":[0.4288645698],"iteration":658,"passed_time":92.58887111,"remaining_time":118.1596974,"test":[0.5231276687]}, -{"learn":[0.4288562506],"iteration":659,"passed_time":92.66020814,"remaining_time":117.931174,"test":[0.5231340939]}, -{"learn":[0.4288491727],"iteration":660,"passed_time":92.70387272,"remaining_time":117.6680018,"test":[0.5231017286]}, -{"learn":[0.4287641585],"iteration":661,"passed_time":92.86629495,"remaining_time":117.5558235,"test":[0.5231150179]}, -{"learn":[0.4286659656],"iteration":662,"passed_time":93.02184155,"remaining_time":117.4348135,"test":[0.523134054]}, -{"learn":[0.4285943941],"iteration":663,"passed_time":93.18396117,"remaining_time":117.3219752,"test":[0.5231242367]}, -{"learn":[0.4285142921],"iteration":664,"passed_time":93.34421469,"remaining_time":117.2066455,"test":[0.5231146588]}, -{"learn":[0.4283223432],"iteration":665,"passed_time":93.51313894,"remaining_time":117.1020389,"test":[0.5230887984]}, -{"learn":[0.4283110661],"iteration":666,"passed_time":93.67222492,"remaining_time":116.9849526,"test":[0.5230363595]}, -{"learn":[0.428259223],"iteration":667,"passed_time":93.83258878,"remaining_time":116.8693321,"test":[0.5230281783]}, -{"learn":[0.4282528581],"iteration":668,"passed_time":93.87190276,"remaining_time":116.6032155,"test":[0.5230341645]}, -{"learn":[0.4282018865],"iteration":669,"passed_time":94.03109354,"remaining_time":116.4862801,"test":[0.5230279389]}, -{"learn":[0.4281657839],"iteration":670,"passed_time":94.18489717,"remaining_time":116.362563,"test":[0.5230222321]}, -{"learn":[0.4280525636],"iteration":671,"passed_time":94.34035326,"remaining_time":116.2407924,"test":[0.5230373971]}, -{"learn":[0.4280197358],"iteration":672,"passed_time":94.49200697,"remaining_time":116.1142493,"test":[0.5229842796]}, -{"learn":[0.4279914769],"iteration":673,"passed_time":94.64191547,"remaining_time":115.9854928,"test":[0.5229610133]}, -{"learn":[0.427947504],"iteration":674,"passed_time":94.80034203,"remaining_time":115.8670847,"test":[0.5229801691]}, -{"learn":[0.4278836707],"iteration":675,"passed_time":94.9262489,"remaining_time":115.7089188,"test":[0.5229882305]}, -{"learn":[0.4278484396],"iteration":676,"passed_time":95.07302191,"remaining_time":115.5762142,"test":[0.5229999634]}, -{"learn":[0.4277037648],"iteration":677,"passed_time":95.23023514,"remaining_time":115.4561258,"test":[0.5230818146]}, -{"learn":[0.4276718878],"iteration":678,"passed_time":95.39109434,"remaining_time":115.3403365,"test":[0.523105879]}, -{"learn":[0.427630688],"iteration":679,"passed_time":95.55097554,"remaining_time":115.2232352,"test":[0.5230956227]}, -{"learn":[0.4275809577],"iteration":680,"passed_time":95.70520891,"remaining_time":115.099216,"test":[0.5230753096]}, -{"learn":[0.427435517],"iteration":681,"passed_time":95.85593326,"remaining_time":114.9708994,"test":[0.5231233587]}, -{"learn":[0.4274095558],"iteration":682,"passed_time":96.01148368,"remaining_time":114.8482901,"test":[0.5231295444]}, -{"learn":[0.4272571429],"iteration":683,"passed_time":96.16679077,"remaining_time":114.7252942,"test":[0.5231493387]}, -{"learn":[0.4270680727],"iteration":684,"passed_time":96.32364523,"remaining_time":114.604045,"test":[0.5231260724]}, -{"learn":[0.4269497024],"iteration":685,"passed_time":96.4534822,"remaining_time":114.4506334,"test":[0.523147902]}, -{"learn":[0.4269316643],"iteration":686,"passed_time":96.60890881,"remaining_time":114.3275733,"test":[0.5231435521]}, -{"learn":[0.426759206],"iteration":687,"passed_time":96.77120964,"remaining_time":114.2125323,"test":[0.5231175321]}, -{"learn":[0.4266562593],"iteration":688,"passed_time":96.93009788,"remaining_time":114.0933373,"test":[0.523061701]}, -{"learn":[0.4266057367],"iteration":689,"passed_time":97.08079239,"remaining_time":113.9644085,"test":[0.5230448997]}, -{"learn":[0.426553339],"iteration":690,"passed_time":97.23367091,"remaining_time":113.8379736,"test":[0.523096341]}, -{"learn":[0.426371109],"iteration":691,"passed_time":97.39478701,"remaining_time":113.7210808,"test":[0.5230544377]}, -{"learn":[0.4262375529],"iteration":692,"passed_time":97.54899775,"remaining_time":113.596019,"test":[0.5230272205]}, -{"learn":[0.4261506635],"iteration":693,"passed_time":97.71410083,"remaining_time":113.4835234,"test":[0.5229994845]}, -{"learn":[0.4260540816],"iteration":694,"passed_time":97.87363879,"remaining_time":113.3644305,"test":[0.5229731453]}, -{"learn":[0.4259921763],"iteration":695,"passed_time":97.9961566,"remaining_time":113.2024568,"test":[0.5230026772]}, -{"learn":[0.4259774394],"iteration":696,"passed_time":98.1527465,"remaining_time":113.07985,"test":[0.5229814063]}, -{"learn":[0.4259145833],"iteration":697,"passed_time":98.3100331,"remaining_time":112.9579463,"test":[0.523028338]}, -{"learn":[0.4258337418],"iteration":698,"passed_time":98.45921903,"remaining_time":112.8266587,"test":[0.52304047]}, -{"learn":[0.4257358394],"iteration":699,"passed_time":98.61246763,"remaining_time":112.699963,"test":[0.5231060786]}, -{"learn":[0.4257053357],"iteration":700,"passed_time":98.76372731,"remaining_time":112.5709246,"test":[0.5231529704]}, -{"learn":[0.4256336322],"iteration":701,"passed_time":98.91496051,"remaining_time":112.4417927,"test":[0.5231895659]}, -{"learn":[0.4255836113],"iteration":702,"passed_time":99.07427402,"remaining_time":112.3217587,"test":[0.5231717271]}, -{"learn":[0.4255506515],"iteration":703,"passed_time":99.22484298,"remaining_time":112.1917259,"test":[0.5231422351]}, -{"learn":[0.4254606193],"iteration":704,"passed_time":99.37207307,"remaining_time":112.0578696,"test":[0.5231952727]}, -{"learn":[0.4254141903],"iteration":705,"passed_time":99.5251199,"remaining_time":111.9305173,"test":[0.5232162643]}, -{"learn":[0.4253959409],"iteration":706,"passed_time":99.67810818,"remaining_time":111.8030266,"test":[0.5232099189]}, -{"learn":[0.4252997023],"iteration":707,"passed_time":99.73627895,"remaining_time":111.5693968,"test":[0.5232399297]}, -{"learn":[0.4252814265],"iteration":708,"passed_time":99.88756379,"remaining_time":111.4401452,"test":[0.5232366173]}, -{"learn":[0.4252647881],"iteration":709,"passed_time":100.0366089,"remaining_time":111.3083395,"test":[0.523207724]}, -{"learn":[0.4251700813],"iteration":710,"passed_time":100.1949576,"remaining_time":111.1868095,"test":[0.5232100387]}, -{"learn":[0.4250955783],"iteration":711,"passed_time":100.3623958,"remaining_time":111.0752358,"test":[0.5232050103]}, -{"learn":[0.4250570723],"iteration":712,"passed_time":100.5251024,"remaining_time":110.9582827,"test":[0.5231559634]}, -{"learn":[0.4250100359],"iteration":713,"passed_time":100.6854045,"remaining_time":110.8385545,"test":[0.5231209243]}, -{"learn":[0.4249343972],"iteration":714,"passed_time":100.8451533,"remaining_time":110.7181054,"test":[0.523134932]}, -{"learn":[0.4248776682],"iteration":715,"passed_time":100.9980359,"remaining_time":110.5900281,"test":[0.523104163]}, -{"learn":[0.4248694283],"iteration":716,"passed_time":101.0447291,"remaining_time":110.3459176,"test":[0.5230588276]}, -{"learn":[0.4247914655],"iteration":717,"passed_time":101.1973299,"remaining_time":110.2177047,"test":[0.5230664899]}, -{"learn":[0.4246726199],"iteration":718,"passed_time":101.3524558,"remaining_time":110.0921668,"test":[0.523046097]}, -{"learn":[0.4245407012],"iteration":719,"passed_time":101.5121669,"remaining_time":109.9715142,"test":[0.5229995245]}, -{"learn":[0.4244753625],"iteration":720,"passed_time":101.6662568,"remaining_time":109.8446797,"test":[0.5229938974]}, -{"learn":[0.4243575469],"iteration":721,"passed_time":101.8314337,"remaining_time":109.7297166,"test":[0.5230073065]}, -{"learn":[0.4242633155],"iteration":722,"passed_time":101.9983387,"remaining_time":109.6164719,"test":[0.5230225513]}, -{"learn":[0.424240233],"iteration":723,"passed_time":102.1587462,"remaining_time":109.4961147,"test":[0.5230371177]}, -{"learn":[0.4241992709],"iteration":724,"passed_time":102.3173171,"remaining_time":109.3736838,"test":[0.5229844792]}, -{"learn":[0.4241074956],"iteration":725,"passed_time":102.4771026,"remaining_time":109.2524482,"test":[0.5229836012]}, -{"learn":[0.4240404931],"iteration":726,"passed_time":102.5325755,"remaining_time":109.0201938,"test":[0.522949879]}, -{"learn":[0.42393031],"iteration":727,"passed_time":102.6913341,"remaining_time":108.8979532,"test":[0.5229589381]}, -{"learn":[0.4239178708],"iteration":728,"passed_time":102.8530763,"remaining_time":108.778768,"test":[0.5229379466]}, -{"learn":[0.4239140149],"iteration":729,"passed_time":102.8856279,"remaining_time":108.5231965,"test":[0.522936869]}, -{"learn":[0.4239044809],"iteration":730,"passed_time":103.0424051,"remaining_time":108.3989186,"test":[0.5229897071]}, -{"learn":[0.4238038318],"iteration":731,"passed_time":103.198447,"remaining_time":108.2737804,"test":[0.5229662812]}, -{"learn":[0.4237197683],"iteration":732,"passed_time":103.3547603,"remaining_time":108.1488419,"test":[0.5229319604]}, -{"learn":[0.4236491476],"iteration":733,"passed_time":103.5192396,"remaining_time":108.03234,"test":[0.5228941277]}, -{"learn":[0.4235076684],"iteration":734,"passed_time":103.6693174,"remaining_time":107.9007181,"test":[0.5229171944]}, -{"learn":[0.4234852462],"iteration":735,"passed_time":103.8240706,"remaining_time":107.7738994,"test":[0.5229341154]}, -{"learn":[0.4233596396],"iteration":736,"passed_time":103.9933131,"remaining_time":107.6620053,"test":[0.5229717486]}, -{"learn":[0.4233348933],"iteration":737,"passed_time":104.1524321,"remaining_time":107.539503,"test":[0.5230099005]}, -{"learn":[0.4232898376],"iteration":738,"passed_time":104.1914645,"remaining_time":107.2932402,"test":[0.5230262228]}, -{"learn":[0.4232752064],"iteration":739,"passed_time":104.3460188,"remaining_time":107.1661815,"test":[0.5230276994]}, -{"learn":[0.4232446762],"iteration":740,"passed_time":104.4959006,"remaining_time":107.0342626,"test":[0.5230006818]}, -{"learn":[0.4231698827],"iteration":741,"passed_time":104.6490588,"remaining_time":106.9056423,"test":[0.5230676473]}, -{"learn":[0.4231612202],"iteration":742,"passed_time":104.6997432,"remaining_time":106.6725513,"test":[0.5230670486]}, -{"learn":[0.4231252232],"iteration":743,"passed_time":104.8548946,"remaining_time":106.5461026,"test":[0.523074671]}, -{"learn":[0.4230553683],"iteration":744,"passed_time":105.0102054,"remaining_time":106.4197383,"test":[0.5230351622]}, -{"learn":[0.4229820274],"iteration":745,"passed_time":105.1673939,"remaining_time":106.2951944,"test":[0.5230237885]}, -{"learn":[0.4228979903],"iteration":746,"passed_time":105.3250148,"remaining_time":106.1709988,"test":[0.5229994446]}, -{"learn":[0.4228754889],"iteration":747,"passed_time":105.4778365,"remaining_time":106.0418891,"test":[0.5229985268]}, -{"learn":[0.4228285316],"iteration":748,"passed_time":105.6415714,"remaining_time":105.9236584,"test":[0.5229915828]}, -{"learn":[0.422737892],"iteration":749,"passed_time":105.7905148,"remaining_time":105.7905148,"test":[0.5230296948]}, -{"learn":[0.4227054339],"iteration":750,"passed_time":105.9507098,"remaining_time":105.6685508,"test":[0.5230588276]}, -{"learn":[0.42266088],"iteration":751,"passed_time":106.1120236,"remaining_time":105.5475979,"test":[0.5230658913]}, -{"learn":[0.4226499462],"iteration":752,"passed_time":106.1508071,"remaining_time":105.3049839,"test":[0.5231012098]}, -{"learn":[0.4226380881],"iteration":753,"passed_time":106.303048,"remaining_time":105.1751642,"test":[0.5231081538]}, -{"learn":[0.4226201028],"iteration":754,"passed_time":106.4619569,"remaining_time":105.0518648,"test":[0.5231254339]}, -{"learn":[0.4224594235],"iteration":755,"passed_time":106.6163209,"remaining_time":104.9239983,"test":[0.5231013694]}, -{"learn":[0.4223844715],"iteration":756,"passed_time":106.7738774,"remaining_time":104.7991954,"test":[0.5230952635]}, -{"learn":[0.4222138884],"iteration":757,"passed_time":106.9327943,"remaining_time":104.6756377,"test":[0.5230354815]}, -{"learn":[0.4222038789],"iteration":758,"passed_time":107.0894599,"remaining_time":104.5497889,"test":[0.5230115367]}, -{"learn":[0.4221771518],"iteration":759,"passed_time":107.1284937,"remaining_time":104.3093228,"test":[0.5230215935]}, -{"learn":[0.4220064631],"iteration":760,"passed_time":107.2900952,"remaining_time":104.1884105,"test":[0.5229917424]}, -{"learn":[0.421896861],"iteration":761,"passed_time":107.4498033,"remaining_time":104.0655576,"test":[0.5229803687]}, -{"learn":[0.4217953404],"iteration":762,"passed_time":107.6036645,"remaining_time":103.9369603,"test":[0.5229469258]}, -{"learn":[0.4217521334],"iteration":763,"passed_time":107.6367747,"remaining_time":103.6919715,"test":[0.5229724669]}, -{"learn":[0.4217373437],"iteration":764,"passed_time":107.7880944,"remaining_time":103.5611103,"test":[0.5229621308]}, -{"learn":[0.4217011882],"iteration":765,"passed_time":107.9440895,"remaining_time":103.4346758,"test":[0.5229747416]}, -{"learn":[0.4214749854],"iteration":766,"passed_time":108.1099677,"remaining_time":103.3176093,"test":[0.5229474047]}, -{"learn":[0.4213856134],"iteration":767,"passed_time":108.2672998,"remaining_time":103.1922702,"test":[0.5230021983]}, -{"learn":[0.421343727],"iteration":768,"passed_time":108.4260903,"remaining_time":103.0682341,"test":[0.5230609826]}, -{"learn":[0.4212649983],"iteration":769,"passed_time":108.591273,"remaining_time":102.9501679,"test":[0.5230393126]}, -{"learn":[0.4212258321],"iteration":770,"passed_time":108.6263813,"remaining_time":102.7089909,"test":[0.5230386342]}, -{"learn":[0.4211926873],"iteration":771,"passed_time":108.7755726,"remaining_time":102.5759285,"test":[0.523093308]}, -{"learn":[0.4211249982],"iteration":772,"passed_time":108.9282081,"remaining_time":102.4460638,"test":[0.5230694032]}, -{"learn":[0.4210057035],"iteration":773,"passed_time":109.0850233,"remaining_time":102.3200607,"test":[0.5230376365]}, -{"learn":[0.4209475748],"iteration":774,"passed_time":109.2498042,"remaining_time":102.2014297,"test":[0.5230461369]}, -{"learn":[0.420885062],"iteration":775,"passed_time":109.4101806,"remaining_time":102.0785706,"test":[0.523011856]}, -{"learn":[0.420796456],"iteration":776,"passed_time":109.5650202,"remaining_time":101.9504628,"test":[0.5229602152]}, -{"learn":[0.4207291365],"iteration":777,"passed_time":109.712259,"remaining_time":101.8152326,"test":[0.522962889]}, -{"learn":[0.4206566143],"iteration":778,"passed_time":109.8665646,"remaining_time":101.6865123,"test":[0.5229640862]}, -{"learn":[0.4206186101],"iteration":779,"passed_time":110.0182734,"remaining_time":101.5553293,"test":[0.5229567033]}, -{"learn":[0.4205757728],"iteration":780,"passed_time":110.1684901,"remaining_time":101.4227201,"test":[0.5229410594]}, -{"learn":[0.4205614321],"iteration":781,"passed_time":110.3227163,"remaining_time":101.2937471,"test":[0.5229302842]}, -{"learn":[0.4205344673],"iteration":782,"passed_time":110.4801316,"remaining_time":101.1676301,"test":[0.5229431346]}, -{"learn":[0.4204987872],"iteration":783,"passed_time":110.6320721,"remaining_time":101.0364332,"test":[0.5229212651]}, -{"learn":[0.4204069856],"iteration":784,"passed_time":110.7882103,"remaining_time":100.9090068,"test":[0.5228461185]}, -{"learn":[0.4203492002],"iteration":785,"passed_time":110.9487244,"remaining_time":100.7854825,"test":[0.5228515459]}, -{"learn":[0.4202999189],"iteration":786,"passed_time":111.0962538,"remaining_time":100.6501003,"test":[0.5228425268]}, -{"learn":[0.4202198433],"iteration":787,"passed_time":111.2570215,"remaining_time":100.5266489,"test":[0.52285845]}, -{"learn":[0.4201142292],"iteration":788,"passed_time":111.4157483,"remaining_time":100.4012636,"test":[0.5228225728]}, -{"learn":[0.4200955572],"iteration":789,"passed_time":111.570671,"remaining_time":100.2723752,"test":[0.5228387355]}, -{"learn":[0.4200499469],"iteration":790,"passed_time":111.7229211,"remaining_time":100.1410253,"test":[0.5228225728]}, -{"learn":[0.4200050496],"iteration":791,"passed_time":111.7921547,"remaining_time":99.93541103,"test":[0.52284544]}, -{"learn":[0.4199278792],"iteration":792,"passed_time":111.95854,"remaining_time":99.81675635,"test":[0.5228669903]}, -{"learn":[0.4198836686],"iteration":793,"passed_time":112.116238,"remaining_time":99.69025695,"test":[0.5228642766]}, -{"learn":[0.4198192279],"iteration":794,"passed_time":112.1561852,"remaining_time":99.4592586,"test":[0.522829437]}, -{"learn":[0.4196765074],"iteration":795,"passed_time":112.3123391,"remaining_time":99.33151599,"test":[0.5228370993]}, -{"learn":[0.4195982278],"iteration":796,"passed_time":112.4792673,"remaining_time":99.21320567,"test":[0.5228472758]}, -{"learn":[0.4195228004],"iteration":797,"passed_time":112.6348201,"remaining_time":99.08476654,"test":[0.5228739742]}, -{"learn":[0.4195053433],"iteration":798,"passed_time":112.7916972,"remaining_time":98.95742146,"test":[0.5228439235]}, -{"learn":[0.4194624532],"iteration":799,"passed_time":112.9443479,"remaining_time":98.8263044,"test":[0.5228508675]}, -{"learn":[0.4193548847],"iteration":800,"passed_time":113.1112944,"remaining_time":98.70760893,"test":[0.5228592881]}, -{"learn":[0.4192917645],"iteration":801,"passed_time":113.2628541,"remaining_time":98.57540174,"test":[0.5228722981]}, -{"learn":[0.419209761],"iteration":802,"passed_time":113.4131953,"remaining_time":98.44208855,"test":[0.5228228522]}, -{"learn":[0.4191837206],"iteration":803,"passed_time":113.5659351,"remaining_time":98.31080948,"test":[0.5228357025]}, -{"learn":[0.4191599779],"iteration":804,"passed_time":113.7175014,"remaining_time":98.17846398,"test":[0.522820338]}, -{"learn":[0.4190924207],"iteration":805,"passed_time":113.7525881,"remaining_time":97.94577681,"test":[0.5228370594]}, -{"learn":[0.4190169933],"iteration":806,"passed_time":113.9073481,"remaining_time":97.81634722,"test":[0.5228353433]}, -{"learn":[0.4188821432],"iteration":807,"passed_time":114.0632359,"remaining_time":97.68782084,"test":[0.5228897378]}, -{"learn":[0.4188419469],"iteration":808,"passed_time":114.2237052,"remaining_time":97.56314002,"test":[0.5229236994]}, -{"learn":[0.4188101227],"iteration":809,"passed_time":114.3749895,"remaining_time":97.43054658,"test":[0.5229183917]}, -{"learn":[0.4187462366],"iteration":810,"passed_time":114.5391561,"remaining_time":97.30885151,"test":[0.5229202674]}, -{"learn":[0.4186743217],"iteration":811,"passed_time":114.690609,"remaining_time":97.17627957,"test":[0.522899196]}, -{"learn":[0.4185873003],"iteration":812,"passed_time":114.8396752,"remaining_time":97.0416444,"test":[0.5229074569]}, -{"learn":[0.4184733405],"iteration":813,"passed_time":115.0028595,"remaining_time":96.9188718,"test":[0.522961572]}, -{"learn":[0.418273046],"iteration":814,"passed_time":115.1678242,"remaining_time":96.79749643,"test":[0.5229805682]}, -{"learn":[0.4182632479],"iteration":815,"passed_time":115.3189236,"remaining_time":96.66439183,"test":[0.5229783733]}, -{"learn":[0.4182081035],"iteration":816,"passed_time":115.4781547,"remaining_time":96.5380412,"test":[0.5229669995]}, -{"learn":[0.4181965887],"iteration":817,"passed_time":115.5475335,"remaining_time":96.33669667,"test":[0.5229556258]}, -{"learn":[0.4180534457],"iteration":818,"passed_time":115.7131084,"remaining_time":96.21566159,"test":[0.5229359113]}, -{"learn":[0.4179831947],"iteration":819,"passed_time":115.8781481,"remaining_time":96.09407402,"test":[0.5229794508]}, -{"learn":[0.4179211309],"iteration":820,"passed_time":116.0385267,"remaining_time":95.96852573,"test":[0.5229653633]}, -{"learn":[0.4178890425],"iteration":821,"passed_time":116.1102472,"remaining_time":95.76976592,"test":[0.5229602152]}, -{"learn":[0.41782822],"iteration":822,"passed_time":116.1552571,"remaining_time":95.54934272,"test":[0.5229697532]}, -{"learn":[0.417766341],"iteration":823,"passed_time":116.3093432,"remaining_time":95.41883009,"test":[0.52299278]}, -{"learn":[0.4176146147],"iteration":824,"passed_time":116.4663868,"remaining_time":95.29068014,"test":[0.5230005222]}, -{"learn":[0.4175319246],"iteration":825,"passed_time":116.630987,"remaining_time":95.16862623,"test":[0.5229960924]}, -{"learn":[0.4175083403],"iteration":826,"passed_time":116.7869921,"remaining_time":95.03947486,"test":[0.5229922612]}, -{"learn":[0.4174706002],"iteration":827,"passed_time":116.9390632,"remaining_time":94.90706581,"test":[0.5229859558]} +{"learn":[0.6887420255],"iteration":0,"passed_time":0.01804414597,"remaining_time":13.51506533,"test":[0.6896417545]}, +{"learn":[0.6845313601],"iteration":1,"passed_time":0.03203398998,"remaining_time":11.98071225,"test":[0.6858873323]}, +{"learn":[0.6801631898],"iteration":2,"passed_time":0.04596774737,"remaining_time":11.4459691,"test":[0.6828681305]}, +{"learn":[0.6760074248],"iteration":3,"passed_time":0.05879496276,"remaining_time":10.96526056,"test":[0.6795196794]}, +{"learn":[0.6720347848],"iteration":4,"passed_time":0.07280487432,"remaining_time":10.84792627,"test":[0.6760484233]}, +{"learn":[0.6680466053],"iteration":5,"passed_time":0.08637991245,"remaining_time":10.71110914,"test":[0.6726388417]}, +{"learn":[0.6640517926],"iteration":6,"passed_time":0.1013921494,"remaining_time":10.76205243,"test":[0.6695189293]}, +{"learn":[0.6603452074],"iteration":7,"passed_time":0.1149324024,"remaining_time":10.65998032,"test":[0.6662672616]}, +{"learn":[0.6565538878],"iteration":8,"passed_time":0.1298425027,"remaining_time":10.69036606,"test":[0.6632470241]}, +{"learn":[0.6528791074],"iteration":9,"passed_time":0.1437581617,"remaining_time":10.63810397,"test":[0.6598664355]}, +{"learn":[0.6494508161],"iteration":10,"passed_time":0.1569065005,"remaining_time":10.54126399,"test":[0.656835941]}, +{"learn":[0.6458923403],"iteration":11,"passed_time":0.1709182074,"remaining_time":10.51146975,"test":[0.6539295768]}, +{"learn":[0.6424301163],"iteration":12,"passed_time":0.1848957209,"remaining_time":10.4821651,"test":[0.6519104307]}, +{"learn":[0.6391311215],"iteration":13,"passed_time":0.1981592962,"remaining_time":10.41751729,"test":[0.6488938206]}, +{"learn":[0.6357000076],"iteration":14,"passed_time":0.2126995905,"remaining_time":10.42227993,"test":[0.6461647091]}, +{"learn":[0.6325054691],"iteration":15,"passed_time":0.2276409917,"remaining_time":10.44303049,"test":[0.6433344152]}, +{"learn":[0.6294132342],"iteration":16,"passed_time":0.2429397644,"remaining_time":10.47499102,"test":[0.6406067379]}, +{"learn":[0.626404362],"iteration":17,"passed_time":0.2574038783,"remaining_time":10.46775772,"test":[0.6379567909]}, +{"learn":[0.62343153],"iteration":18,"passed_time":0.2711751071,"remaining_time":10.43310544,"test":[0.6353546473]}, +{"learn":[0.6205350324],"iteration":19,"passed_time":0.2861563741,"remaining_time":10.44470765,"test":[0.6332076443]}, +{"learn":[0.6176066],"iteration":20,"passed_time":0.3000709367,"remaining_time":10.41674823,"test":[0.6309091761]}, +{"learn":[0.614649737],"iteration":21,"passed_time":0.3131899072,"remaining_time":10.36373875,"test":[0.6289467444]}, +{"learn":[0.6116950647],"iteration":22,"passed_time":0.3258059855,"remaining_time":10.29830224,"test":[0.626679484]}, +{"learn":[0.6089795787],"iteration":23,"passed_time":0.3398864882,"remaining_time":10.28156627,"test":[0.6243728367]}, +{"learn":[0.6062858885],"iteration":24,"passed_time":0.3524894666,"remaining_time":10.22219453,"test":[0.6224695987]}, +{"learn":[0.60352147],"iteration":25,"passed_time":0.3655289065,"remaining_time":10.17857417,"test":[0.6209035181]}, +{"learn":[0.6009605704],"iteration":26,"passed_time":0.3785956448,"remaining_time":10.13795004,"test":[0.6190830756]}, +{"learn":[0.5983309886],"iteration":27,"passed_time":0.39114241,"remaining_time":10.08588643,"test":[0.6173556415]}, +{"learn":[0.5959595359],"iteration":28,"passed_time":0.4039221566,"remaining_time":10.04234051,"test":[0.6151956276]}, +{"learn":[0.5936561858],"iteration":29,"passed_time":0.4163592913,"remaining_time":9.992622992,"test":[0.6131745353]}, +{"learn":[0.5912893384],"iteration":30,"passed_time":0.4298730032,"remaining_time":9.9702803,"test":[0.6111064608]}, +{"learn":[0.5888712298],"iteration":31,"passed_time":0.4445622353,"remaining_time":9.974865155,"test":[0.6096385122]}, +{"learn":[0.5865368562],"iteration":32,"passed_time":0.4582007535,"remaining_time":9.955452735,"test":[0.6075520668]}, +{"learn":[0.5843027111],"iteration":33,"passed_time":0.4707278083,"remaining_time":9.912973846,"test":[0.6057553537]}, +{"learn":[0.58219542],"iteration":34,"passed_time":0.4834990333,"remaining_time":9.877194537,"test":[0.6041746671]}, +{"learn":[0.5801054968],"iteration":35,"passed_time":0.4969806542,"remaining_time":9.856782974,"test":[0.60218203]}, +{"learn":[0.5779997103],"iteration":36,"passed_time":0.5107543138,"remaining_time":9.842373668,"test":[0.6002628452]}, +{"learn":[0.5759875314],"iteration":37,"passed_time":0.5289360733,"remaining_time":9.910591689,"test":[0.5984350295]}, +{"learn":[0.5740081792],"iteration":38,"passed_time":0.5465434415,"remaining_time":9.963907357,"test":[0.5966827053]}, +{"learn":[0.5719981747],"iteration":39,"passed_time":0.5627243321,"remaining_time":9.988356894,"test":[0.5951582939]}, +{"learn":[0.5701013987],"iteration":40,"passed_time":0.5817450339,"remaining_time":10.05993241,"test":[0.593386988]}, +{"learn":[0.5682769473],"iteration":41,"passed_time":0.5965553463,"remaining_time":10.05621869,"test":[0.5917648301]}, +{"learn":[0.5665753932],"iteration":42,"passed_time":0.6089802437,"remaining_time":10.01276819,"test":[0.5901367283]}, +{"learn":[0.5649332763],"iteration":43,"passed_time":0.6221825123,"remaining_time":9.98320122,"test":[0.5885996156]}, +{"learn":[0.5631859614],"iteration":44,"passed_time":0.6353206935,"remaining_time":9.953357531,"test":[0.5872656267]}, +{"learn":[0.5613679298],"iteration":45,"passed_time":0.6483750264,"remaining_time":9.922956927,"test":[0.5862677986]}, +{"learn":[0.5595688223],"iteration":46,"passed_time":0.6616737137,"remaining_time":9.896949377,"test":[0.584659469]}, +{"learn":[0.5577250902],"iteration":47,"passed_time":0.674828603,"remaining_time":9.869368318,"test":[0.5833478591]}, +{"learn":[0.5561233393],"iteration":48,"passed_time":0.6877782831,"remaining_time":9.839440336,"test":[0.5819510783]}, +{"learn":[0.554371619],"iteration":49,"passed_time":0.7009375898,"remaining_time":9.813126257,"test":[0.5806539316]}, +{"learn":[0.5526478209],"iteration":50,"passed_time":0.7138744735,"remaining_time":9.784279548,"test":[0.5796116099]}, +{"learn":[0.5510913668],"iteration":51,"passed_time":0.72698824,"remaining_time":9.758419067,"test":[0.5787501468]}, +{"learn":[0.5495930483],"iteration":52,"passed_time":0.7405642978,"remaining_time":9.739119162,"test":[0.5774874145]}, +{"learn":[0.5479230842],"iteration":53,"passed_time":0.7538322374,"remaining_time":9.716059949,"test":[0.576237014]}, +{"learn":[0.5465057255],"iteration":54,"passed_time":0.7664566901,"remaining_time":9.685225448,"test":[0.5754096805]}, +{"learn":[0.5450050095],"iteration":55,"passed_time":0.7795948547,"remaining_time":9.661407663,"test":[0.5743359531]}, +{"learn":[0.5435639391],"iteration":56,"passed_time":0.7926379621,"remaining_time":9.636808907,"test":[0.573221358]}, +{"learn":[0.5420243158],"iteration":57,"passed_time":0.8061019462,"remaining_time":9.617630116,"test":[0.5722218253]}, +{"learn":[0.5407417848],"iteration":58,"passed_time":0.8203102894,"remaining_time":9.607362881,"test":[0.5711244713]}, +{"learn":[0.5393912145],"iteration":59,"passed_time":0.8333563288,"remaining_time":9.583597781,"test":[0.5700800859]}, +{"learn":[0.5381304083],"iteration":60,"passed_time":0.8462684377,"remaining_time":9.55867137,"test":[0.5690296618]}, +{"learn":[0.5368665922],"iteration":61,"passed_time":0.8597185105,"remaining_time":9.540102181,"test":[0.5681036628]}, +{"learn":[0.5355829807],"iteration":62,"passed_time":0.8731297829,"remaining_time":9.521272395,"test":[0.5668771486]}, +{"learn":[0.5343600623],"iteration":63,"passed_time":0.8860406421,"remaining_time":9.497248132,"test":[0.5658750266]}, +{"learn":[0.5331252354],"iteration":64,"passed_time":0.90752056,"remaining_time":9.563870517,"test":[0.5647810385]}, +{"learn":[0.5318046511],"iteration":65,"passed_time":0.9208271072,"remaining_time":9.543117293,"test":[0.5637613867]}, +{"learn":[0.5306063092],"iteration":66,"passed_time":0.935745614,"remaining_time":9.539018722,"test":[0.5628814505]}, +{"learn":[0.529392964],"iteration":67,"passed_time":0.9495925195,"remaining_time":9.523854386,"test":[0.5618462888]}, +{"learn":[0.5281617397],"iteration":68,"passed_time":0.9616517525,"remaining_time":9.491084688,"test":[0.5609182118]}, +{"learn":[0.5270139084],"iteration":69,"passed_time":0.9744135538,"remaining_time":9.465731665,"test":[0.5597978434]}, +{"learn":[0.5259682808],"iteration":70,"passed_time":0.9881333865,"remaining_time":9.449895344,"test":[0.5588862561]}, +{"learn":[0.524819647],"iteration":71,"passed_time":1.007667865,"remaining_time":9.488872396,"test":[0.5578589608]}, +{"learn":[0.5237458663],"iteration":72,"passed_time":1.020981851,"remaining_time":9.468557712,"test":[0.5572179217]}, +{"learn":[0.5226796548],"iteration":73,"passed_time":1.033580852,"remaining_time":9.441900753,"test":[0.5563541846]}, +{"learn":[0.5217408877],"iteration":74,"passed_time":1.046715377,"remaining_time":9.420438397,"test":[0.5555627272]}, +{"learn":[0.5206912763],"iteration":75,"passed_time":1.059180653,"remaining_time":9.393260002,"test":[0.5547037302]}, +{"learn":[0.5196831057],"iteration":76,"passed_time":1.071945478,"remaining_time":9.369081902,"test":[0.5538640325]}, +{"learn":[0.5185980704],"iteration":77,"passed_time":1.084777255,"remaining_time":9.345773274,"test":[0.5531438474]}, +{"learn":[0.5175740292],"iteration":78,"passed_time":1.098249148,"remaining_time":9.328166817,"test":[0.552589933]}, +{"learn":[0.5165824105],"iteration":79,"passed_time":1.116237072,"remaining_time":9.348485474,"test":[0.5517910907]}, +{"learn":[0.5156979463],"iteration":80,"passed_time":1.129793546,"remaining_time":9.331257809,"test":[0.5509343071]}, +{"learn":[0.5147492197],"iteration":81,"passed_time":1.143185426,"remaining_time":9.312778833,"test":[0.5503428857]}, +{"learn":[0.5138594048],"iteration":82,"passed_time":1.157682251,"remaining_time":9.303301949,"test":[0.5496760217]}, +{"learn":[0.5129413884],"iteration":83,"passed_time":1.176540465,"remaining_time":9.328285115,"test":[0.5488706367]}, +{"learn":[0.5118771264],"iteration":84,"passed_time":1.191436725,"remaining_time":9.321240263,"test":[0.5480229027]}, +{"learn":[0.5109928968],"iteration":85,"passed_time":1.204840707,"remaining_time":9.302491043,"test":[0.5473412659]}, +{"learn":[0.5101972566],"iteration":86,"passed_time":1.218820097,"remaining_time":9.288249708,"test":[0.5468603594]}, +{"learn":[0.509304983],"iteration":87,"passed_time":1.233195037,"remaining_time":9.276989938,"test":[0.5460639568]}, +{"learn":[0.508403116],"iteration":88,"passed_time":1.246792008,"remaining_time":9.259882214,"test":[0.5454199851]}, +{"learn":[0.5076756068],"iteration":89,"passed_time":1.260392407,"remaining_time":9.24287765,"test":[0.5447470209]}, +{"learn":[0.5067898705],"iteration":90,"passed_time":1.274074264,"remaining_time":9.226537801,"test":[0.5442183819]}, +{"learn":[0.5059787727],"iteration":91,"passed_time":1.286392567,"remaining_time":9.200503359,"test":[0.5435976914]}, +{"learn":[0.5052218222],"iteration":92,"passed_time":1.300155697,"remaining_time":9.184970892,"test":[0.5429848788]}, +{"learn":[0.5045131307],"iteration":93,"passed_time":1.31322947,"remaining_time":9.164665236,"test":[0.5423718637]}, +{"learn":[0.5037981856],"iteration":94,"passed_time":1.326468033,"remaining_time":9.145648018,"test":[0.5416752261]}, +{"learn":[0.5031235205],"iteration":95,"passed_time":1.340289433,"remaining_time":9.130721765,"test":[0.5411359818]}, +{"learn":[0.502355264],"iteration":96,"passed_time":1.355219421,"remaining_time":9.123281255,"test":[0.5405827938]}, +{"learn":[0.5016398252],"iteration":97,"passed_time":1.368982414,"remaining_time":9.107923818,"test":[0.540020827]}, +{"learn":[0.5009112756],"iteration":98,"passed_time":1.381997263,"remaining_time":9.087678975,"test":[0.5394152906]}, +{"learn":[0.5002412868],"iteration":99,"passed_time":1.395438185,"remaining_time":9.070348204,"test":[0.53888085]}, +{"learn":[0.499602125],"iteration":100,"passed_time":1.408658522,"remaining_time":9.051677037,"test":[0.5382957048]}, +{"learn":[0.4989857252],"iteration":101,"passed_time":1.421546716,"remaining_time":9.031002668,"test":[0.5377235888]}, +{"learn":[0.4982754047],"iteration":102,"passed_time":1.434710866,"remaining_time":9.012212916,"test":[0.5374353369]}, +{"learn":[0.4976294442],"iteration":103,"passed_time":1.509475094,"remaining_time":9.376162601,"test":[0.5368588103]}, +{"learn":[0.4969524754],"iteration":104,"passed_time":1.558267692,"remaining_time":9.572215821,"test":[0.5364236399]}, +{"learn":[0.4962424857],"iteration":105,"passed_time":1.571701889,"remaining_time":9.548830342,"test":[0.5358894587]}, +{"learn":[0.4956216184],"iteration":106,"passed_time":1.584924334,"remaining_time":9.524358379,"test":[0.5353011898]}, +{"learn":[0.4949101095],"iteration":107,"passed_time":1.597294699,"remaining_time":9.495029602,"test":[0.534801427]}, +{"learn":[0.4942124723],"iteration":108,"passed_time":1.610005692,"remaining_time":9.468015124,"test":[0.5346321342]}, +{"learn":[0.4936275048],"iteration":109,"passed_time":1.623739483,"remaining_time":9.447211537,"test":[0.5340956682]}, +{"learn":[0.4930498818],"iteration":110,"passed_time":1.637878827,"remaining_time":9.428870002,"test":[0.5337286666]}, +{"learn":[0.4925428568],"iteration":111,"passed_time":1.654825719,"remaining_time":9.426596504,"test":[0.5332564969]}, +{"learn":[0.491967713],"iteration":112,"passed_time":1.667744538,"remaining_time":9.40135638,"test":[0.5328407907]}, +{"learn":[0.4914833541],"iteration":113,"passed_time":1.680500193,"remaining_time":9.375422129,"test":[0.5323426945]}, +{"learn":[0.4908770705],"iteration":114,"passed_time":1.693797183,"remaining_time":9.352706185,"test":[0.5321336397]}, +{"learn":[0.4902524062],"iteration":115,"passed_time":1.706341184,"remaining_time":9.326037162,"test":[0.5316088774]}, +{"learn":[0.4896965752],"iteration":116,"passed_time":1.720894126,"remaining_time":9.310478475,"test":[0.5310718135]}, +{"learn":[0.4892062558],"iteration":117,"passed_time":1.735421879,"remaining_time":9.294801928,"test":[0.5306840323]}, +{"learn":[0.488655007],"iteration":118,"passed_time":1.748427678,"remaining_time":9.271074494,"test":[0.5303267025]}, +{"learn":[0.4880496918],"iteration":119,"passed_time":1.762137989,"remaining_time":9.25122444,"test":[0.5300458333]}, +{"learn":[0.4873278203],"iteration":120,"passed_time":1.776382101,"remaining_time":9.234250754,"test":[0.5297756775]}, +{"learn":[0.4865669175],"iteration":121,"passed_time":1.78917061,"remaining_time":9.20982904,"test":[0.5296601881]}, +{"learn":[0.4859760729],"iteration":122,"passed_time":1.801288592,"remaining_time":9.182178432,"test":[0.5292836496]}, +{"learn":[0.4854961709],"iteration":123,"passed_time":1.814615295,"remaining_time":9.160880442,"test":[0.5288159606]}, +{"learn":[0.4849485532],"iteration":124,"passed_time":1.8292018,"remaining_time":9.146008999,"test":[0.5284746863]}, +{"learn":[0.4843656862],"iteration":125,"passed_time":1.843025578,"remaining_time":9.127364769,"test":[0.5282877626]}, +{"learn":[0.4838616276],"iteration":126,"passed_time":1.855872276,"remaining_time":9.104003371,"test":[0.5279071266]}, +{"learn":[0.4833659572],"iteration":127,"passed_time":1.868400937,"remaining_time":9.079260801,"test":[0.5276545487]}, +{"learn":[0.4828076399],"iteration":128,"passed_time":1.881744615,"remaining_time":9.058631055,"test":[0.5274332113]}, +{"learn":[0.482390817],"iteration":129,"passed_time":1.894292965,"remaining_time":9.034320297,"test":[0.5270451469]}, +{"learn":[0.4817595219],"iteration":130,"passed_time":1.908369149,"remaining_time":9.017408421,"test":[0.5265970833]}, +{"learn":[0.4812195403],"iteration":131,"passed_time":1.921785917,"remaining_time":8.997452247,"test":[0.5264975461]}, +{"learn":[0.4807913452],"iteration":132,"passed_time":1.933861317,"remaining_time":8.971371672,"test":[0.5261332448]}, +{"learn":[0.4803108667],"iteration":133,"passed_time":1.946286339,"remaining_time":8.947107348,"test":[0.5258860921]}, +{"learn":[0.4798747699],"iteration":134,"passed_time":1.959260031,"remaining_time":8.92551792,"test":[0.525562179]}, +{"learn":[0.4794247267],"iteration":135,"passed_time":1.972244634,"remaining_time":8.904104449,"test":[0.5252651319]}, +{"learn":[0.4789737946],"iteration":136,"passed_time":1.984866172,"remaining_time":8.881189514,"test":[0.5249835738]}, +{"learn":[0.4786100041],"iteration":137,"passed_time":1.997152995,"remaining_time":8.856939369,"test":[0.5246205567]}, +{"learn":[0.4781338325],"iteration":138,"passed_time":2.009747141,"remaining_time":8.834212251,"test":[0.524321262]}, +{"learn":[0.4777144694],"iteration":139,"passed_time":2.022102514,"remaining_time":8.810589526,"test":[0.5242551609]}, +{"learn":[0.4772253587],"iteration":140,"passed_time":2.036388832,"remaining_time":8.795466659,"test":[0.5239585031]}, +{"learn":[0.4768021942],"iteration":141,"passed_time":2.049378239,"remaining_time":8.774802601,"test":[0.5236089923]}, +{"learn":[0.476388262],"iteration":142,"passed_time":2.062559503,"remaining_time":8.755060268,"test":[0.5234188197]}, +{"learn":[0.4759714004],"iteration":143,"passed_time":2.076252011,"remaining_time":8.737560548,"test":[0.5231108175]}, +{"learn":[0.475431571],"iteration":144,"passed_time":2.089318096,"remaining_time":8.717499642,"test":[0.5228370372]}, +{"learn":[0.4749809065],"iteration":145,"passed_time":2.108164229,"remaining_time":8.721446537,"test":[0.5227192333]}, +{"learn":[0.4745393871],"iteration":146,"passed_time":2.129382744,"remaining_time":8.734814931,"test":[0.5225125724]}, +{"learn":[0.474003352],"iteration":147,"passed_time":2.14890893,"remaining_time":8.74083227,"test":[0.5225302806]}, +{"learn":[0.4735373498],"iteration":148,"passed_time":2.168538227,"remaining_time":8.746922648,"test":[0.5223917842]}, +{"learn":[0.4731374872],"iteration":149,"passed_time":2.188281992,"remaining_time":8.753127967,"test":[0.5221227076]}, +{"learn":[0.4728223679],"iteration":150,"passed_time":2.208122621,"remaining_time":8.759373841,"test":[0.5219168207]}, +{"learn":[0.4724526018],"iteration":151,"passed_time":2.231862295,"remaining_time":8.780616133,"test":[0.5217819374]}, +{"learn":[0.4719966757],"iteration":152,"passed_time":2.250989071,"remaining_time":8.783271079,"test":[0.5215549699]}, +{"learn":[0.4715576887],"iteration":153,"passed_time":2.271772876,"remaining_time":8.792056065,"test":[0.5214815219]}, +{"learn":[0.4710649914],"iteration":154,"passed_time":2.291667927,"remaining_time":8.797047848,"test":[0.5211855172]}, +{"learn":[0.4707287854],"iteration":155,"passed_time":2.311713189,"remaining_time":8.802292528,"test":[0.5210519406]}, +{"learn":[0.4703834295],"iteration":156,"passed_time":2.32954176,"remaining_time":8.798842445,"test":[0.5207773257]}, +{"learn":[0.4699588754],"iteration":157,"passed_time":2.349385108,"remaining_time":8.802759392,"test":[0.5207614576]}, +{"learn":[0.4696388981],"iteration":158,"passed_time":2.3673017,"remaining_time":8.799215754,"test":[0.5204844088]}, +{"learn":[0.4693226175],"iteration":159,"passed_time":2.386687291,"remaining_time":8.800909385,"test":[0.5204625836]}, +{"learn":[0.4689524445],"iteration":160,"passed_time":2.408570202,"remaining_time":8.811477323,"test":[0.520376228]}, +{"learn":[0.4686236024],"iteration":161,"passed_time":2.429778109,"remaining_time":8.819194616,"test":[0.5202015275]}, +{"learn":[0.4683142686],"iteration":162,"passed_time":2.448390746,"remaining_time":8.817210846,"test":[0.51996363]}, +{"learn":[0.4679910532],"iteration":163,"passed_time":2.465888654,"remaining_time":8.811041167,"test":[0.5197245487]}, +{"learn":[0.4676677298],"iteration":164,"passed_time":2.483155551,"remaining_time":8.803915135,"test":[0.519638471]}, +{"learn":[0.4673718834],"iteration":165,"passed_time":2.50012383,"remaining_time":8.795616366,"test":[0.5194360558]}, +{"learn":[0.4669427779],"iteration":166,"passed_time":2.519782159,"remaining_time":8.796604782,"test":[0.519515164]}, +{"learn":[0.4666767048],"iteration":167,"passed_time":2.536969308,"remaining_time":8.788786531,"test":[0.5193176647]}, +{"learn":[0.4663064015],"iteration":168,"passed_time":2.555414349,"remaining_time":8.785181873,"test":[0.5193145002]}, +{"learn":[0.4659312275],"iteration":169,"passed_time":2.570989739,"remaining_time":8.77161205,"test":[0.5190644101]}, +{"learn":[0.4656705809],"iteration":170,"passed_time":2.588028495,"remaining_time":8.762973676,"test":[0.5188446412]}, +{"learn":[0.4652465085],"iteration":171,"passed_time":2.608719138,"remaining_time":8.766509663,"test":[0.5187151438]}, +{"learn":[0.4650451777],"iteration":172,"passed_time":2.623827847,"remaining_time":8.751148367,"test":[0.5184970838]}, +{"learn":[0.4647616802],"iteration":173,"passed_time":2.641140597,"remaining_time":8.743086113,"test":[0.5182786316]}, +{"learn":[0.4644278974],"iteration":174,"passed_time":2.656671837,"remaining_time":8.729064608,"test":[0.5180629545]}, +{"learn":[0.4641460887],"iteration":175,"passed_time":2.671631265,"remaining_time":8.713161059,"test":[0.5178620352]}, +{"learn":[0.4638836765],"iteration":176,"passed_time":2.690547444,"remaining_time":8.710077318,"test":[0.5176687483]}, +{"learn":[0.4635819234],"iteration":177,"passed_time":2.711349325,"remaining_time":8.71287536,"test":[0.5175490769]}, +{"learn":[0.4632258901],"iteration":178,"passed_time":2.732145428,"remaining_time":8.715391283,"test":[0.5175523552]}, +{"learn":[0.4628348788],"iteration":179,"passed_time":2.753271932,"remaining_time":8.718694451,"test":[0.517412411]}, +{"learn":[0.4625121699],"iteration":180,"passed_time":2.770240879,"remaining_time":8.708657791,"test":[0.5172874168]}, +{"learn":[0.4621199381],"iteration":181,"passed_time":2.788187567,"remaining_time":8.701596362,"test":[0.5171183644]}, +{"learn":[0.4617829533],"iteration":182,"passed_time":2.807441026,"remaining_time":8.698464817,"test":[0.516829176]}, +{"learn":[0.4614975822],"iteration":183,"passed_time":2.826143776,"remaining_time":8.693464006,"test":[0.5166295321]}, +{"learn":[0.4611131437],"iteration":184,"passed_time":2.844119207,"remaining_time":8.686093794,"test":[0.5164349229]}, +{"learn":[0.4608496316],"iteration":185,"passed_time":2.866960113,"remaining_time":8.693362922,"test":[0.5162497154]}, +{"learn":[0.4605369646],"iteration":186,"passed_time":2.883916659,"remaining_time":8.682594005,"test":[0.5160883393]}, +{"learn":[0.4601458215],"iteration":187,"passed_time":2.900236967,"remaining_time":8.669857317,"test":[0.5158463849]}, +{"learn":[0.4597624349],"iteration":188,"passed_time":2.92033152,"remaining_time":8.668285621,"test":[0.5156988318]}, +{"learn":[0.4594017188],"iteration":189,"passed_time":2.937854406,"remaining_time":8.658939301,"test":[0.5154847207]}, +{"learn":[0.4590986478],"iteration":190,"passed_time":2.953879316,"remaining_time":8.645123233,"test":[0.5153597859]}, +{"learn":[0.458871558],"iteration":191,"passed_time":2.971378695,"remaining_time":8.635569332,"test":[0.515197863]}, +{"learn":[0.4585291535],"iteration":192,"passed_time":2.993310809,"remaining_time":8.638726014,"test":[0.5150228747]}, +{"learn":[0.4582507871],"iteration":193,"passed_time":3.010042295,"remaining_time":8.626719155,"test":[0.515018419]}, +{"learn":[0.4577670833],"iteration":194,"passed_time":3.026885717,"remaining_time":8.614982426,"test":[0.5148452717]}, +{"learn":[0.4573552868],"iteration":195,"passed_time":3.043576047,"remaining_time":8.602760866,"test":[0.5147039985]}, +{"learn":[0.4570586224],"iteration":196,"passed_time":3.061465054,"remaining_time":8.593858755,"test":[0.5145416322]}, +{"learn":[0.4567360206],"iteration":197,"passed_time":3.078675839,"remaining_time":8.582975066,"test":[0.5143681498]}, +{"learn":[0.4564790645],"iteration":198,"passed_time":3.097687776,"remaining_time":8.577014897,"test":[0.5142515928]}, +{"learn":[0.4562052319],"iteration":199,"passed_time":3.116914602,"remaining_time":8.571515156,"test":[0.5142076834]}, +{"learn":[0.4558385717],"iteration":200,"passed_time":3.132072972,"remaining_time":8.554766475,"test":[0.5141440263]}, +{"learn":[0.4556050195],"iteration":201,"passed_time":3.14676072,"remaining_time":8.536756804,"test":[0.5140569708]}, +{"learn":[0.4553470974],"iteration":202,"passed_time":3.164450356,"remaining_time":8.526868692,"test":[0.5139285493]}, +{"learn":[0.4550677312],"iteration":203,"passed_time":3.181261277,"remaining_time":8.514552241,"test":[0.5138464599]}, +{"learn":[0.4547538266],"iteration":204,"passed_time":3.198760135,"remaining_time":8.504020847,"test":[0.5136731283]}, +{"learn":[0.4545645288],"iteration":205,"passed_time":3.216384633,"remaining_time":8.493753594,"test":[0.5135422718]}, +{"learn":[0.454310185],"iteration":206,"passed_time":3.235007807,"remaining_time":8.486034971,"test":[0.5134879408]}, +{"learn":[0.4539858028],"iteration":207,"passed_time":3.253624493,"remaining_time":8.478194593,"test":[0.5134508574]}, +{"learn":[0.4537538627],"iteration":208,"passed_time":3.270100732,"remaining_time":8.464710507,"test":[0.5132819493]}, +{"learn":[0.4535002568],"iteration":209,"passed_time":3.288666505,"remaining_time":8.456571012,"test":[0.5131247801]}, +{"learn":[0.4532137743],"iteration":210,"passed_time":3.303918034,"remaining_time":8.439866446,"test":[0.5130048182]}, +{"learn":[0.4529660485],"iteration":211,"passed_time":3.316592123,"remaining_time":8.416634727,"test":[0.5128423435]}, +{"learn":[0.4525677428],"iteration":212,"passed_time":3.330135642,"remaining_time":8.395694083,"test":[0.512796206]}, +{"learn":[0.452363306],"iteration":213,"passed_time":3.343698676,"remaining_time":8.37487145,"test":[0.5126926128]}, +{"learn":[0.4521308076],"iteration":214,"passed_time":3.355993542,"remaining_time":8.350960676,"test":[0.5125309167]}, +{"learn":[0.4519454634],"iteration":215,"passed_time":3.368265137,"remaining_time":8.327099923,"test":[0.5123912503]}, +{"learn":[0.4516869],"iteration":216,"passed_time":3.382106463,"remaining_time":8.307201589,"test":[0.512289562]}, +{"learn":[0.4513456365],"iteration":217,"passed_time":3.395236645,"remaining_time":8.285623371,"test":[0.5121567862]}, +{"learn":[0.4511515965],"iteration":218,"passed_time":3.407590937,"remaining_time":8.262241038,"test":[0.5120176566]}, +{"learn":[0.4508380443],"iteration":219,"passed_time":3.42033972,"remaining_time":8.239909326,"test":[0.5119412533]}, +{"learn":[0.4505548092],"iteration":220,"passed_time":3.434239868,"remaining_time":8.220420318,"test":[0.5118688247]}, +{"learn":[0.450231633],"iteration":221,"passed_time":3.447016956,"remaining_time":8.198310597,"test":[0.5117418803]}, +{"learn":[0.449987132],"iteration":222,"passed_time":3.459380927,"remaining_time":8.175308289,"test":[0.5116680141]}, +{"learn":[0.4498286158],"iteration":223,"passed_time":3.473579315,"remaining_time":8.15670857,"test":[0.5115256038]}, +{"learn":[0.4494291653],"iteration":224,"passed_time":3.486975826,"remaining_time":8.136276927,"test":[0.5114087908]}, +{"learn":[0.4490756119],"iteration":225,"passed_time":3.500685978,"remaining_time":8.116634745,"test":[0.5113344762]}, +{"learn":[0.448790225],"iteration":226,"passed_time":3.513895207,"remaining_time":8.095890719,"test":[0.5112119865]}, +{"learn":[0.448536949],"iteration":227,"passed_time":3.527415089,"remaining_time":8.075924019,"test":[0.5111237394]}, +{"learn":[0.4482886262],"iteration":228,"passed_time":3.541459166,"remaining_time":8.057206224,"test":[0.5110516527]}, +{"learn":[0.4479321641],"iteration":229,"passed_time":3.55985263,"remaining_time":8.048362467,"test":[0.5110429524]}, +{"learn":[0.4476288243],"iteration":230,"passed_time":3.57443637,"remaining_time":8.030876521,"test":[0.5110395307]}, +{"learn":[0.4474873064],"iteration":231,"passed_time":3.587877619,"remaining_time":8.010864684,"test":[0.5109345358]}, +{"learn":[0.44722003],"iteration":232,"passed_time":3.600705009,"remaining_time":7.989547166,"test":[0.5108690951]}, +{"learn":[0.4470227771],"iteration":233,"passed_time":3.614086174,"remaining_time":7.969523358,"test":[0.5107661864]}, +{"learn":[0.4467327833],"iteration":234,"passed_time":3.62673531,"remaining_time":7.94795185,"test":[0.5107158842]}, +{"learn":[0.446376796],"iteration":235,"passed_time":3.639916021,"remaining_time":7.927613706,"test":[0.510616901]}, +{"learn":[0.4462349048],"iteration":236,"passed_time":3.65291013,"remaining_time":7.906932053,"test":[0.5105620625]}, +{"learn":[0.4460757884],"iteration":237,"passed_time":3.66578035,"remaining_time":7.886048483,"test":[0.5104783339]}, +{"learn":[0.4458567985],"iteration":238,"passed_time":3.678675018,"remaining_time":7.865284244,"test":[0.5104444087]}, +{"learn":[0.4455680533],"iteration":239,"passed_time":3.693023592,"remaining_time":7.847675134,"test":[0.5103849205]}, +{"learn":[0.4452942488],"iteration":240,"passed_time":3.706570936,"remaining_time":7.828400856,"test":[0.5102826481]}, +{"learn":[0.4449435518],"iteration":241,"passed_time":3.719917642,"remaining_time":7.808752736,"test":[0.5102498646]}, +{"learn":[0.4447585725],"iteration":242,"passed_time":3.73248093,"remaining_time":7.78752194,"test":[0.5101658929]}, +{"learn":[0.4445399232],"iteration":243,"passed_time":3.744909155,"remaining_time":7.766082101,"test":[0.5101066305]}, +{"learn":[0.444306535],"iteration":244,"passed_time":3.757480934,"remaining_time":7.745011721,"test":[0.5100401507]}, +{"learn":[0.4441202568],"iteration":245,"passed_time":3.770517069,"remaining_time":7.7249618,"test":[0.5100208886]}, +{"learn":[0.443883728],"iteration":246,"passed_time":3.783350563,"remaining_time":7.704556006,"test":[0.5099833024]}, +{"learn":[0.4436529307],"iteration":247,"passed_time":3.796683153,"remaining_time":7.685221543,"test":[0.5100181186]}, +{"learn":[0.4435158786],"iteration":248,"passed_time":3.809654332,"remaining_time":7.665208113,"test":[0.5099593443]}, +{"learn":[0.4432327381],"iteration":249,"passed_time":3.822176594,"remaining_time":7.644353187,"test":[0.5098596489]}, +{"learn":[0.4429902112],"iteration":250,"passed_time":3.835219295,"remaining_time":7.624599315,"test":[0.5098031751]}, +{"learn":[0.4427420796],"iteration":251,"passed_time":3.848795887,"remaining_time":7.605953776,"test":[0.5097576303]}, +{"learn":[0.4424702177],"iteration":252,"passed_time":3.862164315,"remaining_time":7.586939386,"test":[0.5096080649]}, +{"learn":[0.4423083471],"iteration":253,"passed_time":3.874667306,"remaining_time":7.566279463,"test":[0.5095825446]}, +{"learn":[0.4421101175],"iteration":254,"passed_time":3.887824223,"remaining_time":7.546952903,"test":[0.5095690345]}, +{"learn":[0.4418919875],"iteration":255,"passed_time":3.900837195,"remaining_time":7.527396774,"test":[0.5095000464]}, +{"learn":[0.4415448888],"iteration":256,"passed_time":3.913447682,"remaining_time":7.507119483,"test":[0.509469457]}, +{"learn":[0.4412573817],"iteration":257,"passed_time":3.926953471,"remaining_time":7.488608945,"test":[0.5094567634]}, +{"learn":[0.4409419352],"iteration":258,"passed_time":3.940102045,"remaining_time":7.469459861,"test":[0.5094283306]}, +{"learn":[0.4407464667],"iteration":259,"passed_time":3.952679825,"remaining_time":7.449281209,"test":[0.5093411262]}, +{"learn":[0.4405379441],"iteration":260,"passed_time":3.965581589,"remaining_time":7.429767805,"test":[0.5092961761]}, +{"learn":[0.4403936668],"iteration":261,"passed_time":3.980574093,"remaining_time":7.414199073,"test":[0.5092327932]}, +{"learn":[0.440059057],"iteration":262,"passed_time":3.998272692,"remaining_time":7.403645631,"test":[0.5091704911]}, +{"learn":[0.4397934991],"iteration":263,"passed_time":4.017549971,"remaining_time":7.395944264,"test":[0.509089185]}, +{"learn":[0.4395733139],"iteration":264,"passed_time":4.034468062,"remaining_time":7.383837775,"test":[0.509010118]}, +{"learn":[0.4393844922],"iteration":265,"passed_time":4.050144592,"remaining_time":7.369436025,"test":[0.5089215603]}, +{"learn":[0.4390924669],"iteration":266,"passed_time":4.069363553,"remaining_time":7.361432945,"test":[0.5088796842]}, +{"learn":[0.4387959426],"iteration":267,"passed_time":4.087710904,"remaining_time":7.351778566,"test":[0.5086964525]}, +{"learn":[0.4385667974],"iteration":268,"passed_time":4.10708758,"remaining_time":7.343900097,"test":[0.508654808]}, +{"learn":[0.4383935673],"iteration":269,"passed_time":4.127177159,"remaining_time":7.337203838,"test":[0.5086107001]}, +{"learn":[0.4381585014],"iteration":270,"passed_time":4.143761163,"remaining_time":7.324212536,"test":[0.5085713038]}, +{"learn":[0.4380082448],"iteration":271,"passed_time":4.163843703,"remaining_time":7.317342977,"test":[0.5084898232]}, +{"learn":[0.4377934947],"iteration":272,"passed_time":4.179740722,"remaining_time":7.30306346,"test":[0.5084193421]}, +{"learn":[0.4375961378],"iteration":273,"passed_time":4.198923227,"remaining_time":7.294479767,"test":[0.5084243532]}, +{"learn":[0.4372862834],"iteration":274,"passed_time":4.214305528,"remaining_time":7.279255004,"test":[0.5083254763]}, +{"learn":[0.4370547882],"iteration":275,"passed_time":4.233099591,"remaining_time":7.269888428,"test":[0.5082801047]}, +{"learn":[0.4368295248],"iteration":276,"passed_time":4.249962111,"remaining_time":7.257155518,"test":[0.5081911233]}, +{"learn":[0.4365794699],"iteration":277,"passed_time":4.266588793,"remaining_time":7.243992484,"test":[0.5081535212]}, +{"learn":[0.4363640315],"iteration":278,"passed_time":4.283391595,"remaining_time":7.231101939,"test":[0.5081238773]}, +{"learn":[0.4361651466],"iteration":279,"passed_time":4.30163577,"remaining_time":7.2206029,"test":[0.5080929835]}, +{"learn":[0.4359370168],"iteration":280,"passed_time":4.320803617,"remaining_time":7.211590379,"test":[0.5079704011]}, +{"learn":[0.4357486506],"iteration":281,"passed_time":4.338074284,"remaining_time":7.199357322,"test":[0.507887449]}, +{"learn":[0.4355085083],"iteration":282,"passed_time":4.356808977,"remaining_time":7.189504567,"test":[0.5078604043]}, +{"learn":[0.4352722663],"iteration":283,"passed_time":4.379326064,"remaining_time":7.185795583,"test":[0.5077772725]}, +{"learn":[0.4351393712],"iteration":284,"passed_time":4.400642228,"remaining_time":7.179995214,"test":[0.5077109468]}, +{"learn":[0.4348630598],"iteration":285,"passed_time":4.426768513,"remaining_time":7.181890174,"test":[0.5077326156]}, +{"learn":[0.4346807352],"iteration":286,"passed_time":4.444221999,"remaining_time":7.169598555,"test":[0.5077523791]}, +{"learn":[0.4344185767],"iteration":287,"passed_time":4.46253625,"remaining_time":7.158651902,"test":[0.5077910332]}, +{"learn":[0.4341359841],"iteration":288,"passed_time":4.478731919,"remaining_time":7.144274791,"test":[0.5077140272]}, +{"learn":[0.4338623346],"iteration":289,"passed_time":4.498362003,"remaining_time":7.135332832,"test":[0.5076659113]}, +{"learn":[0.4337079707],"iteration":290,"passed_time":4.516060432,"remaining_time":7.123270579,"test":[0.507696368]}, +{"learn":[0.4335635279],"iteration":291,"passed_time":4.536404873,"remaining_time":7.115319972,"test":[0.5076618274]}, +{"learn":[0.433154013],"iteration":292,"passed_time":4.559798327,"remaining_time":7.112040395,"test":[0.5076351132]}, +{"learn":[0.4329367804],"iteration":293,"passed_time":4.577761745,"remaining_time":7.100201891,"test":[0.5075901254]}, +{"learn":[0.4326557226],"iteration":294,"passed_time":4.598862052,"remaining_time":7.093160114,"test":[0.50765067]}, +{"learn":[0.4324998537],"iteration":295,"passed_time":4.616137257,"remaining_time":7.080156469,"test":[0.5075490535]}, +{"learn":[0.4323228151],"iteration":296,"passed_time":4.635611968,"remaining_time":7.07047886,"test":[0.5075520307]}, +{"learn":[0.4321801401],"iteration":297,"passed_time":4.654896791,"remaining_time":7.060447482,"test":[0.507497842]}, +{"learn":[0.4319104002],"iteration":298,"passed_time":4.67395922,"remaining_time":7.050018757,"test":[0.5075225259]}, +{"learn":[0.4316349583],"iteration":299,"passed_time":4.692373861,"remaining_time":7.038560791,"test":[0.507572529]}, +{"learn":[0.4314016309],"iteration":300,"passed_time":4.710918056,"remaining_time":7.027249857,"test":[0.5075684518]}, +{"learn":[0.4311052053],"iteration":301,"passed_time":4.732907398,"remaining_time":7.021001703,"test":[0.5075098056]}, +{"learn":[0.4309243409],"iteration":302,"passed_time":4.752227397,"remaining_time":7.010711704,"test":[0.5075117193]}, +{"learn":[0.4307034747],"iteration":303,"passed_time":4.768530289,"remaining_time":6.995935885,"test":[0.5075102981]}, +{"learn":[0.4303358466],"iteration":304,"passed_time":4.785508759,"remaining_time":6.982135731,"test":[0.5075700816]}, +{"learn":[0.4302018177],"iteration":305,"passed_time":4.803764336,"remaining_time":6.97016786,"test":[0.5075290476]}, +{"learn":[0.4299838146],"iteration":306,"passed_time":4.821968042,"remaining_time":6.958084177,"test":[0.5074662823]}, +{"learn":[0.4297543996],"iteration":307,"passed_time":4.837426584,"remaining_time":6.942021267,"test":[0.5074317914]}, +{"learn":[0.4296233818],"iteration":308,"passed_time":4.856385064,"remaining_time":6.930957324,"test":[0.5074219382]}, +{"learn":[0.4294392198],"iteration":309,"passed_time":4.875893646,"remaining_time":6.920623239,"test":[0.5074001882]}, +{"learn":[0.4292792296],"iteration":310,"passed_time":4.893953642,"remaining_time":6.908185366,"test":[0.5073011459]}, +{"learn":[0.4291012739],"iteration":311,"passed_time":4.91217885,"remaining_time":6.895943386,"test":[0.5072873473]}, +{"learn":[0.4289252984],"iteration":312,"passed_time":4.931657576,"remaining_time":6.885413293,"test":[0.5072321379]}, +{"learn":[0.4287672954],"iteration":313,"passed_time":4.951718453,"remaining_time":6.875634539,"test":[0.5071687428]}, +{"learn":[0.4286382925],"iteration":314,"passed_time":4.968955071,"remaining_time":6.861890336,"test":[0.5071463519]}, +{"learn":[0.4284289564],"iteration":315,"passed_time":4.986182822,"remaining_time":6.848111851,"test":[0.5070958208]}, +{"learn":[0.4282400846],"iteration":316,"passed_time":5.000287557,"remaining_time":6.83004578,"test":[0.5070485383]}, +{"learn":[0.4280665265],"iteration":317,"passed_time":5.01512926,"remaining_time":6.813005787,"test":[0.507001437]}, +{"learn":[0.427873199],"iteration":318,"passed_time":5.029832854,"remaining_time":6.795792978,"test":[0.5069354685]}, +{"learn":[0.4275917432],"iteration":319,"passed_time":5.045525688,"remaining_time":6.779925143,"test":[0.5069330393]}, +{"learn":[0.4274178552],"iteration":320,"passed_time":5.060397343,"remaining_time":6.762960935,"test":[0.5069215119]}, +{"learn":[0.427225394],"iteration":321,"passed_time":5.076174118,"remaining_time":6.747212802,"test":[0.5068695712]}, +{"learn":[0.4269689983],"iteration":322,"passed_time":5.088900418,"remaining_time":6.727431823,"test":[0.5068551084]}, +{"learn":[0.4268040213],"iteration":323,"passed_time":5.102171123,"remaining_time":6.70841018,"test":[0.506831375]}, +{"learn":[0.4265066938],"iteration":324,"passed_time":5.114956684,"remaining_time":6.68878951,"test":[0.506790121]}, +{"learn":[0.4263658995],"iteration":325,"passed_time":5.128474469,"remaining_time":6.670163113,"test":[0.5067979106]}, +{"learn":[0.4262210853],"iteration":326,"passed_time":5.140760005,"remaining_time":6.649973952,"test":[0.5067357034]}, +{"learn":[0.4261016254],"iteration":327,"passed_time":5.153757173,"remaining_time":6.630748558,"test":[0.5067113163]}, +{"learn":[0.4258775328],"iteration":328,"passed_time":5.166552415,"remaining_time":6.611302634,"test":[0.5066774905]}, +{"learn":[0.4256150707],"iteration":329,"passed_time":5.179770547,"remaining_time":6.592435241,"test":[0.5066291246]}, +{"learn":[0.4254605415],"iteration":330,"passed_time":5.19687162,"remaining_time":6.578517248,"test":[0.5065992506]}, +{"learn":[0.425103945],"iteration":331,"passed_time":5.216335762,"remaining_time":6.567555267,"test":[0.5065767615]}, +{"learn":[0.4249474884],"iteration":332,"passed_time":5.236505914,"remaining_time":6.557426325,"test":[0.5066184207]}, +{"learn":[0.4247586111],"iteration":333,"passed_time":5.25921762,"remaining_time":6.550402785,"test":[0.5066251338]}, +{"learn":[0.4245190758],"iteration":334,"passed_time":5.280229266,"remaining_time":6.541179538,"test":[0.5066594461]}, +{"learn":[0.424354259],"iteration":335,"passed_time":5.301717503,"remaining_time":6.532473352,"test":[0.5066231531]}, +{"learn":[0.424132662],"iteration":336,"passed_time":5.316407083,"remaining_time":6.515359423,"test":[0.5065771665]}, +{"learn":[0.4238665065],"iteration":337,"passed_time":5.329533018,"remaining_time":6.496353856,"test":[0.5066428875]}, +{"learn":[0.4237475302],"iteration":338,"passed_time":5.343234944,"remaining_time":6.478081304,"test":[0.5066086337]}, +{"learn":[0.4234735865],"iteration":339,"passed_time":5.356499761,"remaining_time":6.459308536,"test":[0.5065916296]}, +{"learn":[0.4233543172],"iteration":340,"passed_time":5.370086474,"remaining_time":6.440954158,"test":[0.5065917689]}, +{"learn":[0.4230993551],"iteration":341,"passed_time":5.383633896,"remaining_time":6.422580789,"test":[0.5065295218]}, +{"learn":[0.4229050267],"iteration":342,"passed_time":5.396445646,"remaining_time":6.403362618,"test":[0.5064910377]}, +{"learn":[0.4226697413],"iteration":343,"passed_time":5.410705417,"remaining_time":6.385890695,"test":[0.506489982]}, +{"learn":[0.4225455909],"iteration":344,"passed_time":5.424164885,"remaining_time":6.367497909,"test":[0.5064831253]}, +{"learn":[0.4224177279],"iteration":345,"passed_time":5.437158345,"remaining_time":6.348589512,"test":[0.5064264537]}, +{"learn":[0.4222604838],"iteration":346,"passed_time":5.450672789,"remaining_time":6.33032027,"test":[0.5063896038]}, +{"learn":[0.4220568565],"iteration":347,"passed_time":5.4638059,"remaining_time":6.311637849,"test":[0.5063228949]}, +{"learn":[0.4218699243],"iteration":348,"passed_time":5.476872845,"remaining_time":6.292911206,"test":[0.5063496667]}, +{"learn":[0.4217377586],"iteration":349,"passed_time":5.489851172,"remaining_time":6.274115625,"test":[0.5063601345]}, +{"learn":[0.4215193993],"iteration":350,"passed_time":5.503929391,"remaining_time":6.256603496,"test":[0.5063509079]}, +{"learn":[0.4212715526],"iteration":351,"passed_time":5.519088321,"remaining_time":6.240332817,"test":[0.5063714866]}, +{"learn":[0.4211308748],"iteration":352,"passed_time":5.533851421,"remaining_time":6.223623269,"test":[0.5063628244]}, +{"learn":[0.4210073087],"iteration":353,"passed_time":5.554802001,"remaining_time":6.213846307,"test":[0.5063397515]}, +{"learn":[0.4208631905],"iteration":354,"passed_time":5.575378673,"remaining_time":6.203590355,"test":[0.5062710714]}, +{"learn":[0.4207086715],"iteration":355,"passed_time":5.596855729,"remaining_time":6.194272914,"test":[0.5062665569]}, +{"learn":[0.4204482645],"iteration":356,"passed_time":5.618681937,"remaining_time":6.185271712,"test":[0.5062555601]}, +{"learn":[0.4202904422],"iteration":357,"passed_time":5.633451109,"remaining_time":6.168471605,"test":[0.5062209683]}, +{"learn":[0.4201302692],"iteration":358,"passed_time":5.646098592,"remaining_time":6.149372004,"test":[0.5062160376]}, +{"learn":[0.4199322944],"iteration":359,"passed_time":5.660269474,"remaining_time":6.131958597,"test":[0.5061763747]}, +{"learn":[0.4197650806],"iteration":360,"passed_time":5.672703685,"remaining_time":6.112691782,"test":[0.5061232809]}, +{"learn":[0.4195660523],"iteration":361,"passed_time":5.685617077,"remaining_time":6.093976315,"test":[0.5061324827]}, +{"learn":[0.419408487],"iteration":362,"passed_time":5.69798975,"remaining_time":6.074716345,"test":[0.5060527787]}, +{"learn":[0.4192714234],"iteration":363,"passed_time":5.710896372,"remaining_time":6.056060438,"test":[0.5060280987]}, +{"learn":[0.4191022332],"iteration":364,"passed_time":5.72335933,"remaining_time":6.03696806,"test":[0.5060139928]}, +{"learn":[0.4188885725],"iteration":365,"passed_time":5.736617037,"remaining_time":6.018745744,"test":[0.505983797]}, +{"learn":[0.4187249006],"iteration":366,"passed_time":5.748944222,"remaining_time":5.999579392,"test":[0.5059335179]}, +{"learn":[0.4185552442],"iteration":367,"passed_time":5.762554207,"remaining_time":5.981781813,"test":[0.5059282266]}, +{"learn":[0.4183770285],"iteration":368,"passed_time":5.775792407,"remaining_time":5.963623055,"test":[0.5059032395]}, +{"learn":[0.4181731333],"iteration":369,"passed_time":5.789408551,"remaining_time":5.945879052,"test":[0.5059048526]}, +{"learn":[0.417939556],"iteration":370,"passed_time":5.802695033,"remaining_time":5.927820532,"test":[0.5058797514]}, +{"learn":[0.4176956536],"iteration":371,"passed_time":5.81570651,"remaining_time":5.909508228,"test":[0.5058965678]}, +{"learn":[0.4174959073],"iteration":372,"passed_time":5.829201532,"remaining_time":5.891713077,"test":[0.5058613854]}, +{"learn":[0.4174016594],"iteration":373,"passed_time":5.842126456,"remaining_time":5.873367774,"test":[0.5058258499]}, +{"learn":[0.4171861522],"iteration":374,"passed_time":5.856341415,"remaining_time":5.856341415,"test":[0.5058003022]}, +{"learn":[0.4169813507],"iteration":375,"passed_time":5.877374023,"remaining_time":5.846111395,"test":[0.5057803609]}, +{"learn":[0.416747154],"iteration":376,"passed_time":5.897334857,"remaining_time":5.834763665,"test":[0.5057867985]}, +{"learn":[0.4165443915],"iteration":377,"passed_time":5.914091794,"remaining_time":5.820217321,"test":[0.5057819594]}, +{"learn":[0.4163682948],"iteration":378,"passed_time":5.930514499,"remaining_time":5.805332135,"test":[0.5057674603]}, +{"learn":[0.4161134718],"iteration":379,"passed_time":5.950493777,"remaining_time":5.793901836,"test":[0.5058543622]}, +{"learn":[0.4156613718],"iteration":380,"passed_time":5.96847527,"remaining_time":5.780491797,"test":[0.5058484754]}, +{"learn":[0.4155335187],"iteration":381,"passed_time":5.983893714,"remaining_time":5.764588708,"test":[0.5058388174]}, +{"learn":[0.4153271037],"iteration":382,"passed_time":6.0015641,"remaining_time":5.750846017,"test":[0.5058381963]}, +{"learn":[0.415039742],"iteration":383,"passed_time":6.021649754,"remaining_time":5.739384921,"test":[0.5058192608]}, +{"learn":[0.4148493701],"iteration":384,"passed_time":6.041265359,"remaining_time":5.727433392,"test":[0.5057975197]}, +{"learn":[0.4145737977],"iteration":385,"passed_time":6.061659899,"remaining_time":5.716176692,"test":[0.5058123424]}, +{"learn":[0.4144641023],"iteration":386,"passed_time":6.082170432,"remaining_time":5.704981568,"test":[0.5058038215]}, +{"learn":[0.4142665981],"iteration":387,"passed_time":6.100275039,"remaining_time":5.691493722,"test":[0.5057510825]}, +{"learn":[0.4141114564],"iteration":388,"passed_time":6.118725432,"remaining_time":5.678303036,"test":[0.5057731014]}, +{"learn":[0.4139069824],"iteration":389,"passed_time":6.136695396,"remaining_time":5.664641904,"test":[0.5057552519]}, +{"learn":[0.4137664746],"iteration":390,"passed_time":6.156812815,"remaining_time":5.652930437,"test":[0.5057296528]}, +{"learn":[0.4135564708],"iteration":391,"passed_time":6.179252411,"remaining_time":5.643296845,"test":[0.5057449074]}, +{"learn":[0.413399975],"iteration":392,"passed_time":6.198686683,"remaining_time":5.630868056,"test":[0.5057387472]}, +{"learn":[0.4132841463],"iteration":393,"passed_time":6.217348058,"remaining_time":5.617705352,"test":[0.505748402]}, +{"learn":[0.4130735453],"iteration":394,"passed_time":6.237012259,"remaining_time":5.605416081,"test":[0.5057419114]}, +{"learn":[0.4129128891],"iteration":395,"passed_time":6.255423884,"remaining_time":5.591969836,"test":[0.5057386819]}, +{"learn":[0.4127603425],"iteration":396,"passed_time":6.274597886,"remaining_time":5.579176458,"test":[0.5056747115]}, +{"learn":[0.4126132869],"iteration":397,"passed_time":6.292118263,"remaining_time":5.564888514,"test":[0.505639086]}, +{"learn":[0.412483408],"iteration":398,"passed_time":6.309605545,"remaining_time":5.550555254,"test":[0.5056526114]}, +{"learn":[0.4122498658],"iteration":399,"passed_time":6.328930062,"remaining_time":5.537813805,"test":[0.5056920653]}, +{"learn":[0.4120989385],"iteration":400,"passed_time":6.346460474,"remaining_time":5.523478068,"test":[0.5056630891]}, +{"learn":[0.4119977297],"iteration":401,"passed_time":6.364314905,"remaining_time":5.509406933,"test":[0.5056712296]}, +{"learn":[0.4117791922],"iteration":402,"passed_time":6.380010736,"remaining_time":5.493458376,"test":[0.505592435]}, +{"learn":[0.4115558202],"iteration":403,"passed_time":6.397474514,"remaining_time":5.479025203,"test":[0.5056194099]}, +{"learn":[0.4113869065],"iteration":404,"passed_time":6.416963149,"remaining_time":5.466301941,"test":[0.5055870615]}, +{"learn":[0.4112286448],"iteration":405,"passed_time":6.434882659,"remaining_time":5.452215849,"test":[0.5055787232]}, +{"learn":[0.4110590725],"iteration":406,"passed_time":6.453232474,"remaining_time":5.438473559,"test":[0.5055699859]}, +{"learn":[0.4107481758],"iteration":407,"passed_time":6.471827828,"remaining_time":5.424914503,"test":[0.5056690666]}, +{"learn":[0.4106603593],"iteration":408,"passed_time":6.502338192,"remaining_time":5.421264849,"test":[0.5057043725]}, +{"learn":[0.4104916576],"iteration":409,"passed_time":6.521889678,"remaining_time":5.408396318,"test":[0.5057596577]}, +{"learn":[0.410350909],"iteration":410,"passed_time":6.540781802,"remaining_time":5.394951414,"test":[0.5057283927]}, +{"learn":[0.4101348908],"iteration":411,"passed_time":6.557977578,"remaining_time":5.380088402,"test":[0.5057540986]}, +{"learn":[0.4099898476],"iteration":412,"passed_time":6.574706997,"remaining_time":5.364833554,"test":[0.5057534277]}, +{"learn":[0.409759579],"iteration":413,"passed_time":6.602780303,"remaining_time":5.358778217,"test":[0.5057637686]}, +{"learn":[0.4095488194],"iteration":414,"passed_time":6.621797357,"remaining_time":5.3453063,"test":[0.5057403068]}, +{"learn":[0.4092995604],"iteration":415,"passed_time":6.64106941,"remaining_time":5.332012459,"test":[0.5057433093]}, +{"learn":[0.4090528408],"iteration":416,"passed_time":6.661408883,"remaining_time":5.319542346,"test":[0.5057504174]}, +{"learn":[0.4088984152],"iteration":417,"passed_time":6.680713535,"remaining_time":5.306212664,"test":[0.5057808512]}, +{"learn":[0.4086561412],"iteration":418,"passed_time":6.698348332,"remaining_time":5.291535317,"test":[0.5057070131]}, +{"learn":[0.4084070467],"iteration":419,"passed_time":6.719388776,"remaining_time":5.279519752,"test":[0.5056658587]}, +{"learn":[0.4082820546],"iteration":420,"passed_time":6.738014836,"remaining_time":5.265574539,"test":[0.5056484786]}, +{"learn":[0.408052739],"iteration":421,"passed_time":6.759700539,"remaining_time":5.253985253,"test":[0.5056525101]}, +{"learn":[0.4079038954],"iteration":422,"passed_time":6.78002624,"remaining_time":5.241296881,"test":[0.5056227494]}, +{"learn":[0.4077738978],"iteration":423,"passed_time":6.802168965,"remaining_time":5.229969534,"test":[0.5056191927]}, +{"learn":[0.4076969764],"iteration":424,"passed_time":6.820446567,"remaining_time":5.21563561,"test":[0.5056154201]}, +{"learn":[0.4074848942],"iteration":425,"passed_time":6.838963139,"remaining_time":5.201464922,"test":[0.5055722632]}, +{"learn":[0.4072186769],"iteration":426,"passed_time":6.858162697,"remaining_time":5.187790518,"test":[0.5056248542]}, +{"learn":[0.407034473],"iteration":427,"passed_time":6.878760869,"remaining_time":5.175142523,"test":[0.5056225632]}, +{"learn":[0.4068168505],"iteration":428,"passed_time":6.896750489,"remaining_time":5.160505611,"test":[0.5055820724]}, +{"learn":[0.4066484338],"iteration":429,"passed_time":6.914730377,"remaining_time":5.145845862,"test":[0.5056127927]}, +{"learn":[0.4064609594],"iteration":430,"passed_time":6.932060333,"remaining_time":5.130689667,"test":[0.5056102084]}, +{"learn":[0.4063775439],"iteration":431,"passed_time":6.94564835,"remaining_time":5.112768924,"test":[0.5056395822]}, +{"learn":[0.4062446513],"iteration":432,"passed_time":6.968174231,"remaining_time":5.10141162,"test":[0.5057070007]}, +{"learn":[0.4060445669],"iteration":433,"passed_time":6.984014176,"remaining_time":5.085134745,"test":[0.5057016396]}, +{"learn":[0.4058599491],"iteration":434,"passed_time":6.997218093,"remaining_time":5.066951033,"test":[0.5057033276]}, +{"learn":[0.4057238709],"iteration":435,"passed_time":7.011720593,"remaining_time":5.049725381,"test":[0.5057301873]}, +{"learn":[0.405556891],"iteration":436,"passed_time":7.026404672,"remaining_time":5.032642248,"test":[0.5057213834]}, +{"learn":[0.4053481581],"iteration":437,"passed_time":7.039566938,"remaining_time":5.014486038,"test":[0.5056997095]}, +{"learn":[0.4052095468],"iteration":438,"passed_time":7.057536023,"remaining_time":4.999757866,"test":[0.5056941061]}, +{"learn":[0.405039241],"iteration":439,"passed_time":7.070467973,"remaining_time":4.981466072,"test":[0.5056343996]}, +{"learn":[0.4048853183],"iteration":440,"passed_time":7.08423843,"remaining_time":4.963786111,"test":[0.5055990428]}, +{"learn":[0.4046243019],"iteration":441,"passed_time":7.09752014,"remaining_time":4.945783265,"test":[0.5056219709]}, +{"learn":[0.40439664],"iteration":442,"passed_time":7.109942862,"remaining_time":4.927206453,"test":[0.5056344292]}, +{"learn":[0.404257456],"iteration":443,"passed_time":7.123539959,"remaining_time":4.909466728,"test":[0.5056196254]}, +{"learn":[0.4040562711],"iteration":444,"passed_time":7.136965162,"remaining_time":4.891627807,"test":[0.5055948673]}, +{"learn":[0.4039560113],"iteration":445,"passed_time":7.149742671,"remaining_time":4.873367202,"test":[0.5055668699]}, +{"learn":[0.4038123666],"iteration":446,"passed_time":7.163096744,"remaining_time":4.855521954,"test":[0.5055739742]}, +{"learn":[0.4036857712],"iteration":447,"passed_time":7.181301834,"remaining_time":4.840966861,"test":[0.5055674998]}, +{"learn":[0.4035193031],"iteration":448,"passed_time":7.194258239,"remaining_time":4.822876904,"test":[0.5055242069]}, +{"learn":[0.4033486879],"iteration":449,"passed_time":7.207892697,"remaining_time":4.805261798,"test":[0.5055268805]}, +{"learn":[0.4031770743],"iteration":450,"passed_time":7.220682345,"remaining_time":4.78710426,"test":[0.5055321311]}, +{"learn":[0.4030550034],"iteration":451,"passed_time":7.233353753,"remaining_time":4.768892518,"test":[0.5055208138]}, +{"learn":[0.4028698306],"iteration":452,"passed_time":7.246615341,"remaining_time":4.751092177,"test":[0.5055534105]}, +{"learn":[0.4026983613],"iteration":453,"passed_time":7.25881713,"remaining_time":4.73262086,"test":[0.5055725124]}, +{"learn":[0.4025485746],"iteration":454,"passed_time":7.271648799,"remaining_time":4.714585485,"test":[0.5055431106]}, +{"learn":[0.4023596694],"iteration":455,"passed_time":7.285509503,"remaining_time":4.69723639,"test":[0.5055521403]}, +{"learn":[0.402161124],"iteration":456,"passed_time":7.298223951,"remaining_time":4.679167654,"test":[0.505527128]}, +{"learn":[0.4019401492],"iteration":457,"passed_time":7.31104986,"remaining_time":4.661193361,"test":[0.5055264034]}, +{"learn":[0.4017907634],"iteration":458,"passed_time":7.323237503,"remaining_time":4.642836848,"test":[0.5055539437]}, +{"learn":[0.4015745332],"iteration":459,"passed_time":7.335803446,"remaining_time":4.624745651,"test":[0.505631192]}, +{"learn":[0.4013345036],"iteration":460,"passed_time":7.348190915,"remaining_time":4.606566539,"test":[0.5056358382]}, +{"learn":[0.4011869485],"iteration":461,"passed_time":7.361356768,"remaining_time":4.588897725,"test":[0.5056737598]}, +{"learn":[0.4010027812],"iteration":462,"passed_time":7.374370948,"remaining_time":4.571154346,"test":[0.5056617143]}, +{"learn":[0.4007869908],"iteration":463,"passed_time":7.386911286,"remaining_time":4.553139284,"test":[0.5056540622]}, +{"learn":[0.4006739777],"iteration":464,"passed_time":7.399744031,"remaining_time":4.535326987,"test":[0.5056872857]}, +{"learn":[0.4005489822],"iteration":465,"passed_time":7.41280482,"remaining_time":4.51767504,"test":[0.5057610305]}, +{"learn":[0.4003149634],"iteration":466,"passed_time":7.425028585,"remaining_time":4.499535524,"test":[0.5057202459]}, +{"learn":[0.4002126351],"iteration":467,"passed_time":7.437434478,"remaining_time":4.481531032,"test":[0.5057031828]}, +{"learn":[0.400038857],"iteration":468,"passed_time":7.450898897,"remaining_time":4.464184627,"test":[0.5057111473]}, +{"learn":[0.399836417],"iteration":469,"passed_time":7.463979225,"remaining_time":4.446625921,"test":[0.5056962626]}, +{"learn":[0.3996140597],"iteration":470,"passed_time":7.476334315,"remaining_time":4.428656633,"test":[0.50569569]}, +{"learn":[0.3993328468],"iteration":471,"passed_time":7.490294159,"remaining_time":4.411656305,"test":[0.5057243812]}, +{"learn":[0.3989870829],"iteration":472,"passed_time":7.509846863,"remaining_time":4.397944146,"test":[0.5056494599]}, +{"learn":[0.3988445618],"iteration":473,"passed_time":7.522941901,"remaining_time":4.380447183,"test":[0.5056261744]}, +{"learn":[0.3987436442],"iteration":474,"passed_time":7.53567728,"remaining_time":4.362760531,"test":[0.5056223365]}, +{"learn":[0.3986119474],"iteration":475,"passed_time":7.549084021,"remaining_time":4.345481138,"test":[0.5055916699]}, +{"learn":[0.3984610074],"iteration":476,"passed_time":7.56192414,"remaining_time":4.32789369,"test":[0.5055695668]}, +{"learn":[0.3982633871],"iteration":477,"passed_time":7.575737323,"remaining_time":4.310879816,"test":[0.5055979363]}, +{"learn":[0.398136263],"iteration":478,"passed_time":7.590111008,"remaining_time":4.294196416,"test":[0.5055905375]}, +{"learn":[0.3980163749],"iteration":479,"passed_time":7.608802624,"remaining_time":4.279951476,"test":[0.5055737089]}, +{"learn":[0.3978723608],"iteration":480,"passed_time":7.730426141,"remaining_time":4.323252873,"test":[0.5056172603]}, +{"learn":[0.397690427],"iteration":481,"passed_time":7.746626809,"remaining_time":4.30725308,"test":[0.5055890569]}, +{"learn":[0.3975478307],"iteration":482,"passed_time":7.766534698,"remaining_time":4.29330179,"test":[0.5055894479]}, +{"learn":[0.3973334291],"iteration":483,"passed_time":7.784587949,"remaining_time":4.2783066,"test":[0.5055599113]}, +{"learn":[0.3971051589],"iteration":484,"passed_time":7.801056944,"remaining_time":4.262433176,"test":[0.505560481]}, +{"learn":[0.3969474896],"iteration":485,"passed_time":7.820531043,"remaining_time":4.248189702,"test":[0.505562845]}, +{"learn":[0.3967539683],"iteration":486,"passed_time":7.838426697,"remaining_time":4.233072323,"test":[0.5055930275]}, +{"learn":[0.3966085314],"iteration":487,"passed_time":7.85662376,"remaining_time":4.218105379,"test":[0.5056117097]}, +{"learn":[0.3964510125],"iteration":488,"passed_time":7.879390696,"remaining_time":4.205564359,"test":[0.5056385897]}, +{"learn":[0.396253402],"iteration":489,"passed_time":7.898180407,"remaining_time":4.190871236,"test":[0.5056763688]}, +{"learn":[0.3960310245],"iteration":490,"passed_time":7.915977287,"remaining_time":4.175637714,"test":[0.505589711]}, +{"learn":[0.3958311156],"iteration":491,"passed_time":7.938249377,"remaining_time":4.162740527,"test":[0.5055514499]}, +{"learn":[0.3955993467],"iteration":492,"passed_time":7.965200224,"remaining_time":4.152244336,"test":[0.5055368722]}, +{"learn":[0.3954683697],"iteration":493,"passed_time":7.985494304,"remaining_time":4.138231866,"test":[0.5055168889]}, +{"learn":[0.3953325317],"iteration":494,"passed_time":8.006142797,"remaining_time":4.124376592,"test":[0.5055516883]}, +{"learn":[0.3951685557],"iteration":495,"passed_time":8.025458565,"remaining_time":4.109811443,"test":[0.5055044263]}, +{"learn":[0.3950654818],"iteration":496,"passed_time":8.052487365,"remaining_time":4.099153528,"test":[0.5054930211]}, +{"learn":[0.3948834192],"iteration":497,"passed_time":8.070785733,"remaining_time":4.084012058,"test":[0.505506577]}, +{"learn":[0.3947808055],"iteration":498,"passed_time":8.087600798,"remaining_time":4.068111824,"test":[0.5054624273]}, +{"learn":[0.3946276223],"iteration":499,"passed_time":8.104566365,"remaining_time":4.052283182,"test":[0.5054659544]}, +{"learn":[0.3944426652],"iteration":500,"passed_time":8.124808546,"remaining_time":4.038078499,"test":[0.5054681124]}, +{"learn":[0.3942853799],"iteration":501,"passed_time":8.148400577,"remaining_time":4.025504667,"test":[0.5055313527]}, +{"learn":[0.3940638964],"iteration":502,"passed_time":8.167331115,"remaining_time":4.010597983,"test":[0.5055551405]}, +{"learn":[0.3938680931],"iteration":503,"passed_time":8.189534059,"remaining_time":3.997272577,"test":[0.5055629565]}, +{"learn":[0.3936522705],"iteration":504,"passed_time":8.220398053,"remaining_time":3.988113907,"test":[0.505522643]}, +{"learn":[0.3934806347],"iteration":505,"passed_time":8.246744294,"remaining_time":3.976690924,"test":[0.5055165202]}, +{"learn":[0.3933477731],"iteration":506,"passed_time":8.27010162,"remaining_time":3.963776516,"test":[0.5055238986]}, +{"learn":[0.3932168615],"iteration":507,"passed_time":8.287889056,"remaining_time":3.948167621,"test":[0.5055616149]}, +{"learn":[0.3930577322],"iteration":508,"passed_time":8.308971757,"remaining_time":3.9341104,"test":[0.5055502317]}, +{"learn":[0.3929338752],"iteration":509,"passed_time":8.326784764,"remaining_time":3.918486948,"test":[0.50554374]}, +{"learn":[0.3927555401],"iteration":510,"passed_time":8.346768276,"remaining_time":3.903870094,"test":[0.5055258652]}, +{"learn":[0.3925625806],"iteration":511,"passed_time":8.365499585,"remaining_time":3.888650198,"test":[0.5055410857]}, +{"learn":[0.3924040515],"iteration":512,"passed_time":8.386214323,"remaining_time":3.874332933,"test":[0.505559419]}, +{"learn":[0.3922035732],"iteration":513,"passed_time":8.406928376,"remaining_time":3.85999046,"test":[0.5055728836]}, +{"learn":[0.3920878478],"iteration":514,"passed_time":8.427066684,"remaining_time":3.845360526,"test":[0.5055634487]}, +{"learn":[0.3918940082],"iteration":515,"passed_time":8.443899088,"remaining_time":3.829210052,"test":[0.5055811846]}, +{"learn":[0.391770082],"iteration":516,"passed_time":8.460054083,"remaining_time":3.812751647,"test":[0.5055673339]}, +{"learn":[0.3915579811],"iteration":517,"passed_time":8.479128374,"remaining_time":3.797601897,"test":[0.505641107]}, +{"learn":[0.3913652469],"iteration":518,"passed_time":8.498241576,"remaining_time":3.782454343,"test":[0.5057116994]}, +{"learn":[0.3912203248],"iteration":519,"passed_time":8.516950225,"remaining_time":3.7671126,"test":[0.5056992602]}, +{"learn":[0.391062202],"iteration":520,"passed_time":8.543790391,"remaining_time":3.755332053,"test":[0.505732603]}, +{"learn":[0.3909223001],"iteration":521,"passed_time":8.563614312,"remaining_time":3.74042924,"test":[0.5057473174]}, +{"learn":[0.3907347913],"iteration":522,"passed_time":8.581308478,"remaining_time":3.724583221,"test":[0.5057873197]}, +{"learn":[0.3906212249],"iteration":523,"passed_time":8.599240633,"remaining_time":3.708832792,"test":[0.5057830894]}, +{"learn":[0.390499577],"iteration":524,"passed_time":8.618457529,"remaining_time":3.693624655,"test":[0.5057609133]}, +{"learn":[0.390320446],"iteration":525,"passed_time":8.646258037,"remaining_time":3.682056654,"test":[0.5057385176]}, +{"learn":[0.39019017],"iteration":526,"passed_time":8.665980483,"remaining_time":3.667008819,"test":[0.5057340285]}, +{"learn":[0.3900673339],"iteration":527,"passed_time":8.683502185,"remaining_time":3.651017964,"test":[0.5057626303]}, +{"learn":[0.3899329843],"iteration":528,"passed_time":8.704344513,"remaining_time":3.636408577,"test":[0.5057646069]}, +{"learn":[0.389764516],"iteration":529,"passed_time":8.721866503,"remaining_time":3.620397416,"test":[0.5057178585]}, +{"learn":[0.3896331664],"iteration":530,"passed_time":8.740713176,"remaining_time":3.604926903,"test":[0.5057410382]}, +{"learn":[0.3895170009],"iteration":531,"passed_time":8.759498122,"remaining_time":3.589418403,"test":[0.5056904442]}, +{"learn":[0.389249049],"iteration":532,"passed_time":8.779507405,"remaining_time":3.574396073,"test":[0.505689517]}, +{"learn":[0.3890434867],"iteration":533,"passed_time":8.802426196,"remaining_time":3.560531944,"test":[0.5056898459]}, +{"learn":[0.388938254],"iteration":534,"passed_time":8.822411676,"remaining_time":3.545455159,"test":[0.5056956925]}, +{"learn":[0.3887604864],"iteration":535,"passed_time":8.841386989,"remaining_time":3.529956746,"test":[0.5056917961]}, +{"learn":[0.3884972125],"iteration":536,"passed_time":8.859790619,"remaining_time":3.514218625,"test":[0.5056360425]}, +{"learn":[0.3883344834],"iteration":537,"passed_time":8.876709196,"remaining_time":3.497885408,"test":[0.5056150748]}, +{"learn":[0.3881912086],"iteration":538,"passed_time":8.89364568,"remaining_time":3.481557029,"test":[0.5055983552]}, +{"learn":[0.3880425215],"iteration":539,"passed_time":8.911689781,"remaining_time":3.465657137,"test":[0.5055465885]}, +{"learn":[0.3878480257],"iteration":540,"passed_time":8.929166915,"remaining_time":3.449530287,"test":[0.5055270041]}, +{"learn":[0.3876806629],"iteration":541,"passed_time":8.943424205,"remaining_time":3.432162795,"test":[0.5055238699]}, +{"learn":[0.3876272814],"iteration":542,"passed_time":8.957878078,"remaining_time":3.414881698,"test":[0.5055438209]}, +{"learn":[0.3874939983],"iteration":543,"passed_time":8.972062179,"remaining_time":3.39750884,"test":[0.5055209378]}, +{"learn":[0.3873292341],"iteration":544,"passed_time":8.986271285,"remaining_time":3.380157089,"test":[0.5055484502]}, +{"learn":[0.3871057995],"iteration":545,"passed_time":8.999600943,"remaining_time":3.362488264,"test":[0.5055909795]}, +{"learn":[0.387009513],"iteration":546,"passed_time":9.013432513,"remaining_time":3.345021572,"test":[0.5055806135]}, +{"learn":[0.3868711828],"iteration":547,"passed_time":9.026843285,"remaining_time":3.327413036,"test":[0.5055978925]}, +{"learn":[0.3867208621],"iteration":548,"passed_time":9.040084345,"remaining_time":3.309757656,"test":[0.5056341497]}, +{"learn":[0.3865262797],"iteration":549,"passed_time":9.053638917,"remaining_time":3.292232333,"test":[0.5056082736]}, +{"learn":[0.3863483729],"iteration":550,"passed_time":9.067355134,"remaining_time":3.274779803,"test":[0.5055924323]}, +{"learn":[0.3861899072],"iteration":551,"passed_time":9.080884242,"remaining_time":3.257273696,"test":[0.5055709305]}, +{"learn":[0.3860593284],"iteration":552,"passed_time":9.095354566,"remaining_time":3.240117268,"test":[0.5056002069]}, +{"learn":[0.3859177807],"iteration":553,"passed_time":9.109248228,"remaining_time":3.222766521,"test":[0.5056165599]}, +{"learn":[0.38579677],"iteration":554,"passed_time":9.122397114,"remaining_time":3.205166554,"test":[0.5056055535]}, +{"learn":[0.385617264],"iteration":555,"passed_time":9.135634856,"remaining_time":3.187613601,"test":[0.5056444582]}, +{"learn":[0.3855003873],"iteration":556,"passed_time":9.148578413,"remaining_time":3.169974208,"test":[0.5056275212]}, +{"learn":[0.3853088475],"iteration":557,"passed_time":9.162232535,"remaining_time":3.152596141,"test":[0.5056138945]}, +{"learn":[0.3851622708],"iteration":558,"passed_time":9.175159111,"remaining_time":3.134982809,"test":[0.5055903046]}, +{"learn":[0.384870381],"iteration":559,"passed_time":9.188644175,"remaining_time":3.117575702,"test":[0.5055569697]}, +{"learn":[0.384713858],"iteration":560,"passed_time":9.202062373,"remaining_time":3.100160051,"test":[0.5055545583]}, +{"learn":[0.3845989351],"iteration":561,"passed_time":9.215334313,"remaining_time":3.082709699,"test":[0.5055466135]}, +{"learn":[0.3844153447],"iteration":562,"passed_time":9.228646596,"remaining_time":3.06528759,"test":[0.5055558139]}, +{"learn":[0.3842753373],"iteration":563,"passed_time":9.24313097,"remaining_time":3.048266596,"test":[0.5055552809]}, +{"learn":[0.3841330856],"iteration":564,"passed_time":9.256425565,"remaining_time":3.030865008,"test":[0.5055509626]}, +{"learn":[0.3839696176],"iteration":565,"passed_time":9.270243064,"remaining_time":3.013647922,"test":[0.5055234281]}, +{"learn":[0.3837619101],"iteration":566,"passed_time":9.284654825,"remaining_time":2.996634626,"test":[0.5055511976]}, +{"learn":[0.3836332156],"iteration":567,"passed_time":9.298382318,"remaining_time":2.979411236,"test":[0.5055726181]}, +{"learn":[0.3834369858],"iteration":568,"passed_time":9.311957632,"remaining_time":2.962151725,"test":[0.5055877355]}, +{"learn":[0.3832403734],"iteration":569,"passed_time":9.324489392,"remaining_time":2.944575597,"test":[0.5055505763]}, +{"learn":[0.3831079646],"iteration":570,"passed_time":9.338008561,"remaining_time":2.927326677,"test":[0.505570498]}, +{"learn":[0.3829356965],"iteration":571,"passed_time":9.351582848,"remaining_time":2.910107949,"test":[0.5055791179]}, +{"learn":[0.3826621061],"iteration":572,"passed_time":9.36524246,"remaining_time":2.892928299,"test":[0.5056026689]}, +{"learn":[0.382497807],"iteration":573,"passed_time":9.378530153,"remaining_time":2.875646876,"test":[0.5056031305]}, +{"learn":[0.3824122493],"iteration":574,"passed_time":9.392208332,"remaining_time":2.858498188,"test":[0.505553323]}, +{"learn":[0.3822696769],"iteration":575,"passed_time":9.406391786,"remaining_time":2.841514185,"test":[0.5055254649]}, +{"learn":[0.3820522246],"iteration":576,"passed_time":9.419740867,"remaining_time":2.824289723,"test":[0.5054505212]}, +{"learn":[0.3818821373],"iteration":577,"passed_time":9.432067788,"remaining_time":2.806774498,"test":[0.5054725183]}, +{"learn":[0.3817868214],"iteration":578,"passed_time":9.445772079,"remaining_time":2.789683982,"test":[0.5054865611]}, +{"learn":[0.381622574],"iteration":579,"passed_time":9.459278119,"remaining_time":2.772547035,"test":[0.5054893223]}, +{"learn":[0.3813760284],"iteration":580,"passed_time":9.472820099,"remaining_time":2.755433041,"test":[0.5055726699]}, +{"learn":[0.3812175079],"iteration":581,"passed_time":9.487007355,"remaining_time":2.738517587,"test":[0.5055515286]}, +{"learn":[0.3809906761],"iteration":582,"passed_time":9.515090636,"remaining_time":2.725592,"test":[0.5056011911]}, +{"learn":[0.3808943957],"iteration":583,"passed_time":9.531609379,"remaining_time":2.709327323,"test":[0.5055879554]}, +{"learn":[0.3807539477],"iteration":584,"passed_time":9.548067688,"remaining_time":2.693044732,"test":[0.5056004955]}, +{"learn":[0.3805639832],"iteration":585,"passed_time":9.568613766,"remaining_time":2.677905559,"test":[0.5056181231]}, +{"learn":[0.3803638166],"iteration":586,"passed_time":9.582761567,"remaining_time":2.66097127,"test":[0.5056573656]}, +{"learn":[0.3802362482],"iteration":587,"passed_time":9.596013375,"remaining_time":2.643799603,"test":[0.5056478758]}, +{"learn":[0.3801481063],"iteration":588,"passed_time":9.60933996,"remaining_time":2.626661687,"test":[0.5056403903]}, +{"learn":[0.3800114269],"iteration":589,"passed_time":9.622907936,"remaining_time":2.609602152,"test":[0.505644154]}, +{"learn":[0.3799221502],"iteration":590,"passed_time":9.636096652,"remaining_time":2.592452399,"test":[0.5056173362]}, +{"learn":[0.3797750682],"iteration":591,"passed_time":9.649599634,"remaining_time":2.575399902,"test":[0.5056519756]}, +{"learn":[0.3796373166],"iteration":592,"passed_time":9.66273802,"remaining_time":2.558262849,"test":[0.5056671396]}, +{"learn":[0.3795367884],"iteration":593,"passed_time":9.677330879,"remaining_time":2.541521241,"test":[0.5056660699]}, +{"learn":[0.379377213],"iteration":594,"passed_time":9.690994657,"remaining_time":2.524544827,"test":[0.5056916549]}, +{"learn":[0.3792204097],"iteration":595,"passed_time":9.704886995,"remaining_time":2.507638586,"test":[0.5056701658]}, +{"learn":[0.3790521672],"iteration":596,"passed_time":9.732754253,"remaining_time":2.494323954,"test":[0.5056717488]}, +{"learn":[0.3788710699],"iteration":597,"passed_time":9.752869715,"remaining_time":2.478990295,"test":[0.5057052327]}, +{"learn":[0.378688007],"iteration":598,"passed_time":9.775076786,"remaining_time":2.464167938,"test":[0.5057069886]}, +{"learn":[0.3785935206],"iteration":599,"passed_time":9.792442773,"remaining_time":2.448110693,"test":[0.5056979984]}, +{"learn":[0.3784156977],"iteration":600,"passed_time":9.805625037,"remaining_time":2.431011864,"test":[0.5056854665]}, +{"learn":[0.3782577791],"iteration":601,"passed_time":9.81903743,"remaining_time":2.413982624,"test":[0.5056842615]}, +{"learn":[0.3780576737],"iteration":602,"passed_time":9.831977248,"remaining_time":2.396850175,"test":[0.5056645738]}, +{"learn":[0.3778601431],"iteration":603,"passed_time":9.84484444,"remaining_time":2.379714053,"test":[0.5056574029]}, +{"learn":[0.3776589792],"iteration":604,"passed_time":9.857790408,"remaining_time":2.362610924,"test":[0.50573599]}, +{"learn":[0.377434885],"iteration":605,"passed_time":9.874457894,"remaining_time":2.346405836,"test":[0.5057289336]}, +{"learn":[0.3772646588],"iteration":606,"passed_time":9.88826979,"remaining_time":2.329526491,"test":[0.5057501134]}, +{"learn":[0.3771617804],"iteration":607,"passed_time":9.902074895,"remaining_time":2.31265565,"test":[0.5057695814]}, +{"learn":[0.3770098203],"iteration":608,"passed_time":9.917356909,"remaining_time":2.296136821,"test":[0.505762665]}, +{"learn":[0.3769221424],"iteration":609,"passed_time":9.932800487,"remaining_time":2.279659128,"test":[0.5057571164]}, +{"learn":[0.376771416],"iteration":610,"passed_time":9.94653505,"remaining_time":2.262796026,"test":[0.5057823748]}, +{"learn":[0.3767037304],"iteration":611,"passed_time":9.961952222,"remaining_time":2.24632256,"test":[0.5057899624]}, +{"learn":[0.3765630818],"iteration":612,"passed_time":9.975605073,"remaining_time":2.22945823,"test":[0.5057329957]}, +{"learn":[0.3763107012],"iteration":613,"passed_time":9.98887814,"remaining_time":2.21252024,"test":[0.5058361943]}, +{"learn":[0.3761804035],"iteration":614,"passed_time":10.00144607,"remaining_time":2.195439382,"test":[0.5058262083]}, +{"learn":[0.3760301394],"iteration":615,"passed_time":10.01545076,"remaining_time":2.178685718,"test":[0.5058404937]}, +{"learn":[0.375841275],"iteration":616,"passed_time":10.02857216,"remaining_time":2.161750563,"test":[0.5058315612]}, +{"learn":[0.3757230274],"iteration":617,"passed_time":10.04441697,"remaining_time":2.145409451,"test":[0.5058261844]}, +{"learn":[0.3755209797],"iteration":618,"passed_time":10.05830932,"remaining_time":2.128656739,"test":[0.5058420159]}, +{"learn":[0.3753748639],"iteration":619,"passed_time":10.07222086,"remaining_time":2.111917276,"test":[0.5058374679]}, +{"learn":[0.3752053593],"iteration":620,"passed_time":10.08514223,"remaining_time":2.094981236,"test":[0.5058503715]}, +{"learn":[0.3750205847],"iteration":621,"passed_time":10.09896816,"remaining_time":2.078244252,"test":[0.5058382332]}, +{"learn":[0.3748473989],"iteration":622,"passed_time":10.11262095,"remaining_time":2.061481317,"test":[0.505888554]}, +{"learn":[0.3746585471],"iteration":623,"passed_time":10.12637666,"remaining_time":2.044749134,"test":[0.5058868205]}, +{"learn":[0.3745745002],"iteration":624,"passed_time":10.13962308,"remaining_time":2.027924616,"test":[0.5058712402]}, +{"learn":[0.3744110356],"iteration":625,"passed_time":10.15293234,"remaining_time":2.011123978,"test":[0.5059055665]}, +{"learn":[0.3742598968],"iteration":626,"passed_time":10.16595259,"remaining_time":1.994277782,"test":[0.5059159343]}, +{"learn":[0.3740822124],"iteration":627,"passed_time":10.17899438,"remaining_time":1.977447953,"test":[0.5058888314]}, +{"learn":[0.3739235506],"iteration":628,"passed_time":10.19223092,"remaining_time":1.960667634,"test":[0.5058707643]}, +{"learn":[0.3737586013],"iteration":629,"passed_time":10.20517093,"remaining_time":1.943842081,"test":[0.5058791736]}, +{"learn":[0.3734855062],"iteration":630,"passed_time":10.21836219,"remaining_time":1.927076229,"test":[0.505811363]}, +{"learn":[0.3733377872],"iteration":631,"passed_time":10.23193306,"remaining_time":1.910392565,"test":[0.505811207]}, +{"learn":[0.3731745698],"iteration":632,"passed_time":10.24587598,"remaining_time":1.893787504,"test":[0.5058167211]}, +{"learn":[0.3729856746],"iteration":633,"passed_time":10.25945945,"remaining_time":1.877125074,"test":[0.5058579571]}, +{"learn":[0.3728228361],"iteration":634,"passed_time":10.27264849,"remaining_time":1.860400908,"test":[0.5059104663]}, +{"learn":[0.3726907717],"iteration":635,"passed_time":10.28675863,"remaining_time":1.843852963,"test":[0.5059304856]}, +{"learn":[0.3725425753],"iteration":636,"passed_time":10.30016484,"remaining_time":1.827187797,"test":[0.505908279]}, +{"learn":[0.3724504391],"iteration":637,"passed_time":10.31293728,"remaining_time":1.810421592,"test":[0.5058934625]}, +{"learn":[0.3723358488],"iteration":638,"passed_time":10.32594226,"remaining_time":1.793708279,"test":[0.5058838366]}, +{"learn":[0.3721377624],"iteration":639,"passed_time":10.33929663,"remaining_time":1.777066609,"test":[0.5059153462]}, +{"learn":[0.3720018746],"iteration":640,"passed_time":10.35216487,"remaining_time":1.760352529,"test":[0.5058979888]}, +{"learn":[0.3719057184],"iteration":641,"passed_time":10.36556612,"remaining_time":1.743740095,"test":[0.5059640193]}, +{"learn":[0.3718286598],"iteration":642,"passed_time":10.3786478,"remaining_time":1.72708447,"test":[0.5059731213]}, +{"learn":[0.3717219004],"iteration":643,"passed_time":10.39104709,"remaining_time":1.710327626,"test":[0.5059864599]}, +{"learn":[0.3715054562],"iteration":644,"passed_time":10.40457442,"remaining_time":1.693767928,"test":[0.5060248116]}, +{"learn":[0.3713598942],"iteration":645,"passed_time":10.4182617,"remaining_time":1.67724337,"test":[0.5060350378]}, +{"learn":[0.3712305354],"iteration":646,"passed_time":10.43159219,"remaining_time":1.660670782,"test":[0.5060239921]}, +{"learn":[0.3710254186],"iteration":647,"passed_time":10.44511268,"remaining_time":1.644138108,"test":[0.5059900137]}, +{"learn":[0.3708458548],"iteration":648,"passed_time":10.4578888,"remaining_time":1.627498874,"test":[0.5060294164]}, +{"learn":[0.3706665923],"iteration":649,"passed_time":10.47164328,"remaining_time":1.611022044,"test":[0.5060446436]}, +{"learn":[0.3704999459],"iteration":650,"passed_time":10.48505267,"remaining_time":1.594501097,"test":[0.5060366196]}, +{"learn":[0.370247796],"iteration":651,"passed_time":10.50038941,"remaining_time":1.57827939,"test":[0.5060839178]}, +{"learn":[0.3701324895],"iteration":652,"passed_time":10.51736237,"remaining_time":1.562303445,"test":[0.5060818933]}, +{"learn":[0.3699762302],"iteration":653,"passed_time":10.53111544,"remaining_time":1.545851807,"test":[0.506081043]}, +{"learn":[0.3697508254],"iteration":654,"passed_time":10.54479648,"remaining_time":1.529397963,"test":[0.5061498492]}, +{"learn":[0.3695699218],"iteration":655,"passed_time":10.55731439,"remaining_time":1.512785903,"test":[0.5061723019]}, +{"learn":[0.3693988236],"iteration":656,"passed_time":10.57685576,"remaining_time":1.497180496,"test":[0.5062147918]}, +{"learn":[0.3692143951],"iteration":657,"passed_time":10.59589234,"remaining_time":1.481492546,"test":[0.5062491974]}, +{"learn":[0.3690794117],"iteration":658,"passed_time":10.61574773,"remaining_time":1.465907501,"test":[0.506276643]}, +{"learn":[0.3688904349],"iteration":659,"passed_time":10.63598065,"remaining_time":1.450360997,"test":[0.5062644754]}, +{"learn":[0.3687211772],"iteration":660,"passed_time":10.65786479,"remaining_time":1.435022641,"test":[0.506362546]}, +{"learn":[0.3685619111],"iteration":661,"passed_time":10.6773011,"remaining_time":1.419339119,"test":[0.5063569392]}, +{"learn":[0.3683524035],"iteration":662,"passed_time":10.69818366,"remaining_time":1.403834055,"test":[0.5063857443]}, +{"learn":[0.3681662122],"iteration":663,"passed_time":10.71776161,"remaining_time":1.388143824,"test":[0.5063776314]}, +{"learn":[0.3680193499],"iteration":664,"passed_time":10.73809415,"remaining_time":1.37253835,"test":[0.5063688627]}, +{"learn":[0.3678031188],"iteration":665,"passed_time":10.75465581,"remaining_time":1.356443076,"test":[0.5063411726]}, +{"learn":[0.3676260855],"iteration":666,"passed_time":10.77335194,"remaining_time":1.34061201,"test":[0.506391077]}, +{"learn":[0.3674784863],"iteration":667,"passed_time":10.79092675,"remaining_time":1.32463472,"test":[0.5064087086]}, +{"learn":[0.3673319536],"iteration":668,"passed_time":10.81236101,"remaining_time":1.309119943,"test":[0.506398484]}, +{"learn":[0.3671497691],"iteration":669,"passed_time":10.83320943,"remaining_time":1.293517544,"test":[0.506438063]}, +{"learn":[0.3668777821],"iteration":670,"passed_time":10.85191607,"remaining_time":1.277647347,"test":[0.5064323949]}, +{"learn":[0.366799106],"iteration":671,"passed_time":10.87376646,"remaining_time":1.262133607,"test":[0.5064246685]}, +{"learn":[0.3666770671],"iteration":672,"passed_time":10.89687201,"remaining_time":1.246744643,"test":[0.5064482635]}, +{"learn":[0.3665607255],"iteration":673,"passed_time":10.91821681,"remaining_time":1.23113424,"test":[0.5064572016]}, +{"learn":[0.366450751],"iteration":674,"passed_time":10.9373045,"remaining_time":1.215256056,"test":[0.5064779297]}, +{"learn":[0.3663048737],"iteration":675,"passed_time":10.95989221,"remaining_time":1.199751514,"test":[0.5065327687]}, +{"learn":[0.3661820191],"iteration":676,"passed_time":10.97707511,"remaining_time":1.183643254,"test":[0.5065437267]}, +{"learn":[0.3660185996],"iteration":677,"passed_time":10.99527877,"remaining_time":1.167640224,"test":[0.5065448535]}, +{"learn":[0.3658993426],"iteration":678,"passed_time":11.01146714,"remaining_time":1.151419981,"test":[0.5065373813]}, +{"learn":[0.3657578988],"iteration":679,"passed_time":11.0315206,"remaining_time":1.135597708,"test":[0.5065576913]}, +{"learn":[0.3656420193],"iteration":680,"passed_time":11.04981298,"remaining_time":1.119584575,"test":[0.5065706357]}, +{"learn":[0.3654810658],"iteration":681,"passed_time":11.07063674,"remaining_time":1.103817153,"test":[0.5065769011]}, +{"learn":[0.3653016046],"iteration":682,"passed_time":11.09141163,"remaining_time":1.08803013,"test":[0.506595917]}, +{"learn":[0.365163632],"iteration":683,"passed_time":11.1096931,"remaining_time":1.07198793,"test":[0.5065812648]}, +{"learn":[0.3650449584],"iteration":684,"passed_time":11.12789828,"remaining_time":1.055931954,"test":[0.5066012763]}, +{"learn":[0.3649630095],"iteration":685,"passed_time":11.14367957,"remaining_time":1.039643575,"test":[0.5065902832]}, +{"learn":[0.3647988008],"iteration":686,"passed_time":11.16246889,"remaining_time":1.023632518,"test":[0.5065580604]}, +{"learn":[0.3647013587],"iteration":687,"passed_time":11.17971497,"remaining_time":1.007474315,"test":[0.5065551143]}, +{"learn":[0.3645537531],"iteration":688,"passed_time":11.2057256,"remaining_time":0.9920889135,"test":[0.50658621]}, +{"learn":[0.3643922371],"iteration":689,"passed_time":11.22569338,"remaining_time":0.9761472506,"test":[0.50657265]}, +{"learn":[0.3642050082],"iteration":690,"passed_time":11.24778969,"remaining_time":0.9603756758,"test":[0.5065772572]}, +{"learn":[0.3640578903],"iteration":691,"passed_time":11.26913607,"remaining_time":0.9445229655,"test":[0.5065208501]}, +{"learn":[0.3639359832],"iteration":692,"passed_time":11.28775011,"remaining_time":0.9284296626,"test":[0.5064912521]}, +{"learn":[0.363838056],"iteration":693,"passed_time":11.305819,"remaining_time":0.9122851063,"test":[0.5064764657]}, +{"learn":[0.3637076899],"iteration":694,"passed_time":11.324445,"remaining_time":0.8961791008,"test":[0.5064661015]}, +{"learn":[0.3635879928],"iteration":695,"passed_time":11.34497111,"remaining_time":0.880213276,"test":[0.5064367103]}, +{"learn":[0.3633801607],"iteration":696,"passed_time":11.36466561,"remaining_time":0.8641711294,"test":[0.5064394748]}, +{"learn":[0.3632430369],"iteration":697,"passed_time":11.38287109,"remaining_time":0.8480075885,"test":[0.5064420273]}, +{"learn":[0.3631584444],"iteration":698,"passed_time":11.39878708,"remaining_time":0.8316711603,"test":[0.506490273]}, +{"learn":[0.3629197967],"iteration":699,"passed_time":11.42077534,"remaining_time":0.8157696671,"test":[0.5065930782]}, +{"learn":[0.3627817688],"iteration":700,"passed_time":11.43594098,"remaining_time":0.7993739057,"test":[0.5066165033]}, +{"learn":[0.3626405338],"iteration":701,"passed_time":11.45254394,"remaining_time":0.7830799273,"test":[0.5066243897]}, +{"learn":[0.3625273179],"iteration":702,"passed_time":11.4740333,"remaining_time":0.7671117571,"test":[0.5066113422]}, +{"learn":[0.3623957062],"iteration":703,"passed_time":11.49223869,"remaining_time":0.7509133232,"test":[0.5066070501]}, +{"learn":[0.3623111402],"iteration":704,"passed_time":11.51748274,"remaining_time":0.7351584728,"test":[0.5066068464]}, +{"learn":[0.3622124003],"iteration":705,"passed_time":11.5340406,"remaining_time":0.7188353916,"test":[0.5065816363]}, +{"learn":[0.3621099502],"iteration":706,"passed_time":11.55634092,"remaining_time":0.7028609047,"test":[0.5065955447]}, +{"learn":[0.362021043],"iteration":707,"passed_time":11.57327907,"remaining_time":0.6865504531,"test":[0.5066075589]}, +{"learn":[0.3618692858],"iteration":708,"passed_time":11.59537145,"remaining_time":0.6705362895,"test":[0.5066564799]}, +{"learn":[0.361670701],"iteration":709,"passed_time":11.61438839,"remaining_time":0.6543317405,"test":[0.5066405539]}, +{"learn":[0.3615273603],"iteration":710,"passed_time":11.63366934,"remaining_time":0.6381337614,"test":[0.5066439931]}, +{"learn":[0.3613907674],"iteration":711,"passed_time":11.65214249,"remaining_time":0.621884009,"test":[0.5066163882]}, +{"learn":[0.361319107],"iteration":712,"passed_time":11.67217509,"remaining_time":0.6057089457,"test":[0.5066320475]}, +{"learn":[0.3612447763],"iteration":713,"passed_time":11.69168998,"remaining_time":0.5894969736,"test":[0.5066122738]}, +{"learn":[0.3611296843],"iteration":714,"passed_time":11.71303793,"remaining_time":0.5733654929,"test":[0.506662354]}, +{"learn":[0.3610371417],"iteration":715,"passed_time":11.73244261,"remaining_time":0.5571271629,"test":[0.5066548912]}, +{"learn":[0.3609221171],"iteration":716,"passed_time":11.75192552,"remaining_time":0.5408836013,"test":[0.5066455097]}, +{"learn":[0.360775383],"iteration":717,"passed_time":11.76947311,"remaining_time":0.5245447627,"test":[0.506652337]}, +{"learn":[0.3605754063],"iteration":718,"passed_time":11.78288565,"remaining_time":0.508024277,"test":[0.506635886]}, +{"learn":[0.360526686],"iteration":719,"passed_time":11.79565717,"remaining_time":0.4914857155,"test":[0.5066322706]}, +{"learn":[0.3603259902],"iteration":720,"passed_time":11.80940086,"remaining_time":0.474996706,"test":[0.5066180485]}, +{"learn":[0.3601968411],"iteration":721,"passed_time":11.82275285,"remaining_time":0.4585001106,"test":[0.506687771]}, +{"learn":[0.3600891472],"iteration":722,"passed_time":11.83746003,"remaining_time":0.4420628226,"test":[0.5066837762]}, +{"learn":[0.3599092762],"iteration":723,"passed_time":11.85082016,"remaining_time":0.4255819394,"test":[0.5067004981]}, +{"learn":[0.3597394541],"iteration":724,"passed_time":11.86424006,"remaining_time":0.4091117262,"test":[0.5067077301]}, +{"learn":[0.3596019534],"iteration":725,"passed_time":11.87875964,"remaining_time":0.392686269,"test":[0.5067600953]}, +{"learn":[0.3594025812],"iteration":726,"passed_time":11.89272972,"remaining_time":0.3762486706,"test":[0.5067874665]}, +{"learn":[0.3593026302],"iteration":727,"passed_time":11.90838784,"remaining_time":0.3598688633,"test":[0.506794877]}, +{"learn":[0.3592546028],"iteration":728,"passed_time":11.92385468,"remaining_time":0.3434855258,"test":[0.5068271825]}, +{"learn":[0.3591605646],"iteration":729,"passed_time":11.93719086,"remaining_time":0.3270463251,"test":[0.5068130183]}, +{"learn":[0.3590715553],"iteration":730,"passed_time":11.95094601,"remaining_time":0.3106265037,"test":[0.5067961769]}, +{"learn":[0.3588811257],"iteration":731,"passed_time":11.96512223,"remaining_time":0.2942243172,"test":[0.5068155207]}, +{"learn":[0.3587866435],"iteration":732,"passed_time":11.97910621,"remaining_time":0.2778237456,"test":[0.5068171227]}, +{"learn":[0.3586846684],"iteration":733,"passed_time":11.99203081,"remaining_time":0.2614066662,"test":[0.5067780059]}, +{"learn":[0.3586195871],"iteration":734,"passed_time":12.00508038,"remaining_time":0.2450016405,"test":[0.5067653397]}, +{"learn":[0.3585495326],"iteration":735,"passed_time":12.01935576,"remaining_time":0.2286290497,"test":[0.5067658151]}, +{"learn":[0.358453216],"iteration":736,"passed_time":12.03616598,"remaining_time":0.2123068626,"test":[0.5067302102]}, +{"learn":[0.3583029375],"iteration":737,"passed_time":12.05681764,"remaining_time":0.1960458153,"test":[0.5067940636]}, +{"learn":[0.3581825124],"iteration":738,"passed_time":12.07445894,"remaining_time":0.1797280762,"test":[0.5067772327]}, +{"learn":[0.3580924639],"iteration":739,"passed_time":12.09548998,"remaining_time":0.1634525673,"test":[0.5067681236]}, +{"learn":[0.3579736363],"iteration":740,"passed_time":12.11143237,"remaining_time":0.1471024175,"test":[0.5067847726]}, +{"learn":[0.3577930724],"iteration":741,"passed_time":12.12418788,"remaining_time":0.1307190068,"test":[0.5068466694]}, +{"learn":[0.357618741],"iteration":742,"passed_time":12.13723212,"remaining_time":0.1143480819,"test":[0.5068696274]}, +{"learn":[0.3575136396],"iteration":743,"passed_time":12.15109685,"remaining_time":0.09799271657,"test":[0.5068787367]}, +{"learn":[0.3574083062],"iteration":744,"passed_time":12.18313488,"remaining_time":0.0817660059,"test":[0.5068937266]}, +{"learn":[0.3573171639],"iteration":745,"passed_time":12.19878295,"remaining_time":0.06540902385,"test":[0.5069102218]}, +{"learn":[0.3572187265],"iteration":746,"passed_time":12.21460906,"remaining_time":0.04905465484,"test":[0.506920434]}, +{"learn":[0.3570174772],"iteration":747,"passed_time":12.22794775,"remaining_time":0.03269504745,"test":[0.5069131869]}, +{"learn":[0.3567920586],"iteration":748,"passed_time":12.24135976,"remaining_time":0.01634360448,"test":[0.5069337199]}, +{"learn":[0.3565318945],"iteration":749,"passed_time":12.25415989,"remaining_time":0,"test":[0.5068883366]} ]} \ No newline at end of file diff --git a/catboost_info/learn/events.out.tfevents b/catboost_info/learn/events.out.tfevents index 5b440bc..e22d595 100644 Binary files a/catboost_info/learn/events.out.tfevents and b/catboost_info/learn/events.out.tfevents differ diff --git a/catboost_info/learn_error.tsv b/catboost_info/learn_error.tsv index 29a165b..fca1eeb 100644 --- a/catboost_info/learn_error.tsv +++ b/catboost_info/learn_error.tsv @@ -1,829 +1,751 @@ iter Logloss -0 0.6890148066 -1 0.6847203588 -2 0.6805131174 -3 0.6765803301 -4 0.672688954 -5 0.6687407432 -6 0.6648982259 -7 0.6610826468 -8 0.6574268492 -9 0.65394726 -10 0.6507643624 -11 0.6472299985 -12 0.6437878061 -13 0.640600947 -14 0.637173016 -15 0.6339055531 -16 0.6307334308 -17 0.6279293074 -18 0.6248787246 -19 0.6219098548 -20 0.6189836637 -21 0.616222272 -22 0.6133246039 -23 0.6107683661 -24 0.6082103325 -25 0.6056643419 -26 0.6030026748 -27 0.6006296178 -28 0.5981683509 -29 0.5957749581 -30 0.5935372267 -31 0.5913527909 -32 0.589131064 -33 0.5869613123 -34 0.5849154242 -35 0.5827890907 -36 0.5805853755 -37 0.5785595591 -38 0.5765794322 -39 0.5745794977 -40 0.5726601141 -41 0.5707947657 -42 0.5690099154 -43 0.5671066949 -44 0.5655948198 -45 0.5637785414 -46 0.5620515294 -47 0.5604507578 -48 0.5588915557 -49 0.5573862832 -50 0.5557730988 -51 0.5542890073 -52 0.5528272586 -53 0.5513183415 -54 0.5497871871 -55 0.5484578589 -56 0.5470301794 -57 0.5456861672 -58 0.5441976387 -59 0.5428836813 -60 0.5415324327 -61 0.5401875226 -62 0.539078455 -63 0.5379310928 -64 0.5367787126 -65 0.5356254873 -66 0.5344064479 -67 0.5334278464 -68 0.5322656417 -69 0.5311180153 -70 0.530093513 -71 0.5290449247 -72 0.5279487981 -73 0.5270186329 -74 0.5260421971 -75 0.5250840899 -76 0.5241200668 -77 0.5232151497 -78 0.5223893573 -79 0.5217720995 -80 0.5210962111 -81 0.5201933011 -82 0.5194253998 -83 0.5185833388 -84 0.5179518723 -85 0.5171273476 -86 0.5163828985 -87 0.515581826 -88 0.5148885069 -89 0.5141455896 -90 0.5133925308 -91 0.5126036598 -92 0.5119108689 -93 0.511192513 -94 0.5104440496 -95 0.5096263916 -96 0.5089504503 -97 0.508298067 -98 0.5076842424 -99 0.5070971978 -100 0.5064180874 -101 0.5058459908 -102 0.50521463 -103 0.5046090454 -104 0.5039198463 -105 0.5032194493 -106 0.5025859228 -107 0.5019990366 -108 0.5015241822 -109 0.5009603784 -110 0.5004143223 -111 0.4998890246 -112 0.4994227799 -113 0.4989407948 -114 0.498384069 -115 0.4979274376 -116 0.4974348356 -117 0.4968953292 -118 0.4963974452 -119 0.4959457261 -120 0.495519572 -121 0.4950652647 -122 0.4946823177 -123 0.4942624492 -124 0.4938697304 -125 0.4934123595 -126 0.4929984069 -127 0.4925803872 -128 0.4921483701 -129 0.4916839213 -130 0.4913673693 -131 0.4908799965 -132 0.4904615014 -133 0.4900727969 -134 0.4896833529 -135 0.4893555503 -136 0.488954433 -137 0.4887286263 -138 0.488321329 -139 0.4879829095 -140 0.4875670025 -141 0.4873085001 -142 0.4869168904 -143 0.486518467 -144 0.4861425979 -145 0.4858837256 -146 0.4855419256 -147 0.4852116931 -148 0.484938401 -149 0.4845426186 -150 0.4842311373 -151 0.4839309068 -152 0.4836141436 -153 0.4832906721 -154 0.4830399871 -155 0.482840432 -156 0.4825772285 -157 0.4822856077 -158 0.4820066638 -159 0.481777952 -160 0.4815088326 -161 0.4811545141 -162 0.4808466247 -163 0.480584953 -164 0.4802866768 -165 0.4800326112 -166 0.4797512376 -167 0.4794567117 -168 0.4791987374 -169 0.4789246529 -170 0.4787111533 -171 0.4784767897 -172 0.4782688891 -173 0.4780129748 -174 0.4777808824 -175 0.4775515896 -176 0.4772707969 -177 0.4770373313 -178 0.4767772442 -179 0.476497772 -180 0.4762753986 -181 0.4760106634 -182 0.4757992238 -183 0.4755742622 -184 0.4753871199 -185 0.4752141334 -186 0.4748972117 -187 0.4746180037 -188 0.4744396824 -189 0.4742329438 -190 0.474052721 -191 0.4738736602 -192 0.4735943465 -193 0.4733345764 -194 0.4731217634 -195 0.4729052003 -196 0.4726750095 -197 0.4724771447 -198 0.472306588 -199 0.4721346051 -200 0.4718955933 -201 0.4716859496 -202 0.4714805843 -203 0.471280818 -204 0.4711345586 -205 0.4709766788 -206 0.4708556675 -207 0.4706085214 -208 0.4704746748 -209 0.4703067063 -210 0.4701873852 -211 0.4699815974 -212 0.4697822537 -213 0.4696142323 -214 0.4693953451 -215 0.4692302288 -216 0.4690629998 -217 0.468853673 -218 0.4686768307 -219 0.468512454 -220 0.4682854852 -221 0.4680980788 -222 0.4679088237 -223 0.4677077369 -224 0.4675551919 -225 0.4673934034 -226 0.4673336108 -227 0.4671836012 -228 0.4670666043 -229 0.4669395187 -230 0.4667662153 -231 0.4666467358 -232 0.466536183 -233 0.4663676334 -234 0.4661768994 -235 0.4660384046 -236 0.4658624074 -237 0.4657251803 -238 0.4655313826 -239 0.465325542 -240 0.4651989846 -241 0.4650546267 -242 0.4648722911 -243 0.4647227041 -244 0.4645644545 -245 0.464447035 -246 0.464317995 -247 0.4641463291 -248 0.4639036727 -249 0.4637813937 -250 0.4636937121 -251 0.463614957 -252 0.4635092636 -253 0.4633952246 -254 0.4632521345 -255 0.4631547867 -256 0.4630138093 -257 0.4628916888 -258 0.4627510812 -259 0.4626029731 -260 0.4625061007 -261 0.4623717259 -262 0.4622839914 -263 0.4622010108 -264 0.4621094732 -265 0.4619561359 -266 0.461855883 -267 0.4617580598 -268 0.4616690048 -269 0.4615131322 -270 0.4613585272 -271 0.4612326036 -272 0.4610718187 -273 0.4609134635 -274 0.4607590698 -275 0.4606531651 -276 0.4605304636 -277 0.4604467434 -278 0.4603158019 -279 0.4601732928 -280 0.4599872597 -281 0.459809361 -282 0.4595980271 -283 0.4594952916 -284 0.4593488209 -285 0.4591309373 -286 0.4589785507 -287 0.4588693712 -288 0.4587822177 -289 0.4586388635 -290 0.4584244131 -291 0.4582788404 -292 0.4581941167 -293 0.4581090232 -294 0.4580109359 -295 0.4579066158 -296 0.4578431787 -297 0.4576744707 -298 0.4575625445 -299 0.4573806314 -300 0.4572719273 -301 0.4571713575 -302 0.45706334 -303 0.4569449697 -304 0.4568074785 -305 0.4566027471 -306 0.4565386761 -307 0.4564468744 -308 0.4562576721 -309 0.4561567326 -310 0.4559678472 -311 0.455821535 -312 0.4557563548 -313 0.4555635608 -314 0.4554664243 -315 0.4553908384 -316 0.4552511288 -317 0.4551686235 -318 0.4550458163 -319 0.4549037826 -320 0.4548248691 -321 0.4547239295 -322 0.454637357 -323 0.454509215 -324 0.4543753156 -325 0.4542463813 -326 0.4540974281 -327 0.4540544852 -328 0.4539036833 -329 0.4538263544 -330 0.4537480747 -331 0.4535955825 -332 0.4535004004 -333 0.4534363294 -334 0.4533120961 -335 0.4532527789 -336 0.4531084739 -337 0.4529905262 -338 0.4529275116 -339 0.4528593206 -340 0.4527550533 -341 0.4526868095 -342 0.4525645305 -343 0.4524657038 -344 0.4524050661 -345 0.4523432664 -346 0.4521117022 -347 0.4520467333 -348 0.4519960258 -349 0.4519254051 -350 0.451832547 -351 0.4516634165 -352 0.4515800132 -353 0.4514333841 -354 0.4513670947 -355 0.4512602392 -356 0.4510774282 -357 0.4510062793 -358 0.4508566394 -359 0.4507985371 -360 0.4506634756 -361 0.450561955 -362 0.4504481273 -363 0.4503394232 -364 0.4502420754 -365 0.4501235995 -366 0.450039668 -367 0.4499925523 -368 0.4498961025 -369 0.4497756722 -370 0.4496452061 -371 0.4495702542 -372 0.4495049155 -373 0.4494208256 -374 0.4492928948 -375 0.449179384 -376 0.4491512836 -377 0.4490658732 -378 0.448954845 -379 0.4488382178 -380 0.4486912718 -381 0.448673577 -382 0.4486297361 -383 0.4485145879 -384 0.4483253856 -385 0.4482166815 -386 0.4481055476 -387 0.4480823067 -388 0.4480307013 -389 0.4479079469 -390 0.4478744589 -391 0.4478029402 -392 0.4477255056 -393 0.4475660412 -394 0.4474494668 -395 0.4473260786 -396 0.4472822378 -397 0.4471496589 -398 0.4471022263 -399 0.447030285 -400 0.4469258065 -401 0.4469129184 -402 0.446814567 -403 0.4467275192 -404 0.4466951931 -405 0.4466253647 -406 0.4465769813 -407 0.4465089488 -408 0.4464336271 -409 0.4464006672 -410 0.4463606294 -411 0.4460767204 -412 0.4459628927 -413 0.4458279897 -414 0.4457970898 -415 0.4457433188 -416 0.4455423376 -417 0.445509008 -418 0.445434637 -419 0.4454038956 -420 0.4453823449 -421 0.4452761233 -422 0.4451756591 -423 0.4451443895 -424 0.4450389074 -425 0.4450113352 -426 0.4449789564 -427 0.4449239177 -428 0.4448193335 -429 0.4447422159 -430 0.4446471394 -431 0.4445214271 -432 0.4443971409 -433 0.4443232982 -434 0.4442969409 -435 0.4442356165 -436 0.4441891875 -437 0.4441385328 -438 0.4438870026 -439 0.4437075193 -440 0.4436420749 -441 0.4435003053 -442 0.4433527254 -443 0.4433024933 -444 0.4432446023 -445 0.4431795277 -446 0.4431337325 -447 0.4430164187 -448 0.4428659601 -449 0.4428225946 -450 0.4426428472 -451 0.4424738223 -452 0.4424119433 -453 0.4422576024 -454 0.4422291059 -455 0.4421624731 -456 0.442123254 -457 0.4420691925 -458 0.4419895923 -459 0.4418486414 -460 0.4418192733 -461 0.4417889808 -462 0.4417187035 -463 0.4416921613 -464 0.441611267 -465 0.4415747418 -466 0.4414475505 -467 0.441401412 -468 0.441264898 -469 0.4412250979 -470 0.4411516777 -471 0.4411195894 -472 0.4409704513 -473 0.4409550013 -474 0.4409130092 -475 0.4406579401 -476 0.4406162913 -477 0.4405363742 -478 0.4403470663 -479 0.4403139479 -480 0.4402780301 -481 0.4402373057 -482 0.4400009349 -483 0.4398747737 -484 0.439848073 -485 0.4397764751 -486 0.4396613797 -487 0.4396378483 -488 0.4396095366 -489 0.4394663144 -490 0.4394229489 -491 0.4393754107 -492 0.4392023978 -493 0.4391009301 -494 0.4390324221 -495 0.4389297659 -496 0.438822303 -497 0.4387215219 -498 0.4386502938 -499 0.4385849551 -500 0.4384856265 -501 0.4384638118 -502 0.4384542777 -503 0.4384396993 -504 0.4382679277 -505 0.4382344397 -506 0.4381823589 -507 0.4381218796 -508 0.4379384348 -509 0.4378280668 -510 0.4377054973 -511 0.4376783741 -512 0.437517193 -513 0.4374509828 -514 0.4373832143 -515 0.437317638 -516 0.4372261532 -517 0.4370933894 -518 0.4370755626 -519 0.4370412294 -520 0.4370063944 -521 0.4369962265 -522 0.4368221837 -523 0.4368066017 -524 0.4367131362 -525 0.4365742981 -526 0.4365688048 -527 0.4364445979 -528 0.4363200476 -529 0.4363052844 -530 0.4362704758 -531 0.4361591042 -532 0.4361454766 -533 0.436116267 -534 0.4360903322 -535 0.4360751992 -536 0.4360617036 -537 0.4360393342 -538 0.4359319506 -539 0.4359098189 -540 0.4358879777 -541 0.4358591906 -542 0.4357868268 -543 0.4357649328 -544 0.4357355383 -545 0.4357061703 -546 0.4356943913 -547 0.4356770135 -548 0.4355669096 -549 0.4354876263 -550 0.4353802163 -551 0.4353536477 -552 0.4352718554 -553 0.4352601293 -554 0.4351814007 -555 0.4350829701 -556 0.4350163901 -557 0.4349806044 -558 0.4349619324 -559 0.4349292103 -560 0.4348939791 -561 0.4348553939 -562 0.4348175482 -563 0.4347966842 -564 0.4347820793 -565 0.4347550354 -566 0.434640072 -567 0.4345157331 -568 0.4344660292 -569 0.4344279721 -570 0.4344101453 -571 0.4343892021 -572 0.4343576948 -573 0.434319717 -574 0.4343054555 -575 0.4342626975 -576 0.4342437878 -577 0.4342213128 -578 0.4340750006 -579 0.4340425689 -580 0.4338611577 -581 0.4338519405 -582 0.433827115 -583 0.4338011538 -584 0.433731431 -585 0.433711148 -586 0.4335983503 -587 0.4335714648 -588 0.4335145773 -589 0.4335001838 -590 0.4334615194 -591 0.4334292726 -592 0.433355958 -593 0.4332864465 -594 0.4332533018 -595 0.4332404665 -596 0.4332047335 -597 0.4331100004 -598 0.4330618283 -599 0.4329813566 -600 0.4329375949 -601 0.4328643596 -602 0.4328343577 -603 0.4327723731 -604 0.4326699546 -605 0.4326482718 -606 0.4326162627 -607 0.4325593753 -608 0.4325217672 -609 0.4324898902 -610 0.432462899 -611 0.4324404768 -612 0.432319492 -613 0.4322954323 -614 0.4322757568 -615 0.4322003294 -616 0.4321096634 -617 0.4320241473 -618 0.4319246867 -619 0.4319043509 -620 0.4318645772 -621 0.4318527191 -622 0.4317747035 -623 0.4316558843 -624 0.4315540468 -625 0.4314164499 -626 0.4312442294 -627 0.4310994226 -628 0.4310544989 -629 0.4309213918 -630 0.4308180225 -631 0.4307432026 -632 0.4306346833 -633 0.4306206331 -634 0.4305275901 -635 0.43043357 -636 0.4304329362 -637 0.4302760071 -638 0.4302078954 -639 0.4300681065 -640 0.429970653 -641 0.4298872234 -642 0.4298472649 -643 0.4297527694 -644 0.4295976362 -645 0.4295214165 -646 0.4294417107 -647 0.4293799638 -648 0.429299809 -649 0.429247332 -650 0.4291443589 -651 0.4290760623 -652 0.4290398804 -653 0.4290189635 -654 0.4289683617 -655 0.4289028381 -656 0.4288822118 -657 0.4288735493 -658 0.4288645698 -659 0.4288562506 -660 0.4288491727 -661 0.4287641585 -662 0.4286659656 -663 0.4285943941 -664 0.4285142921 -665 0.4283223432 -666 0.4283110661 -667 0.428259223 -668 0.4282528581 -669 0.4282018865 -670 0.4281657839 -671 0.4280525636 -672 0.4280197358 -673 0.4279914769 -674 0.427947504 -675 0.4278836707 -676 0.4278484396 -677 0.4277037648 -678 0.4276718878 -679 0.427630688 -680 0.4275809577 -681 0.427435517 -682 0.4274095558 -683 0.4272571429 -684 0.4270680727 -685 0.4269497024 -686 0.4269316643 -687 0.426759206 -688 0.4266562593 -689 0.4266057367 -690 0.426553339 -691 0.426371109 -692 0.4262375529 -693 0.4261506635 -694 0.4260540816 -695 0.4259921763 -696 0.4259774394 -697 0.4259145833 -698 0.4258337418 -699 0.4257358394 -700 0.4257053357 -701 0.4256336322 -702 0.4255836113 -703 0.4255506515 -704 0.4254606193 -705 0.4254141903 -706 0.4253959409 -707 0.4252997023 -708 0.4252814265 -709 0.4252647881 -710 0.4251700813 -711 0.4250955783 -712 0.4250570723 -713 0.4250100359 -714 0.4249343972 -715 0.4248776682 -716 0.4248694283 -717 0.4247914655 -718 0.4246726199 -719 0.4245407012 -720 0.4244753625 -721 0.4243575469 -722 0.4242633155 -723 0.424240233 -724 0.4241992709 -725 0.4241074956 -726 0.4240404931 -727 0.42393031 -728 0.4239178708 -729 0.4239140149 -730 0.4239044809 -731 0.4238038318 -732 0.4237197683 -733 0.4236491476 -734 0.4235076684 -735 0.4234852462 -736 0.4233596396 -737 0.4233348933 -738 0.4232898376 -739 0.4232752064 -740 0.4232446762 -741 0.4231698827 -742 0.4231612202 -743 0.4231252232 -744 0.4230553683 -745 0.4229820274 -746 0.4228979903 -747 0.4228754889 -748 0.4228285316 -749 0.422737892 -750 0.4227054339 -751 0.42266088 -752 0.4226499462 -753 0.4226380881 -754 0.4226201028 -755 0.4224594235 -756 0.4223844715 -757 0.4222138884 -758 0.4222038789 -759 0.4221771518 -760 0.4220064631 -761 0.421896861 -762 0.4217953404 -763 0.4217521334 -764 0.4217373437 -765 0.4217011882 -766 0.4214749854 -767 0.4213856134 -768 0.421343727 -769 0.4212649983 -770 0.4212258321 -771 0.4211926873 -772 0.4211249982 -773 0.4210057035 -774 0.4209475748 -775 0.420885062 -776 0.420796456 -777 0.4207291365 -778 0.4206566143 -779 0.4206186101 -780 0.4205757728 -781 0.4205614321 -782 0.4205344673 -783 0.4204987872 -784 0.4204069856 -785 0.4203492002 -786 0.4202999189 -787 0.4202198433 -788 0.4201142292 -789 0.4200955572 -790 0.4200499469 -791 0.4200050496 -792 0.4199278792 -793 0.4198836686 -794 0.4198192279 -795 0.4196765074 -796 0.4195982278 -797 0.4195228004 -798 0.4195053433 -799 0.4194624532 -800 0.4193548847 -801 0.4192917645 -802 0.419209761 -803 0.4191837206 -804 0.4191599779 -805 0.4190924207 -806 0.4190169933 -807 0.4188821432 -808 0.4188419469 -809 0.4188101227 -810 0.4187462366 -811 0.4186743217 -812 0.4185873003 -813 0.4184733405 -814 0.418273046 -815 0.4182632479 -816 0.4182081035 -817 0.4181965887 -818 0.4180534457 -819 0.4179831947 -820 0.4179211309 -821 0.4178890425 -822 0.41782822 -823 0.417766341 -824 0.4176146147 -825 0.4175319246 -826 0.4175083403 -827 0.4174706002 +0 0.6887420255 +1 0.6845313601 +2 0.6801631898 +3 0.6760074248 +4 0.6720347848 +5 0.6680466053 +6 0.6640517926 +7 0.6603452074 +8 0.6565538878 +9 0.6528791074 +10 0.6494508161 +11 0.6458923403 +12 0.6424301163 +13 0.6391311215 +14 0.6357000076 +15 0.6325054691 +16 0.6294132342 +17 0.626404362 +18 0.62343153 +19 0.6205350324 +20 0.6176066 +21 0.614649737 +22 0.6116950647 +23 0.6089795787 +24 0.6062858885 +25 0.60352147 +26 0.6009605704 +27 0.5983309886 +28 0.5959595359 +29 0.5936561858 +30 0.5912893384 +31 0.5888712298 +32 0.5865368562 +33 0.5843027111 +34 0.58219542 +35 0.5801054968 +36 0.5779997103 +37 0.5759875314 +38 0.5740081792 +39 0.5719981747 +40 0.5701013987 +41 0.5682769473 +42 0.5665753932 +43 0.5649332763 +44 0.5631859614 +45 0.5613679298 +46 0.5595688223 +47 0.5577250902 +48 0.5561233393 +49 0.554371619 +50 0.5526478209 +51 0.5510913668 +52 0.5495930483 +53 0.5479230842 +54 0.5465057255 +55 0.5450050095 +56 0.5435639391 +57 0.5420243158 +58 0.5407417848 +59 0.5393912145 +60 0.5381304083 +61 0.5368665922 +62 0.5355829807 +63 0.5343600623 +64 0.5331252354 +65 0.5318046511 +66 0.5306063092 +67 0.529392964 +68 0.5281617397 +69 0.5270139084 +70 0.5259682808 +71 0.524819647 +72 0.5237458663 +73 0.5226796548 +74 0.5217408877 +75 0.5206912763 +76 0.5196831057 +77 0.5185980704 +78 0.5175740292 +79 0.5165824105 +80 0.5156979463 +81 0.5147492197 +82 0.5138594048 +83 0.5129413884 +84 0.5118771264 +85 0.5109928968 +86 0.5101972566 +87 0.509304983 +88 0.508403116 +89 0.5076756068 +90 0.5067898705 +91 0.5059787727 +92 0.5052218222 +93 0.5045131307 +94 0.5037981856 +95 0.5031235205 +96 0.502355264 +97 0.5016398252 +98 0.5009112756 +99 0.5002412868 +100 0.499602125 +101 0.4989857252 +102 0.4982754047 +103 0.4976294442 +104 0.4969524754 +105 0.4962424857 +106 0.4956216184 +107 0.4949101095 +108 0.4942124723 +109 0.4936275048 +110 0.4930498818 +111 0.4925428568 +112 0.491967713 +113 0.4914833541 +114 0.4908770705 +115 0.4902524062 +116 0.4896965752 +117 0.4892062558 +118 0.488655007 +119 0.4880496918 +120 0.4873278203 +121 0.4865669175 +122 0.4859760729 +123 0.4854961709 +124 0.4849485532 +125 0.4843656862 +126 0.4838616276 +127 0.4833659572 +128 0.4828076399 +129 0.482390817 +130 0.4817595219 +131 0.4812195403 +132 0.4807913452 +133 0.4803108667 +134 0.4798747699 +135 0.4794247267 +136 0.4789737946 +137 0.4786100041 +138 0.4781338325 +139 0.4777144694 +140 0.4772253587 +141 0.4768021942 +142 0.476388262 +143 0.4759714004 +144 0.475431571 +145 0.4749809065 +146 0.4745393871 +147 0.474003352 +148 0.4735373498 +149 0.4731374872 +150 0.4728223679 +151 0.4724526018 +152 0.4719966757 +153 0.4715576887 +154 0.4710649914 +155 0.4707287854 +156 0.4703834295 +157 0.4699588754 +158 0.4696388981 +159 0.4693226175 +160 0.4689524445 +161 0.4686236024 +162 0.4683142686 +163 0.4679910532 +164 0.4676677298 +165 0.4673718834 +166 0.4669427779 +167 0.4666767048 +168 0.4663064015 +169 0.4659312275 +170 0.4656705809 +171 0.4652465085 +172 0.4650451777 +173 0.4647616802 +174 0.4644278974 +175 0.4641460887 +176 0.4638836765 +177 0.4635819234 +178 0.4632258901 +179 0.4628348788 +180 0.4625121699 +181 0.4621199381 +182 0.4617829533 +183 0.4614975822 +184 0.4611131437 +185 0.4608496316 +186 0.4605369646 +187 0.4601458215 +188 0.4597624349 +189 0.4594017188 +190 0.4590986478 +191 0.458871558 +192 0.4585291535 +193 0.4582507871 +194 0.4577670833 +195 0.4573552868 +196 0.4570586224 +197 0.4567360206 +198 0.4564790645 +199 0.4562052319 +200 0.4558385717 +201 0.4556050195 +202 0.4553470974 +203 0.4550677312 +204 0.4547538266 +205 0.4545645288 +206 0.454310185 +207 0.4539858028 +208 0.4537538627 +209 0.4535002568 +210 0.4532137743 +211 0.4529660485 +212 0.4525677428 +213 0.452363306 +214 0.4521308076 +215 0.4519454634 +216 0.4516869 +217 0.4513456365 +218 0.4511515965 +219 0.4508380443 +220 0.4505548092 +221 0.450231633 +222 0.449987132 +223 0.4498286158 +224 0.4494291653 +225 0.4490756119 +226 0.448790225 +227 0.448536949 +228 0.4482886262 +229 0.4479321641 +230 0.4476288243 +231 0.4474873064 +232 0.44722003 +233 0.4470227771 +234 0.4467327833 +235 0.446376796 +236 0.4462349048 +237 0.4460757884 +238 0.4458567985 +239 0.4455680533 +240 0.4452942488 +241 0.4449435518 +242 0.4447585725 +243 0.4445399232 +244 0.444306535 +245 0.4441202568 +246 0.443883728 +247 0.4436529307 +248 0.4435158786 +249 0.4432327381 +250 0.4429902112 +251 0.4427420796 +252 0.4424702177 +253 0.4423083471 +254 0.4421101175 +255 0.4418919875 +256 0.4415448888 +257 0.4412573817 +258 0.4409419352 +259 0.4407464667 +260 0.4405379441 +261 0.4403936668 +262 0.440059057 +263 0.4397934991 +264 0.4395733139 +265 0.4393844922 +266 0.4390924669 +267 0.4387959426 +268 0.4385667974 +269 0.4383935673 +270 0.4381585014 +271 0.4380082448 +272 0.4377934947 +273 0.4375961378 +274 0.4372862834 +275 0.4370547882 +276 0.4368295248 +277 0.4365794699 +278 0.4363640315 +279 0.4361651466 +280 0.4359370168 +281 0.4357486506 +282 0.4355085083 +283 0.4352722663 +284 0.4351393712 +285 0.4348630598 +286 0.4346807352 +287 0.4344185767 +288 0.4341359841 +289 0.4338623346 +290 0.4337079707 +291 0.4335635279 +292 0.433154013 +293 0.4329367804 +294 0.4326557226 +295 0.4324998537 +296 0.4323228151 +297 0.4321801401 +298 0.4319104002 +299 0.4316349583 +300 0.4314016309 +301 0.4311052053 +302 0.4309243409 +303 0.4307034747 +304 0.4303358466 +305 0.4302018177 +306 0.4299838146 +307 0.4297543996 +308 0.4296233818 +309 0.4294392198 +310 0.4292792296 +311 0.4291012739 +312 0.4289252984 +313 0.4287672954 +314 0.4286382925 +315 0.4284289564 +316 0.4282400846 +317 0.4280665265 +318 0.427873199 +319 0.4275917432 +320 0.4274178552 +321 0.427225394 +322 0.4269689983 +323 0.4268040213 +324 0.4265066938 +325 0.4263658995 +326 0.4262210853 +327 0.4261016254 +328 0.4258775328 +329 0.4256150707 +330 0.4254605415 +331 0.425103945 +332 0.4249474884 +333 0.4247586111 +334 0.4245190758 +335 0.424354259 +336 0.424132662 +337 0.4238665065 +338 0.4237475302 +339 0.4234735865 +340 0.4233543172 +341 0.4230993551 +342 0.4229050267 +343 0.4226697413 +344 0.4225455909 +345 0.4224177279 +346 0.4222604838 +347 0.4220568565 +348 0.4218699243 +349 0.4217377586 +350 0.4215193993 +351 0.4212715526 +352 0.4211308748 +353 0.4210073087 +354 0.4208631905 +355 0.4207086715 +356 0.4204482645 +357 0.4202904422 +358 0.4201302692 +359 0.4199322944 +360 0.4197650806 +361 0.4195660523 +362 0.419408487 +363 0.4192714234 +364 0.4191022332 +365 0.4188885725 +366 0.4187249006 +367 0.4185552442 +368 0.4183770285 +369 0.4181731333 +370 0.417939556 +371 0.4176956536 +372 0.4174959073 +373 0.4174016594 +374 0.4171861522 +375 0.4169813507 +376 0.416747154 +377 0.4165443915 +378 0.4163682948 +379 0.4161134718 +380 0.4156613718 +381 0.4155335187 +382 0.4153271037 +383 0.415039742 +384 0.4148493701 +385 0.4145737977 +386 0.4144641023 +387 0.4142665981 +388 0.4141114564 +389 0.4139069824 +390 0.4137664746 +391 0.4135564708 +392 0.413399975 +393 0.4132841463 +394 0.4130735453 +395 0.4129128891 +396 0.4127603425 +397 0.4126132869 +398 0.412483408 +399 0.4122498658 +400 0.4120989385 +401 0.4119977297 +402 0.4117791922 +403 0.4115558202 +404 0.4113869065 +405 0.4112286448 +406 0.4110590725 +407 0.4107481758 +408 0.4106603593 +409 0.4104916576 +410 0.410350909 +411 0.4101348908 +412 0.4099898476 +413 0.409759579 +414 0.4095488194 +415 0.4092995604 +416 0.4090528408 +417 0.4088984152 +418 0.4086561412 +419 0.4084070467 +420 0.4082820546 +421 0.408052739 +422 0.4079038954 +423 0.4077738978 +424 0.4076969764 +425 0.4074848942 +426 0.4072186769 +427 0.407034473 +428 0.4068168505 +429 0.4066484338 +430 0.4064609594 +431 0.4063775439 +432 0.4062446513 +433 0.4060445669 +434 0.4058599491 +435 0.4057238709 +436 0.405556891 +437 0.4053481581 +438 0.4052095468 +439 0.405039241 +440 0.4048853183 +441 0.4046243019 +442 0.40439664 +443 0.404257456 +444 0.4040562711 +445 0.4039560113 +446 0.4038123666 +447 0.4036857712 +448 0.4035193031 +449 0.4033486879 +450 0.4031770743 +451 0.4030550034 +452 0.4028698306 +453 0.4026983613 +454 0.4025485746 +455 0.4023596694 +456 0.402161124 +457 0.4019401492 +458 0.4017907634 +459 0.4015745332 +460 0.4013345036 +461 0.4011869485 +462 0.4010027812 +463 0.4007869908 +464 0.4006739777 +465 0.4005489822 +466 0.4003149634 +467 0.4002126351 +468 0.400038857 +469 0.399836417 +470 0.3996140597 +471 0.3993328468 +472 0.3989870829 +473 0.3988445618 +474 0.3987436442 +475 0.3986119474 +476 0.3984610074 +477 0.3982633871 +478 0.398136263 +479 0.3980163749 +480 0.3978723608 +481 0.397690427 +482 0.3975478307 +483 0.3973334291 +484 0.3971051589 +485 0.3969474896 +486 0.3967539683 +487 0.3966085314 +488 0.3964510125 +489 0.396253402 +490 0.3960310245 +491 0.3958311156 +492 0.3955993467 +493 0.3954683697 +494 0.3953325317 +495 0.3951685557 +496 0.3950654818 +497 0.3948834192 +498 0.3947808055 +499 0.3946276223 +500 0.3944426652 +501 0.3942853799 +502 0.3940638964 +503 0.3938680931 +504 0.3936522705 +505 0.3934806347 +506 0.3933477731 +507 0.3932168615 +508 0.3930577322 +509 0.3929338752 +510 0.3927555401 +511 0.3925625806 +512 0.3924040515 +513 0.3922035732 +514 0.3920878478 +515 0.3918940082 +516 0.391770082 +517 0.3915579811 +518 0.3913652469 +519 0.3912203248 +520 0.391062202 +521 0.3909223001 +522 0.3907347913 +523 0.3906212249 +524 0.390499577 +525 0.390320446 +526 0.39019017 +527 0.3900673339 +528 0.3899329843 +529 0.389764516 +530 0.3896331664 +531 0.3895170009 +532 0.389249049 +533 0.3890434867 +534 0.388938254 +535 0.3887604864 +536 0.3884972125 +537 0.3883344834 +538 0.3881912086 +539 0.3880425215 +540 0.3878480257 +541 0.3876806629 +542 0.3876272814 +543 0.3874939983 +544 0.3873292341 +545 0.3871057995 +546 0.387009513 +547 0.3868711828 +548 0.3867208621 +549 0.3865262797 +550 0.3863483729 +551 0.3861899072 +552 0.3860593284 +553 0.3859177807 +554 0.38579677 +555 0.385617264 +556 0.3855003873 +557 0.3853088475 +558 0.3851622708 +559 0.384870381 +560 0.384713858 +561 0.3845989351 +562 0.3844153447 +563 0.3842753373 +564 0.3841330856 +565 0.3839696176 +566 0.3837619101 +567 0.3836332156 +568 0.3834369858 +569 0.3832403734 +570 0.3831079646 +571 0.3829356965 +572 0.3826621061 +573 0.382497807 +574 0.3824122493 +575 0.3822696769 +576 0.3820522246 +577 0.3818821373 +578 0.3817868214 +579 0.381622574 +580 0.3813760284 +581 0.3812175079 +582 0.3809906761 +583 0.3808943957 +584 0.3807539477 +585 0.3805639832 +586 0.3803638166 +587 0.3802362482 +588 0.3801481063 +589 0.3800114269 +590 0.3799221502 +591 0.3797750682 +592 0.3796373166 +593 0.3795367884 +594 0.379377213 +595 0.3792204097 +596 0.3790521672 +597 0.3788710699 +598 0.378688007 +599 0.3785935206 +600 0.3784156977 +601 0.3782577791 +602 0.3780576737 +603 0.3778601431 +604 0.3776589792 +605 0.377434885 +606 0.3772646588 +607 0.3771617804 +608 0.3770098203 +609 0.3769221424 +610 0.376771416 +611 0.3767037304 +612 0.3765630818 +613 0.3763107012 +614 0.3761804035 +615 0.3760301394 +616 0.375841275 +617 0.3757230274 +618 0.3755209797 +619 0.3753748639 +620 0.3752053593 +621 0.3750205847 +622 0.3748473989 +623 0.3746585471 +624 0.3745745002 +625 0.3744110356 +626 0.3742598968 +627 0.3740822124 +628 0.3739235506 +629 0.3737586013 +630 0.3734855062 +631 0.3733377872 +632 0.3731745698 +633 0.3729856746 +634 0.3728228361 +635 0.3726907717 +636 0.3725425753 +637 0.3724504391 +638 0.3723358488 +639 0.3721377624 +640 0.3720018746 +641 0.3719057184 +642 0.3718286598 +643 0.3717219004 +644 0.3715054562 +645 0.3713598942 +646 0.3712305354 +647 0.3710254186 +648 0.3708458548 +649 0.3706665923 +650 0.3704999459 +651 0.370247796 +652 0.3701324895 +653 0.3699762302 +654 0.3697508254 +655 0.3695699218 +656 0.3693988236 +657 0.3692143951 +658 0.3690794117 +659 0.3688904349 +660 0.3687211772 +661 0.3685619111 +662 0.3683524035 +663 0.3681662122 +664 0.3680193499 +665 0.3678031188 +666 0.3676260855 +667 0.3674784863 +668 0.3673319536 +669 0.3671497691 +670 0.3668777821 +671 0.366799106 +672 0.3666770671 +673 0.3665607255 +674 0.366450751 +675 0.3663048737 +676 0.3661820191 +677 0.3660185996 +678 0.3658993426 +679 0.3657578988 +680 0.3656420193 +681 0.3654810658 +682 0.3653016046 +683 0.365163632 +684 0.3650449584 +685 0.3649630095 +686 0.3647988008 +687 0.3647013587 +688 0.3645537531 +689 0.3643922371 +690 0.3642050082 +691 0.3640578903 +692 0.3639359832 +693 0.363838056 +694 0.3637076899 +695 0.3635879928 +696 0.3633801607 +697 0.3632430369 +698 0.3631584444 +699 0.3629197967 +700 0.3627817688 +701 0.3626405338 +702 0.3625273179 +703 0.3623957062 +704 0.3623111402 +705 0.3622124003 +706 0.3621099502 +707 0.362021043 +708 0.3618692858 +709 0.361670701 +710 0.3615273603 +711 0.3613907674 +712 0.361319107 +713 0.3612447763 +714 0.3611296843 +715 0.3610371417 +716 0.3609221171 +717 0.360775383 +718 0.3605754063 +719 0.360526686 +720 0.3603259902 +721 0.3601968411 +722 0.3600891472 +723 0.3599092762 +724 0.3597394541 +725 0.3596019534 +726 0.3594025812 +727 0.3593026302 +728 0.3592546028 +729 0.3591605646 +730 0.3590715553 +731 0.3588811257 +732 0.3587866435 +733 0.3586846684 +734 0.3586195871 +735 0.3585495326 +736 0.358453216 +737 0.3583029375 +738 0.3581825124 +739 0.3580924639 +740 0.3579736363 +741 0.3577930724 +742 0.357618741 +743 0.3575136396 +744 0.3574083062 +745 0.3573171639 +746 0.3572187265 +747 0.3570174772 +748 0.3567920586 +749 0.3565318945 diff --git a/catboost_info/test/events.out.tfevents b/catboost_info/test/events.out.tfevents index 1d19255..74ccb32 100644 Binary files a/catboost_info/test/events.out.tfevents and b/catboost_info/test/events.out.tfevents differ diff --git a/catboost_info/test_error.tsv b/catboost_info/test_error.tsv index 79bd556..4b691e7 100644 --- a/catboost_info/test_error.tsv +++ b/catboost_info/test_error.tsv @@ -1,829 +1,751 @@ iter Logloss -0 0.6905107621 -1 0.6871090123 -2 0.6844606439 -3 0.6809286346 -4 0.6774402846 -5 0.6740356614 -6 0.670788834 -7 0.6676456076 -8 0.6652955508 -9 0.6623008216 -10 0.6593458408 -11 0.6572208646 -12 0.6543805391 -13 0.6523374539 -14 0.6502893403 -15 0.6482932666 -16 0.6463517071 -17 0.6438804101 -18 0.6413201184 -19 0.6394763732 -20 0.6374437837 -21 0.6349617515 -22 0.6331451835 -23 0.63127905 -24 0.6299628473 -25 0.6278537944 -26 0.6262740798 -27 0.6239180368 -28 0.6223892049 -29 0.6207937267 -30 0.6186735394 -31 0.6166546384 -32 0.6144865217 -33 0.6129900551 -34 0.6113005539 -35 0.6095609284 -36 0.6077097603 -37 0.6066736713 -38 0.6054699292 -39 0.6045189637 -40 0.6028666966 -41 0.6014614195 -42 0.5996695546 -43 0.5983460089 -44 0.5966810112 -45 0.5956450418 -46 0.5945786627 -47 0.5931140825 -48 0.5916339781 -49 0.5901821684 -50 0.5886845045 -51 0.5873437186 -52 0.5858138491 -53 0.584880044 -54 0.5836002773 -55 0.5822230555 -56 0.5812704937 -57 0.5802902358 -58 0.5795422819 -59 0.5781728022 -60 0.5770815604 -61 0.5761339871 -62 0.5754830094 -63 0.5744535051 -64 0.5735182634 -65 0.5725989848 -66 0.5722099226 -67 0.5710864752 -68 0.5703172104 -69 0.5693944997 -70 0.5683641574 -71 0.5672884797 -72 0.5666464014 -73 0.5655809402 -74 0.5646614221 -75 0.5640993193 -76 0.5637132103 -77 0.5630272732 -78 0.5621769954 -79 0.5613964367 -80 0.5605600867 -81 0.5602561082 -82 0.5594923108 -83 0.5590696861 -84 0.5583184996 -85 0.5575170291 -86 0.5569801481 -87 0.556224013 -88 0.5554498395 -89 0.555041422 -90 0.5546903123 -91 0.5543524519 -92 0.5539176154 -93 0.5533663276 -94 0.5532664381 -95 0.5530306622 -96 0.552612587 -97 0.5520417044 -98 0.5516118164 -99 0.5513018517 -100 0.5509188955 -101 0.5506174312 -102 0.5500083168 -103 0.5498264565 -104 0.5493285255 -105 0.5490933483 -106 0.5489701925 -107 0.5489353529 -108 0.5486229538 -109 0.5482983828 -110 0.5480394603 -111 0.5476499591 -112 0.5475116383 -113 0.5473223951 -114 0.5470852623 -115 0.5466578885 -116 0.5462014618 -117 0.5458354664 -118 0.5455954204 -119 0.5454222999 -120 0.5450386253 -121 0.5448259161 -122 0.5443499745 -123 0.5441528294 -124 0.5437510366 -125 0.5433484058 -126 0.542928415 -127 0.5425288969 -128 0.5422919637 -129 0.5420541924 -130 0.5417351686 -131 0.5413339345 -132 0.5411060205 -133 0.5406589721 -134 0.5402045009 -135 0.5401062476 -136 0.5396592791 -137 0.5392798347 -138 0.5389907818 -139 0.5389436904 -140 0.5386680465 -141 0.5383553282 -142 0.5380886636 -143 0.5380264471 -144 0.5378110243 -145 0.5377516413 -146 0.537631319 -147 0.5375976367 -148 0.5372723074 -149 0.5370383673 -150 0.5368126083 -151 0.5364298117 -152 0.5363292038 -153 0.5362669076 -154 0.5361287065 -155 0.5359287679 -156 0.5357148216 -157 0.5355527157 -158 0.5354150334 -159 0.5351407863 -160 0.5348638654 -161 0.5347473742 -162 0.5346073772 -163 0.5345715399 -164 0.5344203289 -165 0.5341423703 -166 0.5341244916 -167 0.5340588431 -168 0.5339983028 -169 0.5338498454 -170 0.5338024747 -171 0.5335969091 -172 0.533564464 -173 0.5333060603 -174 0.5330650165 -175 0.533035764 -176 0.532890619 -177 0.5327280741 -178 0.532661787 -179 0.5323550948 -180 0.5320937379 -181 0.5319976397 -182 0.5319445622 -183 0.5317927924 -184 0.5315881447 -185 0.5313290226 -186 0.5313750365 -187 0.5311831592 -188 0.5311377041 -189 0.5309481017 -190 0.5308184409 -191 0.5306155092 -192 0.5304099835 -193 0.5302349873 -194 0.5301382506 -195 0.5299927064 -196 0.5299585852 -197 0.52993484 -198 0.529872863 -199 0.5297793588 -200 0.5298054585 -201 0.5298823212 -202 0.5297468737 -203 0.5297105575 -204 0.5297793588 -205 0.5297511838 -206 0.5296674171 -207 0.5295779436 -208 0.5294034263 -209 0.529342447 -210 0.5292063611 -211 0.529140952 -212 0.5288928446 -213 0.5288243227 -214 0.5287417133 -215 0.528545566 -216 0.5284297532 -217 0.5284121139 -218 0.5285319973 -219 0.5284131515 -220 0.5283043227 -221 0.528141259 -222 0.5280515859 -223 0.5280135936 -224 0.5280392544 -225 0.5280392145 -226 0.5279079973 -227 0.527942358 -228 0.5279882521 -229 0.5278810594 -230 0.5277614155 -231 0.5277468092 -232 0.5276640802 -233 0.5277021922 -234 0.5277501216 -235 0.5276416918 -236 0.5275160218 -237 0.5274325345 -238 0.5274650993 -239 0.5273778607 -240 0.5272706281 -241 0.5271754478 -242 0.5271913311 -243 0.5270974278 -244 0.5270226803 -245 0.5269694432 -246 0.5269732743 -247 0.5269544777 -248 0.5267942075 -249 0.5267131945 -250 0.526730754 -251 0.5266016519 -252 0.5266562459 -253 0.5265934309 -254 0.5265000464 -255 0.52657647 -256 0.5265735966 -257 0.5264673219 -258 0.5265288599 -259 0.5264186342 -260 0.5263493142 -261 0.5263282827 -262 0.5262348583 -263 0.5261702874 -264 0.5261617471 -265 0.5260771423 -266 0.5261783088 -267 0.5261205621 -268 0.5262331423 -269 0.5261472605 -270 0.5261270671 -271 0.5260799359 -272 0.5260288138 -273 0.5260414247 -274 0.5260683227 -275 0.525982361 -276 0.5259617286 -277 0.5259804055 -278 0.5259454063 -279 0.525910008 -280 0.5257917609 -281 0.5258267202 -282 0.5257332958 -283 0.5257140602 -284 0.5256252252 -285 0.5255676381 -286 0.5255896273 -287 0.5255241385 -288 0.5254505084 -289 0.5254376979 -290 0.5253732866 -291 0.5252943088 -292 0.5251989688 -293 0.5252052743 -294 0.5252333695 -295 0.525173787 -296 0.5250960863 -297 0.5252196012 -298 0.5251910272 -299 0.5251004761 -300 0.5250343487 -301 0.5249854216 -302 0.5249281139 -303 0.5249040095 -304 0.5247956596 -305 0.524769041 -306 0.5247227877 -307 0.5246661983 -308 0.5244936365 -309 0.5244552451 -310 0.5244272298 -311 0.52448346 -312 0.52461779 -313 0.5245773234 -314 0.5245368967 -315 0.5245054094 -316 0.5245349013 -317 0.5245200556 -318 0.5246046204 -319 0.5245359389 -320 0.5245240863 -321 0.5245902935 -322 0.524544559 -323 0.5246986035 -324 0.524655942 -325 0.52455278 -326 0.5245547754 -327 0.5246175905 -328 0.5246331945 -329 0.5247260602 -330 0.524748648 -331 0.5247041108 -332 0.5246998008 -333 0.524646404 -334 0.5246238161 -335 0.5245842275 -336 0.5245910916 -337 0.524564952 -338 0.524502097 -339 0.5244784715 -340 0.5244739619 -341 0.5244371668 -342 0.5244161354 -343 0.5243407493 -344 0.5243126143 -345 0.5243770655 -346 0.5243654523 -347 0.5242717486 -348 0.5242066987 -349 0.5241857071 -350 0.5241703426 -351 0.5241180632 -352 0.5241839911 -353 0.5241755705 -354 0.5241547785 -355 0.5240910057 -356 0.5240606358 -357 0.5240552881 -358 0.5240140233 -359 0.5240000156 -360 0.5240112298 -361 0.5240250379 -362 0.5239875644 -363 0.5240291085 -364 0.5240442735 -365 0.5240801108 -366 0.5240595183 -367 0.5240408414 -368 0.5240772773 -369 0.524025876 -370 0.5239988583 -371 0.5239619435 -372 0.523977308 -373 0.5239592298 -374 0.5239681691 -375 0.5240119481 -376 0.5240491024 -377 0.524017176 -378 0.5240107509 -379 0.5240477854 -380 0.5239433863 -381 0.5239456212 -382 0.52396781 -383 0.5239154907 -384 0.5238472482 -385 0.5238477271 -386 0.5237636411 -387 0.5238468092 -388 0.5238066219 -389 0.5237445651 -390 0.5238180356 -391 0.523788823 -392 0.5238235828 -393 0.5237518284 -394 0.5237233341 -395 0.5236708153 -396 0.5237228552 -397 0.5236480279 -398 0.5236367739 -399 0.523651899 -400 0.5236269965 -401 0.5236110732 -402 0.5236593219 -403 0.5236443165 -404 0.5236209305 -405 0.5236522582 -406 0.5236051269 -407 0.5235003288 -408 0.5234595828 -409 0.5234415843 -410 0.5234715552 -411 0.5234680034 -412 0.5234185176 -413 0.5234071039 -414 0.5234527585 -415 0.5233959297 -416 0.5234332037 -417 0.5234163625 -418 0.5233865114 -419 0.523371107 -420 0.523323417 -421 0.5233568598 -422 0.5233472021 -423 0.5233202244 -424 0.5232979159 -425 0.5233085314 -426 0.5232804761 -427 0.523238054 -428 0.523211196 -429 0.5231854155 -430 0.5231295843 -431 0.5230442612 -432 0.5230478529 -433 0.5230585083 -434 0.5230607831 -435 0.5230641354 -436 0.5230561538 -437 0.5230684454 -438 0.5231114262 -439 0.5231342136 -440 0.5231202459 -441 0.5231264715 -442 0.5230611423 -443 0.5230454585 -444 0.5230618606 -445 0.5230099404 -446 0.5230171238 -447 0.523017483 -448 0.522981087 -449 0.5230335659 -450 0.5230780632 -451 0.5230968199 -452 0.5231519727 -453 0.5230957823 -454 0.5231619895 -455 0.5231427938 -456 0.5231407585 -457 0.5231268307 -458 0.5230903149 -459 0.5231239174 -460 0.5231105882 -461 0.5231072359 -462 0.5230663303 -463 0.5230520034 -464 0.5231552052 -465 0.5231227601 -466 0.5231283073 -467 0.5231457869 -468 0.5231242367 -469 0.5231054799 -470 0.5231052006 -471 0.5230944654 -472 0.5230880003 -473 0.523081615 -474 0.5230570717 -475 0.5230114569 -476 0.5230258637 -477 0.5230545575 -478 0.5230124945 -479 0.5230045129 -480 0.5230198376 -481 0.5229702321 -482 0.5229998836 -483 0.5229549074 -484 0.5230846879 -485 0.5230766664 -486 0.5230417071 -487 0.5229751008 -488 0.5229996442 -489 0.5229788123 -490 0.5229538698 -491 0.5229369489 -492 0.522943813 -493 0.5229318007 -494 0.5228958836 -495 0.5229134431 -496 0.5229490809 -497 0.5229017102 -498 0.5229517547 -499 0.522969394 -500 0.5229041446 -501 0.5228783241 -502 0.5228718192 -503 0.5229268522 -504 0.5229266925 -505 0.5230010809 -506 0.5230021185 -507 0.5229993249 -508 0.5229493602 -509 0.5229711898 -510 0.5229555459 -511 0.5229590179 -512 0.5229262935 -513 0.5228736948 -514 0.5228265237 -515 0.5228191806 -516 0.5228468368 -517 0.5228318713 -518 0.522833308 -519 0.522861483 -520 0.5228843902 -521 0.5228509473 -522 0.522768737 -523 0.5227463088 -524 0.5227663825 -525 0.5227153403 -526 0.5227093541 -527 0.5226514078 -528 0.522653922 -529 0.5226686081 -530 0.5226732773 -531 0.5226849304 -532 0.5226886419 -533 0.5227434753 -534 0.5227471469 -535 0.5228053326 -536 0.5227919634 -537 0.5227967524 -538 0.5227892896 -539 0.522829876 -540 0.5228210164 -541 0.5228551776 -542 0.5228748522 -543 0.5229222628 -544 0.5229318007 -545 0.5229322397 -546 0.5229199082 -547 0.5229286081 -548 0.5230504869 -549 0.5229934185 -550 0.5230091423 -551 0.5230165651 -552 0.5229696733 -553 0.5230418268 -554 0.5230120555 -555 0.523007506 -556 0.5230182812 -557 0.5229983272 -558 0.5230093817 -559 0.5230354815 -560 0.5230684055 -561 0.5231038038 -562 0.5231512543 -563 0.5231319788 -564 0.5231420356 -565 0.523170011 -566 0.5232054492 -567 0.5231761568 -568 0.5232032543 -569 0.5232200156 -570 0.5232166235 -571 0.5232150271 -572 0.5232114354 -573 0.5232127125 -574 0.5232166634 -575 0.5232570502 -576 0.5232562121 -577 0.5232680648 -578 0.5232951223 -579 0.5232734922 -580 0.5233136795 -581 0.5233617286 -582 0.5233616488 -583 0.5233495966 -584 0.5233318775 -585 0.5233067754 -586 0.5233351898 -587 0.5232900141 -588 0.5232538176 -589 0.5232485099 -590 0.5232524209 -591 0.5232687432 -592 0.5232477117 -593 0.5232545759 -594 0.523244998 -595 0.5232617992 -596 0.5232426434 -597 0.5232268798 -598 0.5232590057 -599 0.5232524209 -600 0.5232754078 -601 0.523300031 -602 0.5232716964 -603 0.5232841875 -604 0.5232818729 -605 0.523282711 -606 0.5232781215 -607 0.5232599235 -608 0.5232415659 -609 0.5232594446 -610 0.5232917301 -611 0.5232865421 -612 0.5232459957 -613 0.5232588859 -614 0.5232828706 -615 0.5232958806 -616 0.5232828307 -617 0.5232733326 -618 0.5232422044 -619 0.5232609212 -620 0.5232268 -621 0.5232017378 -622 0.5231963502 -623 0.5231319389 -624 0.523149219 -625 0.5231252344 -626 0.5231044423 -627 0.5230896764 -628 0.5230465759 -629 0.5230212743 -630 0.5230591868 -631 0.5230783426 -632 0.5230827723 -633 0.5230903548 -634 0.5230961016 -635 0.5230887186 -636 0.523092869 -637 0.5230853265 -638 0.5230822136 -639 0.5230661707 -640 0.5230572712 -641 0.5230463364 -642 0.5230882397 -643 0.52305344 -644 0.5230494093 -645 0.5230516841 -646 0.5229983671 -647 0.522962011 -648 0.5229696733 -649 0.5229587785 -650 0.5229816058 -651 0.5230001231 -652 0.5230224316 -653 0.5230725958 -654 0.5230662904 -655 0.5230620202 -656 0.5230606235 -657 0.5231221215 -658 0.5231276687 -659 0.5231340939 -660 0.5231017286 -661 0.5231150179 -662 0.523134054 -663 0.5231242367 -664 0.5231146588 -665 0.5230887984 -666 0.5230363595 -667 0.5230281783 -668 0.5230341645 -669 0.5230279389 -670 0.5230222321 -671 0.5230373971 -672 0.5229842796 -673 0.5229610133 -674 0.5229801691 -675 0.5229882305 -676 0.5229999634 -677 0.5230818146 -678 0.523105879 -679 0.5230956227 -680 0.5230753096 -681 0.5231233587 -682 0.5231295444 -683 0.5231493387 -684 0.5231260724 -685 0.523147902 -686 0.5231435521 -687 0.5231175321 -688 0.523061701 -689 0.5230448997 -690 0.523096341 -691 0.5230544377 -692 0.5230272205 -693 0.5229994845 -694 0.5229731453 -695 0.5230026772 -696 0.5229814063 -697 0.523028338 -698 0.52304047 -699 0.5231060786 -700 0.5231529704 -701 0.5231895659 -702 0.5231717271 -703 0.5231422351 -704 0.5231952727 -705 0.5232162643 -706 0.5232099189 -707 0.5232399297 -708 0.5232366173 -709 0.523207724 -710 0.5232100387 -711 0.5232050103 -712 0.5231559634 -713 0.5231209243 -714 0.523134932 -715 0.523104163 -716 0.5230588276 -717 0.5230664899 -718 0.523046097 -719 0.5229995245 -720 0.5229938974 -721 0.5230073065 -722 0.5230225513 -723 0.5230371177 -724 0.5229844792 -725 0.5229836012 -726 0.522949879 -727 0.5229589381 -728 0.5229379466 -729 0.522936869 -730 0.5229897071 -731 0.5229662812 -732 0.5229319604 -733 0.5228941277 -734 0.5229171944 -735 0.5229341154 -736 0.5229717486 -737 0.5230099005 -738 0.5230262228 -739 0.5230276994 -740 0.5230006818 -741 0.5230676473 -742 0.5230670486 -743 0.523074671 -744 0.5230351622 -745 0.5230237885 -746 0.5229994446 -747 0.5229985268 -748 0.5229915828 -749 0.5230296948 -750 0.5230588276 -751 0.5230658913 -752 0.5231012098 -753 0.5231081538 -754 0.5231254339 -755 0.5231013694 -756 0.5230952635 -757 0.5230354815 -758 0.5230115367 -759 0.5230215935 -760 0.5229917424 -761 0.5229803687 -762 0.5229469258 -763 0.5229724669 -764 0.5229621308 -765 0.5229747416 -766 0.5229474047 -767 0.5230021983 -768 0.5230609826 -769 0.5230393126 -770 0.5230386342 -771 0.523093308 -772 0.5230694032 -773 0.5230376365 -774 0.5230461369 -775 0.523011856 -776 0.5229602152 -777 0.522962889 -778 0.5229640862 -779 0.5229567033 -780 0.5229410594 -781 0.5229302842 -782 0.5229431346 -783 0.5229212651 -784 0.5228461185 -785 0.5228515459 -786 0.5228425268 -787 0.52285845 -788 0.5228225728 -789 0.5228387355 -790 0.5228225728 -791 0.52284544 -792 0.5228669903 -793 0.5228642766 -794 0.522829437 -795 0.5228370993 -796 0.5228472758 -797 0.5228739742 -798 0.5228439235 -799 0.5228508675 -800 0.5228592881 -801 0.5228722981 -802 0.5228228522 -803 0.5228357025 -804 0.522820338 -805 0.5228370594 -806 0.5228353433 -807 0.5228897378 -808 0.5229236994 -809 0.5229183917 -810 0.5229202674 -811 0.522899196 -812 0.5229074569 -813 0.522961572 -814 0.5229805682 -815 0.5229783733 -816 0.5229669995 -817 0.5229556258 -818 0.5229359113 -819 0.5229794508 -820 0.5229653633 -821 0.5229602152 -822 0.5229697532 -823 0.52299278 -824 0.5230005222 -825 0.5229960924 -826 0.5229922612 -827 0.5229859558 +0 0.6896417545 +1 0.6858873323 +2 0.6828681305 +3 0.6795196794 +4 0.6760484233 +5 0.6726388417 +6 0.6695189293 +7 0.6662672616 +8 0.6632470241 +9 0.6598664355 +10 0.656835941 +11 0.6539295768 +12 0.6519104307 +13 0.6488938206 +14 0.6461647091 +15 0.6433344152 +16 0.6406067379 +17 0.6379567909 +18 0.6353546473 +19 0.6332076443 +20 0.6309091761 +21 0.6289467444 +22 0.626679484 +23 0.6243728367 +24 0.6224695987 +25 0.6209035181 +26 0.6190830756 +27 0.6173556415 +28 0.6151956276 +29 0.6131745353 +30 0.6111064608 +31 0.6096385122 +32 0.6075520668 +33 0.6057553537 +34 0.6041746671 +35 0.60218203 +36 0.6002628452 +37 0.5984350295 +38 0.5966827053 +39 0.5951582939 +40 0.593386988 +41 0.5917648301 +42 0.5901367283 +43 0.5885996156 +44 0.5872656267 +45 0.5862677986 +46 0.584659469 +47 0.5833478591 +48 0.5819510783 +49 0.5806539316 +50 0.5796116099 +51 0.5787501468 +52 0.5774874145 +53 0.576237014 +54 0.5754096805 +55 0.5743359531 +56 0.573221358 +57 0.5722218253 +58 0.5711244713 +59 0.5700800859 +60 0.5690296618 +61 0.5681036628 +62 0.5668771486 +63 0.5658750266 +64 0.5647810385 +65 0.5637613867 +66 0.5628814505 +67 0.5618462888 +68 0.5609182118 +69 0.5597978434 +70 0.5588862561 +71 0.5578589608 +72 0.5572179217 +73 0.5563541846 +74 0.5555627272 +75 0.5547037302 +76 0.5538640325 +77 0.5531438474 +78 0.552589933 +79 0.5517910907 +80 0.5509343071 +81 0.5503428857 +82 0.5496760217 +83 0.5488706367 +84 0.5480229027 +85 0.5473412659 +86 0.5468603594 +87 0.5460639568 +88 0.5454199851 +89 0.5447470209 +90 0.5442183819 +91 0.5435976914 +92 0.5429848788 +93 0.5423718637 +94 0.5416752261 +95 0.5411359818 +96 0.5405827938 +97 0.540020827 +98 0.5394152906 +99 0.53888085 +100 0.5382957048 +101 0.5377235888 +102 0.5374353369 +103 0.5368588103 +104 0.5364236399 +105 0.5358894587 +106 0.5353011898 +107 0.534801427 +108 0.5346321342 +109 0.5340956682 +110 0.5337286666 +111 0.5332564969 +112 0.5328407907 +113 0.5323426945 +114 0.5321336397 +115 0.5316088774 +116 0.5310718135 +117 0.5306840323 +118 0.5303267025 +119 0.5300458333 +120 0.5297756775 +121 0.5296601881 +122 0.5292836496 +123 0.5288159606 +124 0.5284746863 +125 0.5282877626 +126 0.5279071266 +127 0.5276545487 +128 0.5274332113 +129 0.5270451469 +130 0.5265970833 +131 0.5264975461 +132 0.5261332448 +133 0.5258860921 +134 0.525562179 +135 0.5252651319 +136 0.5249835738 +137 0.5246205567 +138 0.524321262 +139 0.5242551609 +140 0.5239585031 +141 0.5236089923 +142 0.5234188197 +143 0.5231108175 +144 0.5228370372 +145 0.5227192333 +146 0.5225125724 +147 0.5225302806 +148 0.5223917842 +149 0.5221227076 +150 0.5219168207 +151 0.5217819374 +152 0.5215549699 +153 0.5214815219 +154 0.5211855172 +155 0.5210519406 +156 0.5207773257 +157 0.5207614576 +158 0.5204844088 +159 0.5204625836 +160 0.520376228 +161 0.5202015275 +162 0.51996363 +163 0.5197245487 +164 0.519638471 +165 0.5194360558 +166 0.519515164 +167 0.5193176647 +168 0.5193145002 +169 0.5190644101 +170 0.5188446412 +171 0.5187151438 +172 0.5184970838 +173 0.5182786316 +174 0.5180629545 +175 0.5178620352 +176 0.5176687483 +177 0.5175490769 +178 0.5175523552 +179 0.517412411 +180 0.5172874168 +181 0.5171183644 +182 0.516829176 +183 0.5166295321 +184 0.5164349229 +185 0.5162497154 +186 0.5160883393 +187 0.5158463849 +188 0.5156988318 +189 0.5154847207 +190 0.5153597859 +191 0.515197863 +192 0.5150228747 +193 0.515018419 +194 0.5148452717 +195 0.5147039985 +196 0.5145416322 +197 0.5143681498 +198 0.5142515928 +199 0.5142076834 +200 0.5141440263 +201 0.5140569708 +202 0.5139285493 +203 0.5138464599 +204 0.5136731283 +205 0.5135422718 +206 0.5134879408 +207 0.5134508574 +208 0.5132819493 +209 0.5131247801 +210 0.5130048182 +211 0.5128423435 +212 0.512796206 +213 0.5126926128 +214 0.5125309167 +215 0.5123912503 +216 0.512289562 +217 0.5121567862 +218 0.5120176566 +219 0.5119412533 +220 0.5118688247 +221 0.5117418803 +222 0.5116680141 +223 0.5115256038 +224 0.5114087908 +225 0.5113344762 +226 0.5112119865 +227 0.5111237394 +228 0.5110516527 +229 0.5110429524 +230 0.5110395307 +231 0.5109345358 +232 0.5108690951 +233 0.5107661864 +234 0.5107158842 +235 0.510616901 +236 0.5105620625 +237 0.5104783339 +238 0.5104444087 +239 0.5103849205 +240 0.5102826481 +241 0.5102498646 +242 0.5101658929 +243 0.5101066305 +244 0.5100401507 +245 0.5100208886 +246 0.5099833024 +247 0.5100181186 +248 0.5099593443 +249 0.5098596489 +250 0.5098031751 +251 0.5097576303 +252 0.5096080649 +253 0.5095825446 +254 0.5095690345 +255 0.5095000464 +256 0.509469457 +257 0.5094567634 +258 0.5094283306 +259 0.5093411262 +260 0.5092961761 +261 0.5092327932 +262 0.5091704911 +263 0.509089185 +264 0.509010118 +265 0.5089215603 +266 0.5088796842 +267 0.5086964525 +268 0.508654808 +269 0.5086107001 +270 0.5085713038 +271 0.5084898232 +272 0.5084193421 +273 0.5084243532 +274 0.5083254763 +275 0.5082801047 +276 0.5081911233 +277 0.5081535212 +278 0.5081238773 +279 0.5080929835 +280 0.5079704011 +281 0.507887449 +282 0.5078604043 +283 0.5077772725 +284 0.5077109468 +285 0.5077326156 +286 0.5077523791 +287 0.5077910332 +288 0.5077140272 +289 0.5076659113 +290 0.507696368 +291 0.5076618274 +292 0.5076351132 +293 0.5075901254 +294 0.50765067 +295 0.5075490535 +296 0.5075520307 +297 0.507497842 +298 0.5075225259 +299 0.507572529 +300 0.5075684518 +301 0.5075098056 +302 0.5075117193 +303 0.5075102981 +304 0.5075700816 +305 0.5075290476 +306 0.5074662823 +307 0.5074317914 +308 0.5074219382 +309 0.5074001882 +310 0.5073011459 +311 0.5072873473 +312 0.5072321379 +313 0.5071687428 +314 0.5071463519 +315 0.5070958208 +316 0.5070485383 +317 0.507001437 +318 0.5069354685 +319 0.5069330393 +320 0.5069215119 +321 0.5068695712 +322 0.5068551084 +323 0.506831375 +324 0.506790121 +325 0.5067979106 +326 0.5067357034 +327 0.5067113163 +328 0.5066774905 +329 0.5066291246 +330 0.5065992506 +331 0.5065767615 +332 0.5066184207 +333 0.5066251338 +334 0.5066594461 +335 0.5066231531 +336 0.5065771665 +337 0.5066428875 +338 0.5066086337 +339 0.5065916296 +340 0.5065917689 +341 0.5065295218 +342 0.5064910377 +343 0.506489982 +344 0.5064831253 +345 0.5064264537 +346 0.5063896038 +347 0.5063228949 +348 0.5063496667 +349 0.5063601345 +350 0.5063509079 +351 0.5063714866 +352 0.5063628244 +353 0.5063397515 +354 0.5062710714 +355 0.5062665569 +356 0.5062555601 +357 0.5062209683 +358 0.5062160376 +359 0.5061763747 +360 0.5061232809 +361 0.5061324827 +362 0.5060527787 +363 0.5060280987 +364 0.5060139928 +365 0.505983797 +366 0.5059335179 +367 0.5059282266 +368 0.5059032395 +369 0.5059048526 +370 0.5058797514 +371 0.5058965678 +372 0.5058613854 +373 0.5058258499 +374 0.5058003022 +375 0.5057803609 +376 0.5057867985 +377 0.5057819594 +378 0.5057674603 +379 0.5058543622 +380 0.5058484754 +381 0.5058388174 +382 0.5058381963 +383 0.5058192608 +384 0.5057975197 +385 0.5058123424 +386 0.5058038215 +387 0.5057510825 +388 0.5057731014 +389 0.5057552519 +390 0.5057296528 +391 0.5057449074 +392 0.5057387472 +393 0.505748402 +394 0.5057419114 +395 0.5057386819 +396 0.5056747115 +397 0.505639086 +398 0.5056526114 +399 0.5056920653 +400 0.5056630891 +401 0.5056712296 +402 0.505592435 +403 0.5056194099 +404 0.5055870615 +405 0.5055787232 +406 0.5055699859 +407 0.5056690666 +408 0.5057043725 +409 0.5057596577 +410 0.5057283927 +411 0.5057540986 +412 0.5057534277 +413 0.5057637686 +414 0.5057403068 +415 0.5057433093 +416 0.5057504174 +417 0.5057808512 +418 0.5057070131 +419 0.5056658587 +420 0.5056484786 +421 0.5056525101 +422 0.5056227494 +423 0.5056191927 +424 0.5056154201 +425 0.5055722632 +426 0.5056248542 +427 0.5056225632 +428 0.5055820724 +429 0.5056127927 +430 0.5056102084 +431 0.5056395822 +432 0.5057070007 +433 0.5057016396 +434 0.5057033276 +435 0.5057301873 +436 0.5057213834 +437 0.5056997095 +438 0.5056941061 +439 0.5056343996 +440 0.5055990428 +441 0.5056219709 +442 0.5056344292 +443 0.5056196254 +444 0.5055948673 +445 0.5055668699 +446 0.5055739742 +447 0.5055674998 +448 0.5055242069 +449 0.5055268805 +450 0.5055321311 +451 0.5055208138 +452 0.5055534105 +453 0.5055725124 +454 0.5055431106 +455 0.5055521403 +456 0.505527128 +457 0.5055264034 +458 0.5055539437 +459 0.505631192 +460 0.5056358382 +461 0.5056737598 +462 0.5056617143 +463 0.5056540622 +464 0.5056872857 +465 0.5057610305 +466 0.5057202459 +467 0.5057031828 +468 0.5057111473 +469 0.5056962626 +470 0.50569569 +471 0.5057243812 +472 0.5056494599 +473 0.5056261744 +474 0.5056223365 +475 0.5055916699 +476 0.5055695668 +477 0.5055979363 +478 0.5055905375 +479 0.5055737089 +480 0.5056172603 +481 0.5055890569 +482 0.5055894479 +483 0.5055599113 +484 0.505560481 +485 0.505562845 +486 0.5055930275 +487 0.5056117097 +488 0.5056385897 +489 0.5056763688 +490 0.505589711 +491 0.5055514499 +492 0.5055368722 +493 0.5055168889 +494 0.5055516883 +495 0.5055044263 +496 0.5054930211 +497 0.505506577 +498 0.5054624273 +499 0.5054659544 +500 0.5054681124 +501 0.5055313527 +502 0.5055551405 +503 0.5055629565 +504 0.505522643 +505 0.5055165202 +506 0.5055238986 +507 0.5055616149 +508 0.5055502317 +509 0.50554374 +510 0.5055258652 +511 0.5055410857 +512 0.505559419 +513 0.5055728836 +514 0.5055634487 +515 0.5055811846 +516 0.5055673339 +517 0.505641107 +518 0.5057116994 +519 0.5056992602 +520 0.505732603 +521 0.5057473174 +522 0.5057873197 +523 0.5057830894 +524 0.5057609133 +525 0.5057385176 +526 0.5057340285 +527 0.5057626303 +528 0.5057646069 +529 0.5057178585 +530 0.5057410382 +531 0.5056904442 +532 0.505689517 +533 0.5056898459 +534 0.5056956925 +535 0.5056917961 +536 0.5056360425 +537 0.5056150748 +538 0.5055983552 +539 0.5055465885 +540 0.5055270041 +541 0.5055238699 +542 0.5055438209 +543 0.5055209378 +544 0.5055484502 +545 0.5055909795 +546 0.5055806135 +547 0.5055978925 +548 0.5056341497 +549 0.5056082736 +550 0.5055924323 +551 0.5055709305 +552 0.5056002069 +553 0.5056165599 +554 0.5056055535 +555 0.5056444582 +556 0.5056275212 +557 0.5056138945 +558 0.5055903046 +559 0.5055569697 +560 0.5055545583 +561 0.5055466135 +562 0.5055558139 +563 0.5055552809 +564 0.5055509626 +565 0.5055234281 +566 0.5055511976 +567 0.5055726181 +568 0.5055877355 +569 0.5055505763 +570 0.505570498 +571 0.5055791179 +572 0.5056026689 +573 0.5056031305 +574 0.505553323 +575 0.5055254649 +576 0.5054505212 +577 0.5054725183 +578 0.5054865611 +579 0.5054893223 +580 0.5055726699 +581 0.5055515286 +582 0.5056011911 +583 0.5055879554 +584 0.5056004955 +585 0.5056181231 +586 0.5056573656 +587 0.5056478758 +588 0.5056403903 +589 0.505644154 +590 0.5056173362 +591 0.5056519756 +592 0.5056671396 +593 0.5056660699 +594 0.5056916549 +595 0.5056701658 +596 0.5056717488 +597 0.5057052327 +598 0.5057069886 +599 0.5056979984 +600 0.5056854665 +601 0.5056842615 +602 0.5056645738 +603 0.5056574029 +604 0.50573599 +605 0.5057289336 +606 0.5057501134 +607 0.5057695814 +608 0.505762665 +609 0.5057571164 +610 0.5057823748 +611 0.5057899624 +612 0.5057329957 +613 0.5058361943 +614 0.5058262083 +615 0.5058404937 +616 0.5058315612 +617 0.5058261844 +618 0.5058420159 +619 0.5058374679 +620 0.5058503715 +621 0.5058382332 +622 0.505888554 +623 0.5058868205 +624 0.5058712402 +625 0.5059055665 +626 0.5059159343 +627 0.5058888314 +628 0.5058707643 +629 0.5058791736 +630 0.505811363 +631 0.505811207 +632 0.5058167211 +633 0.5058579571 +634 0.5059104663 +635 0.5059304856 +636 0.505908279 +637 0.5058934625 +638 0.5058838366 +639 0.5059153462 +640 0.5058979888 +641 0.5059640193 +642 0.5059731213 +643 0.5059864599 +644 0.5060248116 +645 0.5060350378 +646 0.5060239921 +647 0.5059900137 +648 0.5060294164 +649 0.5060446436 +650 0.5060366196 +651 0.5060839178 +652 0.5060818933 +653 0.506081043 +654 0.5061498492 +655 0.5061723019 +656 0.5062147918 +657 0.5062491974 +658 0.506276643 +659 0.5062644754 +660 0.506362546 +661 0.5063569392 +662 0.5063857443 +663 0.5063776314 +664 0.5063688627 +665 0.5063411726 +666 0.506391077 +667 0.5064087086 +668 0.506398484 +669 0.506438063 +670 0.5064323949 +671 0.5064246685 +672 0.5064482635 +673 0.5064572016 +674 0.5064779297 +675 0.5065327687 +676 0.5065437267 +677 0.5065448535 +678 0.5065373813 +679 0.5065576913 +680 0.5065706357 +681 0.5065769011 +682 0.506595917 +683 0.5065812648 +684 0.5066012763 +685 0.5065902832 +686 0.5065580604 +687 0.5065551143 +688 0.50658621 +689 0.50657265 +690 0.5065772572 +691 0.5065208501 +692 0.5064912521 +693 0.5064764657 +694 0.5064661015 +695 0.5064367103 +696 0.5064394748 +697 0.5064420273 +698 0.506490273 +699 0.5065930782 +700 0.5066165033 +701 0.5066243897 +702 0.5066113422 +703 0.5066070501 +704 0.5066068464 +705 0.5065816363 +706 0.5065955447 +707 0.5066075589 +708 0.5066564799 +709 0.5066405539 +710 0.5066439931 +711 0.5066163882 +712 0.5066320475 +713 0.5066122738 +714 0.506662354 +715 0.5066548912 +716 0.5066455097 +717 0.506652337 +718 0.506635886 +719 0.5066322706 +720 0.5066180485 +721 0.506687771 +722 0.5066837762 +723 0.5067004981 +724 0.5067077301 +725 0.5067600953 +726 0.5067874665 +727 0.506794877 +728 0.5068271825 +729 0.5068130183 +730 0.5067961769 +731 0.5068155207 +732 0.5068171227 +733 0.5067780059 +734 0.5067653397 +735 0.5067658151 +736 0.5067302102 +737 0.5067940636 +738 0.5067772327 +739 0.5067681236 +740 0.5067847726 +741 0.5068466694 +742 0.5068696274 +743 0.5068787367 +744 0.5068937266 +745 0.5069102218 +746 0.506920434 +747 0.5069131869 +748 0.5069337199 +749 0.5068883366 diff --git a/catboost_info/time_left.tsv b/catboost_info/time_left.tsv index 37ce9fe..0d49225 100644 --- a/catboost_info/time_left.tsv +++ b/catboost_info/time_left.tsv @@ -1,829 +1,751 @@ iter Passed Remaining -0 113 170657 -1 276 207298 -2 439 219337 -3 561 209949 -4 719 215159 -5 876 218333 -6 1030 219831 -7 1110 207021 -8 1275 211269 -9 1321 196943 -10 1351 182979 -11 1512 187543 -12 1667 190717 -13 1743 185070 -14 1898 187949 -15 2061 191178 -16 2220 193664 -17 2250 185291 -18 2375 185172 -19 2527 187018 -20 2675 188412 -21 2826 189914 -22 2982 191522 -23 3027 186202 -24 3179 187586 -25 3222 182700 -26 3381 184456 -27 3540 186153 -28 3695 187471 -29 3850 188691 -30 4010 190033 -31 4088 187542 -32 4156 184792 -33 4310 185861 -34 4355 182316 -35 4399 178923 -36 4550 179948 -37 4703 180969 -38 4865 182277 -39 5027 183505 -40 5187 184607 -41 5310 184346 -42 5456 184896 -43 5608 185590 -44 5630 182048 -45 5697 180102 -46 5850 180864 -47 6007 181716 -48 6161 182443 -49 6204 179924 -50 6366 180881 -51 6493 180815 -52 6568 179320 -53 6721 179986 -54 6845 179853 -55 6922 178501 -56 7082 179302 -57 7233 179848 -58 7389 180470 -59 7514 180359 -60 7673 181011 -61 7832 181661 -62 7866 179433 -63 7905 177368 -64 8025 177167 -65 8181 177751 -66 8343 178448 -67 8376 176397 -68 8528 176877 -69 8681 177351 -70 8844 178020 -71 8995 178408 -72 9153 178932 -73 9209 177478 -74 9366 177963 -75 9525 178476 -76 9599 177412 -77 9752 177790 -78 9779 175907 -79 9802 173994 -80 9824 172102 -81 9977 172535 -82 10092 172295 -83 10248 172763 -84 10275 171049 -85 10425 171422 -86 10546 171284 -87 10698 171660 -88 10857 172130 -89 11012 172529 -90 11162 172827 -91 11323 173296 -92 11475 173607 -93 11625 173881 -94 11784 174292 -95 11938 174603 -96 12068 174562 -97 12226 174917 -98 12358 174892 -99 12387 173430 -100 12545 173776 -101 12596 172639 -102 12749 172925 -103 12804 171882 -104 12965 172254 -105 13129 172661 -106 13292 173051 -107 13449 173343 -108 13485 172092 -109 13633 172280 -110 13756 172146 -111 13906 172338 -112 14059 172566 -113 14105 171489 -114 14264 171788 -115 14415 171989 -116 14567 172196 -117 14731 172536 -118 14892 172833 -119 15057 173155 -120 15108 172182 -121 15271 172489 -122 15431 172752 -123 15556 172621 -124 15626 171894 -125 15781 172096 -126 15942 172352 -127 16104 172619 -128 16265 172863 -129 16419 173032 -130 16577 173241 -131 16735 173438 -132 16858 173273 -133 17013 173437 -134 17142 173329 -135 17218 172687 -136 17374 172855 -137 17397 171706 -138 17549 171838 -139 17712 172066 -140 17870 172236 -141 17902 171207 -142 18062 171401 -143 18223 171605 -144 18381 171767 -145 18543 171969 -146 18711 172224 -147 18874 172420 -148 19025 172508 -149 19182 172640 -150 19344 172816 -151 19502 172953 -152 19659 173076 -153 19813 173176 -154 19975 173336 -155 20010 172401 -156 20127 172175 -157 20279 172249 -158 20435 172355 -159 20517 171832 -160 20672 171926 -161 20829 172035 -162 20985 172132 -163 21148 172285 -164 21305 172383 -165 21457 172438 -166 21618 172559 -167 21784 172716 -168 21915 172597 -169 22076 172713 -170 22144 172103 -171 22294 172130 -172 22444 172163 -173 22480 171315 -174 22631 171355 -175 22795 171484 -176 22958 171606 -177 23107 171619 -178 23265 171698 -179 23433 171846 -180 23595 171945 -181 23758 172056 -182 23910 172073 -183 24074 172187 -184 24227 172212 -185 24283 171552 -186 24440 171608 -187 24606 171722 -188 24728 171528 -189 24884 171573 -190 25036 171587 -191 25094 170953 -192 25252 171007 -193 25405 171031 -194 25533 170876 -195 25691 170926 -196 25849 170976 -197 26000 170972 -198 26147 170944 -199 26309 171012 -200 26464 171030 -201 26583 170821 -202 26736 170825 -203 26889 170828 -204 27045 170851 -205 27201 170868 -206 27357 170885 -207 27518 170932 -208 27571 170307 -209 27727 170325 -210 27804 169860 -211 27967 169913 -212 28133 169988 -213 28292 170021 -214 28455 170069 -215 28606 170051 -216 28759 170040 -217 28919 170070 -218 29071 170050 -219 29232 170080 -220 29402 170161 -221 29557 170155 -222 29681 169968 -223 29839 169980 -224 30001 170010 -225 30158 170010 -226 30184 169275 -227 30338 169257 -228 30371 168569 -229 30417 167955 -230 30538 167763 -231 30697 167776 -232 30860 167813 -233 31025 167856 -234 31189 167893 -235 31317 167735 -236 31484 167785 -237 31646 167804 -238 31796 167760 -239 31951 167743 -240 32107 167733 -241 32262 167713 -242 32414 167674 -243 32572 167667 -244 32737 167696 -245 32774 167072 -246 32928 167040 -247 33088 167043 -248 33257 167088 -249 33423 167117 -250 33580 167097 -251 33620 166502 -252 33655 165883 -253 33813 165873 -254 33970 165854 -255 34130 165852 -256 34285 165822 -257 34448 165833 -258 34573 165660 -259 34722 165600 -260 34878 165574 -261 35040 165570 -262 35200 165560 -263 35356 165530 -264 35425 165095 -265 35582 165069 -266 35740 165046 -267 35897 165021 -268 36050 164974 -269 36208 164948 -270 36366 164923 -271 36525 164900 -272 36689 164902 -273 36850 164884 -274 37011 164869 -275 37086 164471 -276 37247 164452 -277 37407 164432 -278 37558 164367 -279 37714 164327 -280 37871 164287 -281 38028 164251 -282 38183 164201 -283 38342 164171 -284 38507 164163 -285 38673 164159 -286 38830 164116 -287 38888 163653 -288 39047 163619 -289 39177 163462 -290 39337 163434 -291 39493 163382 -292 39644 163312 -293 39710 162895 -294 39861 162824 -295 40021 162792 -296 40068 162297 -297 40225 162251 -298 40380 162198 -299 40530 162121 -300 40686 162069 -301 40852 162056 -302 40925 161675 -303 41086 161643 -304 41255 161640 -305 41425 161638 -306 41583 161592 -307 41735 161521 -308 41894 161477 -309 42061 161462 -310 42224 161432 -311 42390 161411 -312 42552 161374 -313 42713 161331 -314 42879 161309 -315 43040 161264 -316 43197 161207 -317 43358 161164 -318 43512 161093 -319 43672 161043 -320 43834 160999 -321 43994 160948 -322 44158 160911 -323 44321 160869 -324 44483 160823 -325 44635 160741 -326 44790 160668 -327 44818 160142 -328 44973 160072 -329 45118 159966 -330 45162 159501 -331 45315 159422 -332 45470 159352 -333 45624 159276 -334 45791 159244 -335 45951 159189 -336 46082 159033 -337 46242 158976 -338 46396 158898 -339 46548 158811 -340 46712 158766 -341 46840 158598 -342 47000 158541 -343 47163 158491 -344 47324 158435 -345 47483 158369 -346 47639 158294 -347 47798 158230 -348 47875 157892 -349 48030 157814 -350 48184 157731 -351 48347 157678 -352 48505 157609 -353 48661 157529 -354 48821 157466 -355 48986 157416 -356 49150 157363 -357 49191 156917 -358 49342 156822 -359 49498 156745 -360 49651 156655 -361 49800 156554 -362 49957 156478 -363 50086 156313 -364 50248 156252 -365 50412 156197 -366 50572 156127 -367 50730 156052 -368 50884 155962 -369 51037 155872 -370 51196 155797 -371 51360 155739 -372 51512 155643 -373 51670 155562 -374 51830 155490 -375 51982 155393 -376 52014 154938 -377 52063 154537 -378 52219 154452 -379 52379 154381 -380 52542 154317 -381 52586 153905 -382 52741 153818 -383 52900 153742 -384 53054 153650 -385 53205 153551 -386 53356 153452 -387 53389 153013 -388 53540 152914 -389 53705 152853 -390 53775 152524 -391 53926 152426 -392 54085 152348 -393 54245 152273 -394 54409 152209 -395 54575 152150 -396 54732 152065 -397 54893 151990 -398 55039 151877 -399 55191 151776 -400 55348 151690 -401 55389 151286 -402 55445 150926 -403 55602 150843 -404 55729 150675 -405 55882 150578 -406 56031 150471 -407 56190 150392 -408 56355 150327 -409 56520 150263 -410 56681 150184 -411 56842 150107 -412 56992 150000 -413 57150 149917 -414 57305 149823 -415 57427 149643 -416 57588 149564 -417 57619 149148 -418 57779 149067 -419 57823 148690 -420 57968 148570 -421 58118 148463 -422 58275 148376 -423 58346 148066 -424 58496 147962 -425 58609 147761 -426 58722 147563 -427 58874 147460 -428 59041 147396 -429 59195 147299 -430 59345 147193 -431 59502 147103 -432 59657 147008 -433 59807 146899 -434 59963 146807 -435 60119 146714 -436 60282 146637 -437 60435 146536 -438 60592 146444 -439 60757 146369 -440 60908 146262 -441 61058 146154 -442 61213 146055 -443 61369 145959 -444 61527 145868 -445 61685 145778 -446 61839 145675 -447 61992 145571 -448 62145 145468 -449 62299 145366 -450 62457 145272 -451 62624 145201 -452 62776 145092 -453 62930 144989 -454 63049 144805 -455 63205 144707 -456 63363 144613 -457 63531 144541 -458 63688 144444 -459 63839 144333 -460 63992 144226 -461 64150 144131 -462 64317 144055 -463 64473 143953 -464 64629 143852 -465 64785 143750 -466 64937 143641 -467 65094 143540 -468 65258 143457 -469 65418 143363 -470 65576 143265 -471 65740 143179 -472 65900 143085 -473 65946 142744 -474 65998 142417 -475 66158 142324 -476 66318 142229 -477 66480 142141 -478 66636 142037 -479 66789 141927 -480 66949 141832 -481 67112 141744 -482 67280 141665 -483 67441 141571 -484 67600 141472 -485 67752 141360 -486 67915 141269 -487 68073 141168 -488 68227 141059 -489 68385 140957 -490 68539 140848 -491 68691 140734 -492 68852 140638 -493 69011 140538 -494 69168 140432 -495 69329 140337 -496 69482 140222 -497 69607 140052 -498 69761 139942 -499 69885 139771 -500 70046 139672 -501 70195 139552 -502 70228 139199 -503 70391 139107 -504 70556 139017 -505 70707 138900 -506 70864 138793 -507 71018 138682 -508 71175 138576 -509 71334 138472 -510 71497 138378 -511 71614 138192 -512 71775 138094 -513 71930 137984 -514 72087 137876 -515 72245 137770 -516 72399 137657 -517 72553 137542 -518 72704 137423 -519 72755 137116 -520 72911 137006 -521 72983 136739 -522 73137 136626 -523 73169 136284 -524 73329 136182 -525 73487 136077 -526 73522 135744 -527 73681 135640 -528 73839 135534 -529 73913 135275 -530 74068 135165 -531 74234 135072 -532 74302 134803 -533 74451 134682 -534 74612 134582 -535 74653 134264 -536 74725 134005 -537 74887 133906 -538 75048 133807 -539 75213 133713 -540 75365 133596 -541 75513 133472 -542 75669 133361 -543 75829 133258 -544 75882 132967 -545 76033 132850 -546 76194 132748 -547 76344 132627 -548 76495 132508 -549 76653 132401 -550 76817 132303 -551 76969 132186 -552 77122 132071 -553 77278 131958 -554 77437 131852 -555 77592 131740 -556 77757 131643 -557 77915 131534 -558 78062 131407 -559 78224 131305 -560 78297 131053 -561 78449 130934 -562 78605 130822 -563 78760 130709 -564 78810 130420 -565 78969 130313 -566 79129 130207 -567 79295 130111 -568 79449 129996 -569 79599 129872 -570 79748 129748 -571 79901 129629 -572 80056 129515 -573 80210 129398 -574 80355 129267 -575 80504 129143 -576 80664 129034 -577 80826 128930 -578 80987 128823 -579 81146 128714 -580 81297 128592 -581 81447 128469 -582 81601 128350 -583 81749 128224 -584 81906 128110 -585 82058 127988 -586 82227 127894 -587 82386 127782 -588 82540 127664 -589 82613 127421 -590 82772 127310 -591 82927 127192 -592 83083 127076 -593 83243 126967 -594 83394 126843 -595 83473 126610 -596 83598 126447 -597 83767 126352 -598 83928 126243 -599 84084 126127 -600 84126 125840 -601 84284 125726 -602 84438 125607 -603 84586 125479 -604 84747 125369 -605 84901 125250 -606 85049 125122 -607 85204 125003 -608 85359 124885 -609 85514 124767 -610 85665 124642 -611 85789 124478 -612 85946 124363 -613 85992 124087 -614 86142 123961 -615 86263 123793 -616 86396 123643 -617 86546 123517 -618 86706 123406 -619 86860 123285 -620 87007 123154 -621 87161 123035 -622 87208 122764 -623 87366 122649 -624 87493 122490 -625 87656 122382 -626 87823 122280 -627 87988 122174 -628 88153 122069 -629 88316 121961 -630 88480 121853 -631 88643 121743 -632 88801 121628 -633 88960 121513 -634 89124 121406 -635 89276 121281 -636 89301 120984 -637 89451 120857 -638 89605 120736 -639 89761 120617 -640 89919 120500 -641 90074 120380 -642 90222 120250 -643 90386 120141 -644 90549 120030 -645 90703 119907 -646 90865 119796 -647 90948 119580 -648 91101 119457 -649 91254 119332 -650 91419 119225 -651 91585 119117 -652 91746 119004 -653 91905 118887 -654 92069 118776 -655 92226 118657 -656 92387 118543 -657 92464 118321 -658 92588 118159 -659 92660 117931 -660 92703 117668 -661 92866 117555 -662 93021 117434 -663 93183 117321 -664 93344 117206 -665 93513 117102 -666 93672 116984 -667 93832 116869 -668 93871 116603 -669 94031 116486 -670 94184 116362 -671 94340 116240 -672 94492 116114 -673 94641 115985 -674 94800 115867 -675 94926 115708 -676 95073 115576 -677 95230 115456 -678 95391 115340 -679 95550 115223 -680 95705 115099 -681 95855 114970 -682 96011 114848 -683 96166 114725 -684 96323 114604 -685 96453 114450 -686 96608 114327 -687 96771 114212 -688 96930 114093 -689 97080 113964 -690 97233 113837 -691 97394 113721 -692 97548 113596 -693 97714 113483 -694 97873 113364 -695 97996 113202 -696 98152 113079 -697 98310 112957 -698 98459 112826 -699 98612 112699 -700 98763 112570 -701 98914 112441 -702 99074 112321 -703 99224 112191 -704 99372 112057 -705 99525 111930 -706 99678 111803 -707 99736 111569 -708 99887 111440 -709 100036 111308 -710 100194 111186 -711 100362 111075 -712 100525 110958 -713 100685 110838 -714 100845 110718 -715 100998 110590 -716 101044 110345 -717 101197 110217 -718 101352 110092 -719 101512 109971 -720 101666 109844 -721 101831 109729 -722 101998 109616 -723 102158 109496 -724 102317 109373 -725 102477 109252 -726 102532 109020 -727 102691 108897 -728 102853 108778 -729 102885 108523 -730 103042 108398 -731 103198 108273 -732 103354 108148 -733 103519 108032 -734 103669 107900 -735 103824 107773 -736 103993 107662 -737 104152 107539 -738 104191 107293 -739 104346 107166 -740 104495 107034 -741 104649 106905 -742 104699 106672 -743 104854 106546 -744 105010 106419 -745 105167 106295 -746 105325 106170 -747 105477 106041 -748 105641 105923 -749 105790 105790 -750 105950 105668 -751 106112 105547 -752 106150 105304 -753 106303 105175 -754 106461 105051 -755 106616 104923 -756 106773 104799 -757 106932 104675 -758 107089 104549 -759 107128 104309 -760 107290 104188 -761 107449 104065 -762 107603 103936 -763 107636 103691 -764 107788 103561 -765 107944 103434 -766 108109 103317 -767 108267 103192 -768 108426 103068 -769 108591 102950 -770 108626 102708 -771 108775 102575 -772 108928 102446 -773 109085 102320 -774 109249 102201 -775 109410 102078 -776 109565 101950 -777 109712 101815 -778 109866 101686 -779 110018 101555 -780 110168 101422 -781 110322 101293 -782 110480 101167 -783 110632 101036 -784 110788 100909 -785 110948 100785 -786 111096 100650 -787 111257 100526 -788 111415 100401 -789 111570 100272 -790 111722 100141 -791 111792 99935 -792 111958 99816 -793 112116 99690 -794 112156 99459 -795 112312 99331 -796 112479 99213 -797 112634 99084 -798 112791 98957 -799 112944 98826 -800 113111 98707 -801 113262 98575 -802 113413 98442 -803 113565 98310 -804 113717 98178 -805 113752 97945 -806 113907 97816 -807 114063 97687 -808 114223 97563 -809 114374 97430 -810 114539 97308 -811 114690 97176 -812 114839 97041 -813 115002 96918 -814 115167 96797 -815 115318 96664 -816 115478 96538 -817 115547 96336 -818 115713 96215 -819 115878 96094 -820 116038 95968 -821 116110 95769 -822 116155 95549 -823 116309 95418 -824 116466 95290 -825 116630 95168 -826 116786 95039 -827 116939 94907 +0 18 13515 +1 32 11980 +2 45 11445 +3 58 10965 +4 72 10847 +5 86 10711 +6 101 10762 +7 114 10659 +8 129 10690 +9 143 10638 +10 156 10541 +11 170 10511 +12 184 10482 +13 198 10417 +14 212 10422 +15 227 10443 +16 242 10474 +17 257 10467 +18 271 10433 +19 286 10444 +20 300 10416 +21 313 10363 +22 325 10298 +23 339 10281 +24 352 10222 +25 365 10178 +26 378 10137 +27 391 10085 +28 403 10042 +29 416 9992 +30 429 9970 +31 444 9974 +32 458 9955 +33 470 9912 +34 483 9877 +35 496 9856 +36 510 9842 +37 528 9910 +38 546 9963 +39 562 9988 +40 581 10059 +41 596 10056 +42 608 10012 +43 622 9983 +44 635 9953 +45 648 9922 +46 661 9896 +47 674 9869 +48 687 9839 +49 700 9813 +50 713 9784 +51 726 9758 +52 740 9739 +53 753 9716 +54 766 9685 +55 779 9661 +56 792 9636 +57 806 9617 +58 820 9607 +59 833 9583 +60 846 9558 +61 859 9540 +62 873 9521 +63 886 9497 +64 907 9563 +65 920 9543 +66 935 9539 +67 949 9523 +68 961 9491 +69 974 9465 +70 988 9449 +71 1007 9488 +72 1020 9468 +73 1033 9441 +74 1046 9420 +75 1059 9393 +76 1071 9369 +77 1084 9345 +78 1098 9328 +79 1116 9348 +80 1129 9331 +81 1143 9312 +82 1157 9303 +83 1176 9328 +84 1191 9321 +85 1204 9302 +86 1218 9288 +87 1233 9276 +88 1246 9259 +89 1260 9242 +90 1274 9226 +91 1286 9200 +92 1300 9184 +93 1313 9164 +94 1326 9145 +95 1340 9130 +96 1355 9123 +97 1368 9107 +98 1381 9087 +99 1395 9070 +100 1408 9051 +101 1421 9031 +102 1434 9012 +103 1509 9376 +104 1558 9572 +105 1571 9548 +106 1584 9524 +107 1597 9495 +108 1610 9468 +109 1623 9447 +110 1637 9428 +111 1654 9426 +112 1667 9401 +113 1680 9375 +114 1693 9352 +115 1706 9326 +116 1720 9310 +117 1735 9294 +118 1748 9271 +119 1762 9251 +120 1776 9234 +121 1789 9209 +122 1801 9182 +123 1814 9160 +124 1829 9146 +125 1843 9127 +126 1855 9104 +127 1868 9079 +128 1881 9058 +129 1894 9034 +130 1908 9017 +131 1921 8997 +132 1933 8971 +133 1946 8947 +134 1959 8925 +135 1972 8904 +136 1984 8881 +137 1997 8856 +138 2009 8834 +139 2022 8810 +140 2036 8795 +141 2049 8774 +142 2062 8755 +143 2076 8737 +144 2089 8717 +145 2108 8721 +146 2129 8734 +147 2148 8740 +148 2168 8746 +149 2188 8753 +150 2208 8759 +151 2231 8780 +152 2250 8783 +153 2271 8792 +154 2291 8797 +155 2311 8802 +156 2329 8798 +157 2349 8802 +158 2367 8799 +159 2386 8800 +160 2408 8811 +161 2429 8819 +162 2448 8817 +163 2465 8811 +164 2483 8803 +165 2500 8795 +166 2519 8796 +167 2536 8788 +168 2555 8785 +169 2570 8771 +170 2588 8762 +171 2608 8766 +172 2623 8751 +173 2641 8743 +174 2656 8729 +175 2671 8713 +176 2690 8710 +177 2711 8712 +178 2732 8715 +179 2753 8718 +180 2770 8708 +181 2788 8701 +182 2807 8698 +183 2826 8693 +184 2844 8686 +185 2866 8693 +186 2883 8682 +187 2900 8669 +188 2920 8668 +189 2937 8658 +190 2953 8645 +191 2971 8635 +192 2993 8638 +193 3010 8626 +194 3026 8614 +195 3043 8602 +196 3061 8593 +197 3078 8582 +198 3097 8577 +199 3116 8571 +200 3132 8554 +201 3146 8536 +202 3164 8526 +203 3181 8514 +204 3198 8504 +205 3216 8493 +206 3235 8486 +207 3253 8478 +208 3270 8464 +209 3288 8456 +210 3303 8439 +211 3316 8416 +212 3330 8395 +213 3343 8374 +214 3355 8350 +215 3368 8327 +216 3382 8307 +217 3395 8285 +218 3407 8262 +219 3420 8239 +220 3434 8220 +221 3447 8198 +222 3459 8175 +223 3473 8156 +224 3486 8136 +225 3500 8116 +226 3513 8095 +227 3527 8075 +228 3541 8057 +229 3559 8048 +230 3574 8030 +231 3587 8010 +232 3600 7989 +233 3614 7969 +234 3626 7947 +235 3639 7927 +236 3652 7906 +237 3665 7886 +238 3678 7865 +239 3693 7847 +240 3706 7828 +241 3719 7808 +242 3732 7787 +243 3744 7766 +244 3757 7745 +245 3770 7724 +246 3783 7704 +247 3796 7685 +248 3809 7665 +249 3822 7644 +250 3835 7624 +251 3848 7605 +252 3862 7586 +253 3874 7566 +254 3887 7546 +255 3900 7527 +256 3913 7507 +257 3926 7488 +258 3940 7469 +259 3952 7449 +260 3965 7429 +261 3980 7414 +262 3998 7403 +263 4017 7395 +264 4034 7383 +265 4050 7369 +266 4069 7361 +267 4087 7351 +268 4107 7343 +269 4127 7337 +270 4143 7324 +271 4163 7317 +272 4179 7303 +273 4198 7294 +274 4214 7279 +275 4233 7269 +276 4249 7257 +277 4266 7243 +278 4283 7231 +279 4301 7220 +280 4320 7211 +281 4338 7199 +282 4356 7189 +283 4379 7185 +284 4400 7179 +285 4426 7181 +286 4444 7169 +287 4462 7158 +288 4478 7144 +289 4498 7135 +290 4516 7123 +291 4536 7115 +292 4559 7112 +293 4577 7100 +294 4598 7093 +295 4616 7080 +296 4635 7070 +297 4654 7060 +298 4673 7050 +299 4692 7038 +300 4710 7027 +301 4732 7021 +302 4752 7010 +303 4768 6995 +304 4785 6982 +305 4803 6970 +306 4821 6958 +307 4837 6942 +308 4856 6930 +309 4875 6920 +310 4893 6908 +311 4912 6895 +312 4931 6885 +313 4951 6875 +314 4968 6861 +315 4986 6848 +316 5000 6830 +317 5015 6813 +318 5029 6795 +319 5045 6779 +320 5060 6762 +321 5076 6747 +322 5088 6727 +323 5102 6708 +324 5114 6688 +325 5128 6670 +326 5140 6649 +327 5153 6630 +328 5166 6611 +329 5179 6592 +330 5196 6578 +331 5216 6567 +332 5236 6557 +333 5259 6550 +334 5280 6541 +335 5301 6532 +336 5316 6515 +337 5329 6496 +338 5343 6478 +339 5356 6459 +340 5370 6440 +341 5383 6422 +342 5396 6403 +343 5410 6385 +344 5424 6367 +345 5437 6348 +346 5450 6330 +347 5463 6311 +348 5476 6292 +349 5489 6274 +350 5503 6256 +351 5519 6240 +352 5533 6223 +353 5554 6213 +354 5575 6203 +355 5596 6194 +356 5618 6185 +357 5633 6168 +358 5646 6149 +359 5660 6131 +360 5672 6112 +361 5685 6093 +362 5697 6074 +363 5710 6056 +364 5723 6036 +365 5736 6018 +366 5748 5999 +367 5762 5981 +368 5775 5963 +369 5789 5945 +370 5802 5927 +371 5815 5909 +372 5829 5891 +373 5842 5873 +374 5856 5856 +375 5877 5846 +376 5897 5834 +377 5914 5820 +378 5930 5805 +379 5950 5793 +380 5968 5780 +381 5983 5764 +382 6001 5750 +383 6021 5739 +384 6041 5727 +385 6061 5716 +386 6082 5704 +387 6100 5691 +388 6118 5678 +389 6136 5664 +390 6156 5652 +391 6179 5643 +392 6198 5630 +393 6217 5617 +394 6237 5605 +395 6255 5591 +396 6274 5579 +397 6292 5564 +398 6309 5550 +399 6328 5537 +400 6346 5523 +401 6364 5509 +402 6380 5493 +403 6397 5479 +404 6416 5466 +405 6434 5452 +406 6453 5438 +407 6471 5424 +408 6502 5421 +409 6521 5408 +410 6540 5394 +411 6557 5380 +412 6574 5364 +413 6602 5358 +414 6621 5345 +415 6641 5332 +416 6661 5319 +417 6680 5306 +418 6698 5291 +419 6719 5279 +420 6738 5265 +421 6759 5253 +422 6780 5241 +423 6802 5229 +424 6820 5215 +425 6838 5201 +426 6858 5187 +427 6878 5175 +428 6896 5160 +429 6914 5145 +430 6932 5130 +431 6945 5112 +432 6968 5101 +433 6984 5085 +434 6997 5066 +435 7011 5049 +436 7026 5032 +437 7039 5014 +438 7057 4999 +439 7070 4981 +440 7084 4963 +441 7097 4945 +442 7109 4927 +443 7123 4909 +444 7136 4891 +445 7149 4873 +446 7163 4855 +447 7181 4840 +448 7194 4822 +449 7207 4805 +450 7220 4787 +451 7233 4768 +452 7246 4751 +453 7258 4732 +454 7271 4714 +455 7285 4697 +456 7298 4679 +457 7311 4661 +458 7323 4642 +459 7335 4624 +460 7348 4606 +461 7361 4588 +462 7374 4571 +463 7386 4553 +464 7399 4535 +465 7412 4517 +466 7425 4499 +467 7437 4481 +468 7450 4464 +469 7463 4446 +470 7476 4428 +471 7490 4411 +472 7509 4397 +473 7522 4380 +474 7535 4362 +475 7549 4345 +476 7561 4327 +477 7575 4310 +478 7590 4294 +479 7608 4279 +480 7730 4323 +481 7746 4307 +482 7766 4293 +483 7784 4278 +484 7801 4262 +485 7820 4248 +486 7838 4233 +487 7856 4218 +488 7879 4205 +489 7898 4190 +490 7915 4175 +491 7938 4162 +492 7965 4152 +493 7985 4138 +494 8006 4124 +495 8025 4109 +496 8052 4099 +497 8070 4084 +498 8087 4068 +499 8104 4052 +500 8124 4038 +501 8148 4025 +502 8167 4010 +503 8189 3997 +504 8220 3988 +505 8246 3976 +506 8270 3963 +507 8287 3948 +508 8308 3934 +509 8326 3918 +510 8346 3903 +511 8365 3888 +512 8386 3874 +513 8406 3859 +514 8427 3845 +515 8443 3829 +516 8460 3812 +517 8479 3797 +518 8498 3782 +519 8516 3767 +520 8543 3755 +521 8563 3740 +522 8581 3724 +523 8599 3708 +524 8618 3693 +525 8646 3682 +526 8665 3667 +527 8683 3651 +528 8704 3636 +529 8721 3620 +530 8740 3604 +531 8759 3589 +532 8779 3574 +533 8802 3560 +534 8822 3545 +535 8841 3529 +536 8859 3514 +537 8876 3497 +538 8893 3481 +539 8911 3465 +540 8929 3449 +541 8943 3432 +542 8957 3414 +543 8972 3397 +544 8986 3380 +545 8999 3362 +546 9013 3345 +547 9026 3327 +548 9040 3309 +549 9053 3292 +550 9067 3274 +551 9080 3257 +552 9095 3240 +553 9109 3222 +554 9122 3205 +555 9135 3187 +556 9148 3169 +557 9162 3152 +558 9175 3134 +559 9188 3117 +560 9202 3100 +561 9215 3082 +562 9228 3065 +563 9243 3048 +564 9256 3030 +565 9270 3013 +566 9284 2996 +567 9298 2979 +568 9311 2962 +569 9324 2944 +570 9338 2927 +571 9351 2910 +572 9365 2892 +573 9378 2875 +574 9392 2858 +575 9406 2841 +576 9419 2824 +577 9432 2806 +578 9445 2789 +579 9459 2772 +580 9472 2755 +581 9487 2738 +582 9515 2725 +583 9531 2709 +584 9548 2693 +585 9568 2677 +586 9582 2660 +587 9596 2643 +588 9609 2626 +589 9622 2609 +590 9636 2592 +591 9649 2575 +592 9662 2558 +593 9677 2541 +594 9690 2524 +595 9704 2507 +596 9732 2494 +597 9752 2478 +598 9775 2464 +599 9792 2448 +600 9805 2431 +601 9819 2413 +602 9831 2396 +603 9844 2379 +604 9857 2362 +605 9874 2346 +606 9888 2329 +607 9902 2312 +608 9917 2296 +609 9932 2279 +610 9946 2262 +611 9961 2246 +612 9975 2229 +613 9988 2212 +614 10001 2195 +615 10015 2178 +616 10028 2161 +617 10044 2145 +618 10058 2128 +619 10072 2111 +620 10085 2094 +621 10098 2078 +622 10112 2061 +623 10126 2044 +624 10139 2027 +625 10152 2011 +626 10165 1994 +627 10178 1977 +628 10192 1960 +629 10205 1943 +630 10218 1927 +631 10231 1910 +632 10245 1893 +633 10259 1877 +634 10272 1860 +635 10286 1843 +636 10300 1827 +637 10312 1810 +638 10325 1793 +639 10339 1777 +640 10352 1760 +641 10365 1743 +642 10378 1727 +643 10391 1710 +644 10404 1693 +645 10418 1677 +646 10431 1660 +647 10445 1644 +648 10457 1627 +649 10471 1611 +650 10485 1594 +651 10500 1578 +652 10517 1562 +653 10531 1545 +654 10544 1529 +655 10557 1512 +656 10576 1497 +657 10595 1481 +658 10615 1465 +659 10635 1450 +660 10657 1435 +661 10677 1419 +662 10698 1403 +663 10717 1388 +664 10738 1372 +665 10754 1356 +666 10773 1340 +667 10790 1324 +668 10812 1309 +669 10833 1293 +670 10851 1277 +671 10873 1262 +672 10896 1246 +673 10918 1231 +674 10937 1215 +675 10959 1199 +676 10977 1183 +677 10995 1167 +678 11011 1151 +679 11031 1135 +680 11049 1119 +681 11070 1103 +682 11091 1088 +683 11109 1071 +684 11127 1055 +685 11143 1039 +686 11162 1023 +687 11179 1007 +688 11205 992 +689 11225 976 +690 11247 960 +691 11269 944 +692 11287 928 +693 11305 912 +694 11324 896 +695 11344 880 +696 11364 864 +697 11382 848 +698 11398 831 +699 11420 815 +700 11435 799 +701 11452 783 +702 11474 767 +703 11492 750 +704 11517 735 +705 11534 718 +706 11556 702 +707 11573 686 +708 11595 670 +709 11614 654 +710 11633 638 +711 11652 621 +712 11672 605 +713 11691 589 +714 11713 573 +715 11732 557 +716 11751 540 +717 11769 524 +718 11782 508 +719 11795 491 +720 11809 474 +721 11822 458 +722 11837 442 +723 11850 425 +724 11864 409 +725 11878 392 +726 11892 376 +727 11908 359 +728 11923 343 +729 11937 327 +730 11950 310 +731 11965 294 +732 11979 277 +733 11992 261 +734 12005 245 +735 12019 228 +736 12036 212 +737 12056 196 +738 12074 179 +739 12095 163 +740 12111 147 +741 12124 130 +742 12137 114 +743 12151 97 +744 12183 81 +745 12198 65 +746 12214 49 +747 12227 32 +748 12241 16 +749 12254 0 diff --git a/main/factor/__pycache__/concept_factor.cpython-313.pyc b/main/factor/__pycache__/concept_factor.cpython-313.pyc new file mode 100644 index 0000000..307b8d1 Binary files /dev/null and b/main/factor/__pycache__/concept_factor.cpython-313.pyc differ diff --git a/main/factor/__pycache__/factor.cpython-313.pyc b/main/factor/__pycache__/factor.cpython-313.pyc index 6d7b8cc..f4d6cae 100644 Binary files a/main/factor/__pycache__/factor.cpython-313.pyc and b/main/factor/__pycache__/factor.cpython-313.pyc differ diff --git a/main/factor/__pycache__/money_factor.cpython-313.pyc b/main/factor/__pycache__/money_factor.cpython-313.pyc index de80b08..36a061c 100644 Binary files a/main/factor/__pycache__/money_factor.cpython-313.pyc and b/main/factor/__pycache__/money_factor.cpython-313.pyc differ diff --git a/main/factor/concept_factor.py b/main/factor/concept_factor.py new file mode 100644 index 0000000..9df5eb4 --- /dev/null +++ b/main/factor/concept_factor.py @@ -0,0 +1,82 @@ +import pandas as pd +import numpy as np +from tqdm import tqdm + +def _prepare_concept_df(concept_dict: dict) -> pd.DataFrame: + """将 concept_dict 转换为长格式的 DataFrame。""" + records = [] + for date_str, inner_dict in concept_dict.items(): + trade_date = pd.to_datetime(date_str, format='%Y%m%d') + for concept_name, stock_list in inner_dict.items(): + for ts_code in stock_list: + records.append((trade_date, concept_name, ts_code)) + + if not records: + return pd.DataFrame(columns=['trade_date', 'concept_name', 'ts_code']) + + concept_df = pd.DataFrame(records, columns=['trade_date', 'concept_name', 'ts_code']) + concept_df = concept_df.drop_duplicates(subset=["trade_date", "ts_code"], keep="first") + + return concept_df + +def generate_concept_factors(df: pd.DataFrame, concept_dict: dict) -> pd.DataFrame: + """ + 基于热门概念数据生成因子。 + + Args: + df (pd.DataFrame): 所有股票所有日期的数据,需包含 'ts_code', 'trade_date' + 以及用于聚合的列 (如 'pct_chg', 'turnover_rate')。 + concept_dict (dict): 每日热门概念及其股票列表的字典。 + + Returns: + pd.DataFrame: 添加了概念相关因子的原始 DataFrame。 + """ + print("开始生成概念相关因子...") + + # 0. 准备工作,创建副本以避免修改原始df + df = df.copy() + df['trade_date'] = pd.to_datetime(df['trade_date']) + + # 1. 将 concept_dict 转换为适合合并的 DataFrame + concept_df = _prepare_concept_df(concept_dict).sort_values(by=['trade_date']) + if concept_df.empty: + print("警告: concept_dict 为空或格式不正确,无法生成概念因子。") + return df + + # 2. 将概念信息合并到主数据 df + df = pd.merge(df, concept_df, on=['trade_date', 'ts_code'], how='left') + # --- 因子计算 --- + + # 因子 1: 是否属于当日热门概念 + df['cat_hot_concept_stock'] = df['concept_name'].notna().astype(np.int8) + + # 因子 2 & 3: 概念内的截面排序因子 + # 创建一个掩码,只对热门概念股进行后续计算,以提高效率 + hot_mask = df['concept_name'].notna() + + # 定义需要在概念内部进行截面排序的特征列表 + # 确保这些列存在于你的 df 中 + features_to_rank = ['pct_chg', 'turnover_rate', 'volume_ratio'] + + # 筛选出 df 中实际存在的特征列 + existing_features_to_rank = [f for f in features_to_rank if f in df.columns] + if not existing_features_to_rank: + print("警告: df 中缺少用于概念内排序的特征列,跳过相关因子计算。") + else: + print(f"开始计算概念内截面排序因子,基于: {existing_features_to_rank}") + + # 使用 groupby().rank() 高效计算截面排名 + grouped = df[hot_mask].groupby(['trade_date', 'concept_name']) + + for feature in tqdm(existing_features_to_rank, desc="Ranking Features in Concepts"): + # 计算百分比排名 (0到1之间),值越大表示排名越靠前 + rank_col_name = f'concept_rank_{feature}' + df[rank_col_name] = grouped[feature].rank(pct=True) + + # --- 清理 & 返回 --- + # `concept_name` 列包含了有用的信息,可以选择保留或删除 + # 这里我们选择保留,以便后续分析。如果不需要,可以取消下面这行注释。 + df.drop(columns=['concept_name'], inplace=True) + + print("概念相关因子生成完毕。") + return df \ No newline at end of file diff --git a/main/factor/factor.csv b/main/factor/factor.csv deleted file mode 100644 index 1cd1241..0000000 --- a/main/factor/factor.csv +++ /dev/null @@ -1,63 +0,0 @@ -序号 因子名称 (Factor Name / Column Name) 因子类别 (Factor Category) 简要说明 -1 pe_ttm 价值类因子 (Value) 市盈率 TTM -2 return_5, return_20 动量类因子 (Momentum) 过去5日/20日收益率 -3 act_factor1 to act_factor4 动量类 / 技术类因子 (Momentum / Technical) 基于不同周期EMA斜率计算的动量/趋势因子 -4 std_return_5, std_return_90, std_return_90_2 波动率类因子 (Volatility) 不同窗口期或延迟窗口期的滚动收益率标准差 -5 upside_vol, downside_vol 波动率类因子 (Volatility) N日滚动上/下行波动率 -6 vol_ratio 波动率类因子 (Volatility) 上行波动率 / 下行波动率 -7 std_return_5 / std_return_90 波动率类因子 (Volatility) 短期波动率 / 长期波动率 比率 -8 std_return_90 - std_return_90_2 波动率类因子 (Volatility) 长期波动率与其10日前值的差值(波动变化) -9 volatility (来自指数计算) 波动率类 / 市场因子 (Volatility / Market) 指数(或个股)的20日滚动收益率标准差 -10 log(circ_mv) (或 log_circ_mv) 市值类因子 (Size) 流通市值的对数值 -11 cs_rank_size 市值类因子 (Size) 对数流通市值的截面排序 -12 vol 流动性类因子 (Liquidity) 成交量 (通常需要与其他指标结合或处理) -13 turnover_rate 流动性类因子 (Liquidity) 换手率 -14 volume_ratio 流动性类因子 (Liquidity) 量比 -15 turnover_deviation 流动性类因子 (Liquidity) 换手率与其3日滚动均值的标准差倍数偏离 -16 cat_turnover_spike 流动性类 / 分类因子 (Liquidity / Categorical) 换手率是否显著高于近期均值 -17 volume_change_rate 流动性类因子 (Liquidity) 短期滚动成交量均值 / 长期滚动成交量均值 - 1 -18 cat_volume_breakout 流动性类 / 分类因子 (Liquidity / Categorical) 当日成交量是否大于过去5日最大成交量 -19 avg_volume_ratio 流动性类因子 (Liquidity) 3日滚动量比均值 -20 cat_volume_ratio_breakout 流动性类 / 分类因子 (Liquidity / Categorical) 当日量比是否大于过去5日最大量比 -21 vol_spike (Rolling Mean Vol) 流动性类因子 (Liquidity) 20日滚动成交量均值 -22 vol_std_5 流动性类 / 波动率因子 (Liquidity / Volatility) 成交量日变化率的5日滚动标准差 -23 volume_growth 流动性类因子 (Liquidity) 20日成交量变化率 -24 turnover_std 流动性类 / 波动率因子 (Liquidity / Volatility) 换手率的20日滚动标准差 -25 flow_lg_elg_intensity 资金流 / 流动性类因子 (Money Flow / Liquidity) (大单+超大单)净买入量 / 总成交量 -26 flow_divergence_diff, flow_divergence_ratio 资金流 / 情绪类因子 (Money Flow / Sentiment) 散户与主力资金流的差异或比率 -27 lg_elg_buy_prop 资金流 / 流动性类因子 (Money Flow / Liquidity) (大单+超大单)买入量 / 总买入量 -28 flow_struct_buy_change 资金流 / 流动性类因子 (Money Flow / Liquidity) 主力买入占比的日变化 -29 flow_lg_elg_accel 资金流 / 动量类因子 (Money Flow / Momentum) 主力资金流加速度 -30 active_buy_volume_large/big/small 资金流 / 流动性类因子 (Money Flow / Liquidity) 不同规模主动买入量 / 净流入量 -31 buy_lg/elg_vol_minus_sell_lg/elg_vol 资金流 / 流动性类因子 (Money Flow / Liquidity) 不同规模净买入量 / 总净流入量 -32 cs_rank_net_lg_flow_val, cs_rank_elg_buy_ratio, cs_rank_lg_sm_flow_diverge, cs_rank_elg_buy_sell_sm_ratio 资金流 / 复合因子 (截面排序) 各种资金流指标的截面排序 -33 cs_rank_ind_adj_lg_flow 资金流 / 复合因子 (行业调整+截面排序) 行业调整后的大单净流入截面排序 -34 chip_concentration_range, chip_skewness, cost_support_15pct_change, weight_roc5, cost_stability, ctrl_strength, low_cost_dev, asymmetry, cost_conc_std_N, profit_pressure, underwater_resistance, cs_rank_rel_profit_margin, cs_rank_cost_breadth, cs_rank_dist_to_upper_cost 定位类因子 (Positioning) / 技术类 基于持仓成本分布 (cost_*, weight_avg) 计算的各种指标及其截面排序 -35 winner_rate, cs_rank_winner_rate 定位类因子 (Positioning) / 技术类 获利盘比例及其截面排序 -36 floating_chip_proxy, price_cost_divergence, high_cost_break_days, liquidity_risk, lock_factor, cost_atr_adj, smallcap_concentration, cat_golden_resonance 定位类因子 (Positioning) / 复合因子 结合持仓成本与其他信息(价格、成交、波动率、市值)的复合指标 -37 cat_winner_price_zone 定位类 / 分类因子 (Positioning / Categorical) 基于成本和获利盘划分的区域类别 -38 flow_chip_consistency, profit_taking_vs_absorb, vol_amp_loss, vol_drop_profit_cnt, cost_break_confirm_cnt, vol_wgt_hist_pos, cs_rank_vol_x_profit_margin, cs_rank_cost_dist_vol_ratio 定位类因子 (Positioning) / 复合因子 进一步结合定位、资金流、量价的复杂交互因子 -39 return_skew, return_kurtosis 技术类 / 统计特征 (Technical / Stats) 滚动收益率的偏度与峰度 -40 rsi_3 技术类 / 动量类因子 (Technical / Momentum) 3日相对强弱指数 -41 obv, maobv_6, obv-maobv_6 技术类 / 量价因子 (Technical / Volume) 能量潮及其均线、差离 -42 atr_14, atr_6 技术类 / 波动率类因子 (Technical / Volatility) 平均真实波幅 -43 log_close 技术类 / 量价因子 (Technical / Price) 收盘价对数 -44 up, down 技术类 / 量价因子 (Technical / Price Action) 标准化上影线、下影线长度 -45 alpha_22_improved, alpha_003, alpha_007, alpha_013 技术类 / Alpha因子 (Technical / Alpha) WorldQuant Alpha 因子实现 -46 atr_norm_channel_pos 技术类 / 量价因子 (Technical / Price Action) ATR 标准化的价格通道位置 -47 turnover_diff_skew 技术类 / 流动性类 (Technical / Liquidity) 换手率变化率的偏度 -48 pullback_strong_N_M 技术类 / 动量类因子 (Technical / Momentum) 近期强势股的回调幅度 -49 vol_adj_roc 技术类 / 复合因子 (动量+波动率) 波动率调整后的 N 日变化率 -50 ar, br, arbr 情绪类 / 技术类因子 (Sentiment / Technical) ARBR 人气意愿指标 -51 up_ratio_20d (来自指数计算) 情绪类 / 市场因子 (Sentiment / Market) 指数(或个股)过去20天上涨天数比例 -52 cat_up_limit, cat_down_limit, up_limit_count_10d, down_limit_count_10d, consecutive_up_limit 事件驱动 / 市场状态因子 (Event / Market State) 涨跌停相关状态和计数 -53 momentum_factor, resonance_factor 复合因子 (量价) (Composite - P/V) 基于量、价、换手率等的简单复合 -54 cat_af2, cat_af3, cat_af4 复合因子 / 分类因子 (Composite / Cat.) act_factor 之间的比较 -55 act_factor5, act_factor6 复合因子 (技术类) (Composite - Technical) act_factor 1-4 的组合 -56 mv_volatility, mv_growth, mv_turnover_ratio, mv_adjusted_volume, mv_weighted_turnover, nonlinear_mv_volume, mv_volume_ratio, mv_momentum 复合因子 (市值+流动性/量价) 考虑了市值影响的量价、流动性或动量指标 -57 cap_neutral_cost_metric (占位符) 复合因子 / Alpha因子 (占位符) 市值行业中性化的成本指标(需实现) -58 hurst_exponent_flow (占位符) 资金流 / 统计因子 (占位符) 资金流的 Hurst 指数(需实现) -59 intraday_lg_flow_corr_N (占位符) 复合因子 (价格行为+资金流) (占位符) 日内趋势与大单流相关性(需实现) -60 industry_* (来自 industry_df) 行业因子 (Industry) 对应行业的各种指标(如行业收益率、行业动量等) -61 *_deviation (来自 create_deviation_within_dates) 复合因子 (相对行业) 个股因子相对于行业均值的偏离 -62 complex_factor_gplearn_1 复合因子 (GP生成) DEAP/GP 找到的因子表达式 1 \ No newline at end of file diff --git a/main/factor/money_factor.py b/main/factor/money_factor.py index 3466188..d3dec15 100644 --- a/main/factor/money_factor.py +++ b/main/factor/money_factor.py @@ -1,115 +1,112 @@ import pandas as pd import numpy as np -def holder_trade_factors(all_data_df: pd.DataFrame, stk_holdertrade_df: pd.DataFrame) -> pd.DataFrame: +def holder_trade_factors(all_data_df: pd.DataFrame, + stk_holdertrade_df: pd.DataFrame) -> pd.DataFrame: """ - 生成合并的股东增减持因子以及 change_ratio 相关因子(优化版)。 + 计算基于股东增减持数据的因子。 Args: - stk_holdertrade_df (pd.DataFrame): 股东增减持数据,包含 'ts_code', 'ann_date', 'in_de', 'change_ratio'。 - all_data_df (pd.DataFrame): 所有日期所有股票数据,包含 'ts_code', 'trade_date'。 + all_data_df (pd.DataFrame): 包含每日股票数据的 DataFrame, + 必须包含 'ts_code' 和 'trade_date' 列。 + stk_holdertrade_df (pd.DataFrame): 包含股东增减持信息的 DataFrame。 + 必须包含 'ts_code', 'ann_date', + 'in_de' (例如, '增持', '减持'), + 和 'change_ratio'。 Returns: - pd.DataFrame: 包含增减持因子的 all_data_df。 + pd.DataFrame: 添加了新的股东增减持因子的 all_data_df DataFrame。 """ - print('正在计算股东增减持因子(优化版)...') + print("开始计算股东增减持因子...") - # 1. 确保日期列为 datetime 类型 - stk_holdertrade_df['ann_date'] = pd.to_datetime(stk_holdertrade_df['ann_date']) - all_data_df['trade_date'] = pd.to_datetime(all_data_df['trade_date']) + # --- 1. 预处理 stk_holdertrade_df --- + # 创建副本以避免修改原始传入的DataFrame + stk_trade_processed_df = stk_holdertrade_df.copy() - # 2. 对增减持数据进行预处理和排序(排序在此阶段可能不是严格必需的,但保持良好习惯) - holder_data_processed = stk_holdertrade_df.copy() - holder_data_processed['change_ratio_in_agg'] = holder_data_processed['change_ratio'].where(holder_data_processed['in_de'] == 'IN', 0) - holder_data_processed['change_ratio_de_agg'] = holder_data_processed['change_ratio'].where(holder_data_processed['in_de'] == 'DE', 0) - holder_data_processed['change_ratio_total_agg'] = holder_data_processed['change_ratio'] - holder_data_processed['in_de_numeric'] = holder_data_processed['in_de'].map({'IN': 1, 'DE': -1}).fillna(0) # 用于判断类型 + # 确保 'ann_date' 是 datetime 类型 + stk_trade_processed_df['ann_date'] = pd.to_datetime(stk_trade_processed_df['ann_date']) - # 提前获取所有唯一的交易日期集合,以提高查找效率 - all_trade_dates_set = set(all_data_df['trade_date'].unique()) + # 将 'in_de' 映射为数值: 1 代表 '增持', -1 代表 '减持' + # 请根据你数据中实际的 'in_de' 字符串调整 + in_de_map = {'增持': 1, '减持': -1} # 假设是这两个值 + # 如果你的值是 '1' 和 '2' (1代表增持, 2代表减持),则映射应相应调整 + # 或者如果 'in_de' 已经是 1 和 -1 (或类似数值),则可以跳过映射,但要确保类型正确 + stk_trade_processed_df['_direction'] = stk_trade_processed_df['in_de'].map(in_de_map) + # 如果 _direction 列在映射后可能产生NaN (因为in_de中有未覆盖的值),需要处理 + if stk_trade_processed_df['_direction'].isnull().any(): + print("警告: 'in_de' 列中存在未映射的值,可能导致 _direction 列出现NaN。") + # 可以选择填充NaN,例如用0填充,或者移除这些行 + # stk_trade_processed_df['_direction'].fillna(0, inplace=True) - # 3. 构建一个辅助DataFrame,记录每个公告在未来10个日历日(且是交易日)的影响 - expanded_holder_events = [] - for _, row in holder_data_processed.iterrows(): - ts_code = row['ts_code'] - ann_date = row['ann_date'] - - # 生成从公告日期开始的未来10个日历日的日期范围(包括公告日本身) - # pd.Timedelta(days=10) 表示从公告日+10天 - # pd.date_range(start=ann_date, end=ann_date + pd.Timedelta(days=10), freq='D') - # 更精确地生成11个日期,涵盖公告日及其后的10个日历日 - future_dates = pd.date_range(start=ann_date, periods=11, freq='D') + # 计算有效变动比例 (方向 * 变动比例) + # 确保 change_ratio 是数值类型。假设 change_ratio 是一个正确的比例值 (例如 0.005 代表 0.5%)。 + # 如果 change_ratio 是百分点 (例如 0.5 代表 0.5%),你可能需要除以 100。 + stk_trade_processed_df['change_ratio'] = pd.to_numeric(stk_trade_processed_df['change_ratio'], errors='coerce') + stk_trade_processed_df['_effective_change'] = stk_trade_processed_df['_direction'] * stk_trade_processed_df['change_ratio'] - for date_in_window in future_dates: - # 只有当日期是实际交易日时才添加 - if date_in_window in all_trade_dates_set: - expanded_holder_events.append({ - 'ts_code': ts_code, - 'trade_date': date_in_window, - 'in_de_numeric': row['in_de_numeric'], - 'change_ratio_total_agg': row['change_ratio_total_agg'], - 'change_ratio_in_agg': row['change_ratio_in_agg'], - 'change_ratio_de_agg': row['change_ratio_de_agg'] - }) - - if not expanded_holder_events: # 如果没有事件,直接返回原始 df - # 确保返回的DataFrame与原始df具有相同的列和顺序 - # 并填充为默认值 - default_factors = pd.DataFrame({ - 'holder_trade_type_10d': None, - 'holder_change_ratio_sum_10d': 0.0, - 'holder_in_change_ratio_sum_10d': 0.0, - 'holder_de_change_ratio_sum_10d': 0.0 - }, index=all_data_df.index) - return pd.concat([all_data_df, default_factors], axis=1) - - - expanded_holder_events_df = pd.DataFrame(expanded_holder_events) - - # 4. 聚合每个 (ts_code, trade_date) 对上的事件 - # 可能会有重复的 (ts_code, trade_date) 对,因为一个交易日可能受多个公告影响 - daily_aggregated_factors = expanded_holder_events_df.groupby(['ts_code', 'trade_date']).agg( - holder_change_ratio_sum_10d=('change_ratio_total_agg', 'sum'), - holder_in_change_ratio_sum_10d=('change_ratio_in_agg', 'sum'), - holder_de_change_ratio_sum_10d=('change_ratio_de_agg', 'sum'), - # 对于 holder_trade_type_10d,聚合 in_de_numeric 的唯一值集合 - _in_de_types_unique=('in_de_numeric', lambda x: set(x)) # 获取该日期窗口内所有独特的增减持类型 + # 按股票代码和公告日期聚合当日的多次增减持操作 + daily_trade_agg = stk_trade_processed_df.groupby(['ts_code', 'ann_date']).agg( + net_change_ratio_daily=('_effective_change', 'sum'), + any_increase_daily=('_direction', lambda x: (x == 1).any().astype(int)), + any_decrease_daily=('_direction', lambda x: (x == -1).any().astype(int)) ).reset_index() - # 根据 _in_de_types_unique 确定 holder_trade_type_10d - def get_trade_type(unique_types_set): - if 1 in unique_types_set and -1 in unique_types_set: - return 'BOTH' - elif 1 in unique_types_set: - return 'IN' - elif -1 in unique_types_set: - return 'DE' - else: - return None # 理论上不应该发生,除非 unique_types_set 为空或只包含0 - - daily_aggregated_factors['holder_trade_type_10d'] = daily_aggregated_factors['_in_de_types_unique'].apply(get_trade_type) + # 将 'ann_date' 重命名为 'trade_date' 以便与 all_data_df 合并 + daily_trade_agg = daily_trade_agg.rename(columns={'ann_date': 'trade_date'}) - # 移除辅助列 - daily_aggregated_factors.drop(columns=['_in_de_types_unique'], inplace=True) + # --- 2. 与 all_data_df 合并 --- + # 创建 all_data_df 的副本进行操作 + df_merged = all_data_df.copy() + df_merged['trade_date'] = pd.to_datetime(df_merged['trade_date']) # 确保日期类型一致 - # 5. 将计算得到的因子合并回 all_data_df - # 确保 all_data_df 也按 ts_code, trade_date 排序,以便 merge 高效 - all_data_df_sorted = all_data_df.sort_values(['ts_code', 'trade_date']).reset_index(drop=True) - - final_df = pd.merge( - all_data_df_sorted, - daily_aggregated_factors, - on=['ts_code', 'trade_date'], - how='left' - ) + # 使用左合并保留 all_data_df 的所有行,并在有增减持公告的日期添加信息 + df_merged = pd.merge(df_merged, daily_trade_agg, on=['ts_code', 'trade_date'], how='left') - # 6. 对于没有增减持记录的日期,因子值为 None 或 0 - # 在 merge_asof 中确实需要排序,但在这种事件展开的方法中,merge 是普通的 left merge,不需要预排序。 - # 考虑到最终的 merge,最好还是保持 `all_data_df` 和 `daily_aggregated_factors` 的键排序。 - # 所以在 `merge` 前对 `all_data_df` 进行一次排序是好的实践。 - - final_df['holder_trade_type_10d'] = final_df['holder_trade_type_10d'].fillna(None) - fillna_ratio_cols = ['holder_change_ratio_sum_10d', 'holder_in_change_ratio_sum_10d', 'holder_de_change_ratio_sum_10d'] - final_df[fillna_ratio_cols] = final_df[fillna_ratio_cols].fillna(0.0) + # 对于没有增减持公告的日期,填充NaN值为0(表示当天无变动或无公告) + df_merged['net_change_ratio_daily'] = df_merged['net_change_ratio_daily'].fillna(0) + df_merged['any_increase_daily'] = df_merged['any_increase_daily'].fillna(0) + df_merged['any_decrease_daily'] = df_merged['any_decrease_daily'].fillna(0) + + # --- 3. 计算滚动因子 --- + # !!! 关键步骤:确保在 groupby().rolling() 之前按分组键和时间键排序 !!! + # 这一步至关重要,以保证滚动计算后的 Series 在 reset_index 后能正确对齐 + df_merged = df_merged.sort_values(['ts_code', 'trade_date']).reset_index(drop=True) + + grouped = df_merged.groupby('ts_code', group_keys=False) # group_keys=False 避免在结果中保留分组键作为索引层级 + + # 因子: 过去N日净变动比例之和 + for N in [10]: + rolling_series = grouped['net_change_ratio_daily'].rolling(window=N, min_periods=1).sum() + df_merged[f'holder_net_change_sum_{N}d'] = rolling_series.reset_index(level=0, drop=True) + + # 因子: 过去N日发生增持的天数 + for N in [10]: + rolling_series = grouped['any_increase_daily'].rolling(window=N, min_periods=1).sum() + df_merged[f'holder_increase_days_{N}d'] = rolling_series.reset_index(level=0, drop=True) + + # 因子: 过去N日发生减持的天数 + for N in [10]: + rolling_series = grouped['any_decrease_daily'].rolling(window=N, min_periods=1).sum() + df_merged[f'holder_decrease_days_{N}d'] = rolling_series.reset_index(level=0, drop=True) + + # 因子: 过去N日是否发生过增持 (布尔标志) + for N in [10]: + rolling_series_sum = grouped['any_increase_daily'].rolling(window=N, min_periods=1).sum() + df_merged[f'holder_any_increase_flag_{N}d'] = (rolling_series_sum > 0).astype(int).reset_index(level=0, drop=True) + + # 因子: 过去N日是否发生过减持 (布尔标志) + for N in [10]: + rolling_series_sum = grouped['any_decrease_daily'].rolling(window=N, min_periods=1).sum() + df_merged[f'holder_any_decrease_flag_{N}d'] = (rolling_series_sum > 0).astype(int).reset_index(level=0, drop=True) + + # 因子: 过去N日净“活动”得分 (增持天数 - 减持天数) + for N in [10]: + # 直接使用已经计算好且索引对齐的列 + df_merged[f'holder_direction_score_{N}d'] = df_merged[f'holder_increase_days_{N}d'] - df_merged[f'holder_decrease_days_{N}d'] + + # 清理在合并过程中产生的每日临时列(如果不再需要它们) + df_merged.drop(columns=['net_change_ratio_daily', 'any_increase_daily', 'any_decrease_daily'], inplace=True, errors='ignore') + + print("股东增减持因子计算完成。") + return df_merged - return final_df \ No newline at end of file diff --git a/main/train/Classify2.ipynb b/main/train/Classify2.ipynb index 3a1694a..d108428 100644 --- a/main/train/Classify2.ipynb +++ b/main/train/Classify2.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "id": "79a7758178bafdd3", "metadata": { "ExecuteTime": { @@ -18,8 +18,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n", "/mnt/d/PyProject/NewStock\n" ] } @@ -47,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "id": "4a481c60", "metadata": {}, "outputs": [], @@ -59,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "id": "a79cafb06a7e0e43", "metadata": { "ExecuteTime": { @@ -73,7 +71,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "daily data\n", + "daily data\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "daily basic\n", "inner merge on ['ts_code', 'trade_date']\n", "stk limit\n", @@ -159,7 +163,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "id": "cac01788dac10678", "metadata": { "ExecuteTime": { @@ -227,7 +231,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "id": "c4e9e1d31da6dba6", "metadata": { "ExecuteTime": { @@ -327,7 +331,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "id": "a735bc02ceb4d872", "metadata": { "ExecuteTime": { @@ -343,7 +347,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "id": "53f86ddc0677a6d7", "metadata": { "ExecuteTime": { @@ -410,7 +414,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "id": "dbe2fd8021b9417f", "metadata": { "ExecuteTime": { @@ -438,7 +442,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 9, "id": "85c3e3d0235ffffa", "metadata": { "ExecuteTime": { @@ -470,7 +474,64 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 10, + "id": "823a4a88", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✅ 成功从 Redis Hash 'concept_stocks_daily_lists_pickle' 读取 1794 条每日概念股票数据。\n" + ] + } + ], + "source": [ + "import redis\n", + "import pickle\n", + "from datetime import date, datetime\n", + "\n", + "# --- 配置 Redis 连接 ---\n", + "REDIS_HOST = '140.143.91.66'\n", + "REDIS_PORT = 6389\n", + "REDIS_DB = 0\n", + "\n", + "# --- 定义 Redis 键名 ---\n", + "HASH_KEY = \"concept_stocks_daily_lists_pickle\" # 区分之前的 JSON 版本\n", + "MAX_DATE_KEY = \"concept_stocks_max_date_pickle\" # 区分之前的 JSON 版本\n", + "\n", + "concept_dict = {}\n", + "\n", + "# --- 连接 Redis ---\n", + "try:\n", + " r = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB, password='Redis520102')\n", + "\n", + " all_data_from_redis = r.hgetall(HASH_KEY) # 返回的是字典,键是字节,值是字节\n", + " \n", + " if all_data_from_redis:\n", + " for date_bytes, stocks_bytes in all_data_from_redis.items(): # 将变量名改为 date_bytes 更清晰\n", + " try:\n", + " # *** 修正点:将日期字节解码为字符串 ***\n", + " date_str = date_bytes.decode('utf-8') \n", + " date_obj = datetime.strptime(date_str, '%Y%m%d').date()\n", + " \n", + " stocks_list = pickle.loads(stocks_bytes)\n", + " concept_dict[date_obj] = stocks_list\n", + " except (ValueError, pickle.UnpicklingError) as e:\n", + " print(f\"⚠️ 警告: 解析 Redis 数据时出错 (日期键: '{date_bytes.decode('utf-8', errors='ignore')}'),跳过此条数据: {e}\") # 打印警告时也解码一下\n", + " print(f\"✅ 成功从 Redis Hash '{HASH_KEY}' 读取 {len(concept_dict)} 条每日概念股票数据。\")\n", + " else:\n", + " print(f\"ℹ️ Redis Hash '{HASH_KEY}' 中没有找到任何数据。\")\n", + "\n", + "except redis.exceptions.ConnectionError as e:\n", + " print(f\"❌ 错误: 无法连接到 Redis 服务器,请检查 Redis 是否正在运行或连接配置: {e}\")\n", + "except Exception as e:\n", + " print(f\"❌ 从 Redis 读取数据时发生未知错误: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, "id": "92d84ce15a562ec6", "metadata": { "ExecuteTime": { @@ -483,10 +544,39 @@ "name": "stdout", "output_type": "stream", "text": [ - "使用 'ann_date' 作为财务数据生效日期。\n", - "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", - "使用 'ann_date' 作为财务数据生效日期。\n", - "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "4554725\n", + "开始生成概念相关因子...\n", + "开始计算概念内截面排序因子,基于: ['pct_chg', 'turnover_rate', 'volume_ratio']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Ranking Features in Concepts: 100%|██████████| 3/3 [00:00<00:00, 15.21it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "概念相关因子生成完毕。\n", + "4554725\n", + "开始计算股东增减持因子...\n", + "警告: 'in_de' 列中存在未映射的值,可能导致 _direction 列出现NaN。\n", + "股东增减持因子计算完成。\n", + "Calculating cat_senti_mom_vol_spike...\n", + "Finished cat_senti_mom_vol_spike.\n", + "Calculating cat_senti_pre_breakout...\n", + "Calculating atr_10 as it's missing...\n", + "Calculating atr_40 as it's missing...\n", + "Finished cat_senti_pre_breakout.\n", + "计算因子 ts_turnover_rate_acceleration_5_20\n", + "计算因子 ts_vol_sustain_10_30\n", + "计算因子 cs_amount_outlier_10\n", + "计算因子 ts_ff_to_total_turnover_ratio\n", + "计算因子 ts_price_volume_trend_coherence_5_20\n", + "计算因子 ts_ff_turnover_rate_surge_10\n", "使用 'ann_date' 作为财务数据生效日期。\n", "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", "使用 'ann_date' 作为财务数据生效日期。\n", @@ -509,29 +599,14 @@ "错误: 计算日级别行业动量基准需要以下列: ['pct_chg', 'cat_l2_code', 'trade_date', 'ts_code']。\n", "错误: 计算日级别行业偏离度需要以下列: ['pct_chg', 'daily_industry_positive_benchmark', 'daily_industry_negative_benchmark']。请先运行 daily_industry_momentum_benchmark(df)。\n", "Index(['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol',\n", - " 'amount', 'pct_chg', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv',\n", - " 'volume_ratio', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol',\n", - " 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol',\n", - " 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct',\n", - " 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg',\n", - " 'winner_rate', 'l2_code', 'undist_profit_ps', 'ocfps', 'roa', 'roe',\n", - " 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor',\n", - " 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20',\n", - " 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol',\n", - " 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'flow_divergence_diff',\n", - " 'flow_divergence_ratio', 'total_buy_vol', 'lg_elg_buy_prop',\n", - " 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change',\n", - " 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness',\n", - " 'floating_chip_proxy', 'cost_support_15pct_change',\n", - " 'cat_winner_price_zone', 'flow_chip_consistency',\n", - " 'profit_taking_vs_absorb', '_is_positive', '_is_negative',\n", - " 'cat_is_positive', '_pos_returns', '_neg_returns', '_pos_returns_sq',\n", - " '_neg_returns_sq', 'upside_vol', 'downside_vol', 'vol_ratio',\n", - " 'return_skew', 'return_kurtosis', 'volume_change_rate',\n", + " 'amount', 'pct_chg', 'turnover_rate',\n", + " ...\n", " 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike',\n", " 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike',\n", " 'vol_std_5', 'atr_14', 'atr_6', 'obv'],\n", - " dtype='object')\n", + " dtype='object', length=104)\n", + "Calculating senti_strong_inflow...\n", + "Finished senti_strong_inflow.\n", "Calculating lg_flow_mom_corr_20_60...\n", "Finished lg_flow_mom_corr_20_60.\n", "Calculating lg_flow_accel...\n", @@ -606,61 +681,88 @@ "Finished cs_rank_size.\n", "\n", "RangeIndex: 4554725 entries, 0 to 4554724\n", - "Columns: 181 entries, ts_code to cs_rank_size\n", - "dtypes: bool(10), datetime64[ns](1), float64(165), int64(3), object(2)\n", - "memory usage: 5.8+ GB\n", + "Columns: 198 entries, ts_code to cs_rank_size\n", + "dtypes: bool(10), datetime64[ns](1), float64(176), int64(6), int8(1), object(4)\n", + "memory usage: 6.4+ GB\n", "None\n", - "['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'amount', 'pct_chg', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv', 'volume_ratio', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg', 'winner_rate', 'cat_l2_code', 'undist_profit_ps', 'ocfps', 'roa', 'roe', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'price_cost_divergence', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_flow_divergence', 'cs_rank_ind_adj_lg_flow', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_opening_gap', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_ind_cap_neutral_pe', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size']\n" + "['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'amount', 'pct_chg', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv', 'volume_ratio', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg', 'winner_rate', 'cat_l2_code', 'cat_hot_concept_stock', 'concept_rank_pct_chg', 'concept_rank_turnover_rate', 'concept_rank_volume_ratio', 'holder_net_change_sum_10d', 'holder_increase_days_10d', 'holder_decrease_days_10d', 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d', 'holder_direction_score_10d', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'price_cost_divergence', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_flow_divergence', 'cs_rank_ind_adj_lg_flow', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_opening_gap', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_ind_cap_neutral_pe', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size']\n" ] } ], "source": [ - "\n", "import numpy as np\n", "from main.factor.factor import *\n", - "from main.factor.money_factor import *\n", + "from main.factor.money_factor import * \n", + "from main.factor.concept_factor import * \n", "\n", "\n", "def filter_data(df):\n", " # df = df.groupby('trade_date').apply(lambda x: x.nlargest(1000, 'act_factor1'))\n", - " df = df[~df['is_st']]\n", - " df = df[~df['ts_code'].str.endswith('BJ')]\n", - " df = df[~df['ts_code'].str.startswith('30')]\n", - " df = df[~df['ts_code'].str.startswith('68')]\n", - " df = df[~df['ts_code'].str.startswith('8')]\n", - " df = df[df['trade_date'] >= '2019-01-01']\n", - " if 'in_date' in df.columns:\n", - " df = df.drop(columns=['in_date'])\n", + " df = df[~df[\"is_st\"]]\n", + " df = df[~df[\"ts_code\"].str.endswith(\"BJ\")]\n", + " df = df[~df[\"ts_code\"].str.startswith(\"30\")]\n", + " df = df[~df[\"ts_code\"].str.startswith(\"68\")]\n", + " df = df[~df[\"ts_code\"].str.startswith(\"8\")]\n", + " df = df[df[\"trade_date\"] >= \"2019-01-01\"]\n", + " if \"in_date\" in df.columns:\n", + " df = df.drop(columns=[\"in_date\"])\n", " df = df.reset_index(drop=True)\n", " return df\n", "\n", + "\n", "gc.collect()\n", "\n", "df = filter_data(df)\n", - "df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "df = df.sort_values(by=[\"ts_code\", \"trade_date\"])\n", "\n", "# df = price_minus_deduction_price(df, n=120)\n", "# df = price_deduction_price_diff_ratio_to_sma(df, n=120)\n", "# df = cat_price_vs_sma_vs_deduction_price(df, n=120)\n", "# df = cat_reason(df, top_list_df)\n", "# df = cat_is_on_top_list(df, top_list_df)\n", + "print(len(df))\n", + "df = generate_concept_factors(df, concept_dict)\n", + "print(len(df))\n", "\n", - "# df = ts_turnover_rate_acceleration_5_20(df)\n", - "# df = ts_vol_sustain_10_30(df)\n", + "df = holder_trade_factors(df, stk_holdertrade_df)\n", + "\n", + "df = cat_senti_mom_vol_spike(\n", + " df,\n", + " return_period=3,\n", + " return_threshold=0.03, # 近3日涨幅超3%\n", + " volume_ratio_threshold=1.3,\n", + " current_pct_chg_min=0.0, # 当日必须收红\n", + " current_pct_chg_max=0.05,\n", + ") # 当日涨幅不宜过大\n", + "\n", + "df = cat_senti_pre_breakout(\n", + " df,\n", + " atr_short_N=10,\n", + " atr_long_M=40,\n", + " vol_atrophy_N=10,\n", + " vol_atrophy_M=40,\n", + " price_stab_N=5,\n", + " price_stab_threshold=0.06,\n", + " current_pct_chg_min_signal=0.002,\n", + " current_pct_chg_max_signal=0.05,\n", + " volume_ratio_signal_threshold=1.1,\n", + ")\n", + "\n", + "df = ts_turnover_rate_acceleration_5_20(df)\n", + "df = ts_vol_sustain_10_30(df)\n", "# df = cs_turnover_rate_relative_strength_20(df)\n", - "# df = cs_amount_outlier_10(df)\n", - "# df = holder_trade_factors(stk_holdertrade_df, df)\n", - "\n", - "df = add_financial_factor(df, fina_indicator_df, factor_value_col='undist_profit_ps')\n", - "df = add_financial_factor(df, fina_indicator_df, factor_value_col='ocfps')\n", - "df = add_financial_factor(df, fina_indicator_df, factor_value_col='roa')\n", - "df = add_financial_factor(df, fina_indicator_df, factor_value_col='roe')\n", + "df = cs_amount_outlier_10(df)\n", + "df = ts_ff_to_total_turnover_ratio(df)\n", + "df = ts_price_volume_trend_coherence_5_20(df)\n", + "# df = ts_turnover_rate_trend_strength_5(df)\n", + "df = ts_ff_turnover_rate_surge_10(df)\n", "\n", + "df = add_financial_factor(df, fina_indicator_df, factor_value_col=\"undist_profit_ps\")\n", + "df = add_financial_factor(df, fina_indicator_df, factor_value_col=\"ocfps\")\n", "calculate_arbr(df, N=26)\n", - "df['log_circ_mv'] = np.log(df['circ_mv'])\n", + "df[\"log_circ_mv\"] = np.log(df[\"circ_mv\"])\n", "df = calculate_cashflow_to_ev_factor(df, cashflow_df, balancesheet_df)\n", "df = caculate_book_to_price_ratio(df, fina_indicator_df)\n", - "\n", "df = turnover_rate_n(df, n=5)\n", "df = variance_n(df, n=20)\n", "df = bbi_ratio_factor(df)\n", @@ -669,8 +771,10 @@ "df, _ = get_rolling_factor(df)\n", "df, _ = get_simple_factor(df)\n", "\n", - "df = df.rename(columns={'l1_code': 'cat_l1_code'})\n", - "df = df.rename(columns={'l2_code': 'cat_l2_code'})\n", + "df = calculate_strong_inflow_signal(df)\n", + "\n", + "df = df.rename(columns={\"l1_code\": \"cat_l1_code\"})\n", + "df = df.rename(columns={\"l2_code\": \"cat_l2_code\"})\n", "\n", "lg_flow_mom_corr(df, N=20, M=60)\n", "lg_flow_accel(df)\n", @@ -691,7 +795,7 @@ "\n", "cs_rank_net_lg_flow_val(df)\n", "cs_rank_flow_divergence(df)\n", - "cs_rank_industry_adj_lg_flow(df) # Needs cat_l2_code\n", + "cs_rank_industry_adj_lg_flow(df) # Needs cat_l2_code\n", "cs_rank_elg_buy_ratio(df)\n", "cs_rank_rel_profit_margin(df)\n", "cs_rank_cost_breadth(df)\n", @@ -699,16 +803,16 @@ "cs_rank_winner_rate(df)\n", "cs_rank_intraday_range(df)\n", "cs_rank_close_pos_in_range(df)\n", - "cs_rank_opening_gap(df) # Needs pre_close\n", - "cs_rank_pos_in_hist_range(df) # Needs his_low, his_high\n", + "cs_rank_opening_gap(df) # Needs pre_close\n", + "cs_rank_pos_in_hist_range(df) # Needs his_low, his_high\n", "cs_rank_vol_x_profit_margin(df)\n", "cs_rank_lg_flow_price_concordance(df)\n", "cs_rank_turnover_per_winner(df)\n", - "cs_rank_ind_cap_neutral_pe(df) # Placeholder - needs external libraries\n", - "cs_rank_volume_ratio(df) # Needs volume_ratio\n", + "cs_rank_ind_cap_neutral_pe(df) # Placeholder - needs external libraries\n", + "cs_rank_volume_ratio(df) # Needs volume_ratio\n", "cs_rank_elg_buy_sell_sm_ratio(df)\n", - "cs_rank_cost_dist_vol_ratio(df) # Needs volume_ratio\n", - "cs_rank_size(df) # Needs circ_mv\n", + "cs_rank_cost_dist_vol_ratio(df) # Needs volume_ratio\n", + "cs_rank_size(df) # Needs circ_mv\n", "\n", "\n", "# df = df.merge(index_data, on='trade_date', how='left')\n", @@ -719,7 +823,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "b87b938028afa206", "metadata": { "ExecuteTime": { @@ -757,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "id": "f4f16d63ad18d1bc", "metadata": { "ExecuteTime": { @@ -983,7 +1087,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "id": "40e6b68a91b30c79", "metadata": { "ExecuteTime": { @@ -1303,7 +1407,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "id": "47c12bb34062ae7a", "metadata": { "ExecuteTime": { @@ -1337,7 +1441,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "id": "29221dde", "metadata": {}, "outputs": [ @@ -1345,7 +1449,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "191\n" + "209\n" ] } ], @@ -1380,7 +1484,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "id": "03ee5daf", "metadata": {}, "outputs": [], @@ -1393,7 +1497,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 18, "id": "b76ea08a", "metadata": {}, "outputs": [ @@ -1405,7 +1509,7 @@ "0 000001.SZ 2019-01-02 16.574219\n", "1 000001.SZ 2019-01-03 16.583965\n", "2 000001.SZ 2019-01-04 16.633371\n", - "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'cat_hot_concept_stock', 'concept_rank_pct_chg', 'concept_rank_turnover_rate', 'concept_rank_volume_ratio', 'holder_net_change_sum_10d', 'holder_increase_days_10d', 'holder_decrease_days_10d', 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", "去除极值\n", "开始截面 MAD 去极值处理 (k=3.0)...\n" ] @@ -1414,7 +1518,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "MAD Filtering: 100%|██████████| 131/131 [00:16<00:00, 7.78it/s]\n" + "MAD Filtering: 100%|██████████| 146/146 [00:19<00:00, 7.58it/s]\n" ] }, { @@ -1429,7 +1533,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "MAD Filtering: 100%|██████████| 131/131 [00:11<00:00, 11.06it/s]\n" + "MAD Filtering: 100%|██████████| 146/146 [00:13<00:00, 10.96it/s]\n" ] }, { @@ -1467,7 +1571,7 @@ "output_type": "stream", "text": [ "截面 MAD 去极值处理完成。\n", - "feature_columns: ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "feature_columns: ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'cat_hot_concept_stock', 'concept_rank_pct_chg', 'concept_rank_turnover_rate', 'concept_rank_volume_ratio', 'holder_net_change_sum_10d', 'holder_increase_days_10d', 'holder_decrease_days_10d', 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", "df最小日期: 2019-01-02\n", "df最大日期: 2025-05-30\n", "2057465\n", @@ -1476,6 +1580,7 @@ "1781706\n", "test_data最小日期: 2023-01-03\n", "test_data最大日期: 2025-05-30\n", + "cat_columns: ['cat_hot_concept_stock', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'cat_winner_price_zone', 'cat_is_positive', 'cat_volume_breakout', 'cat_turnover_spike', 'cat_volume_ratio_breakout', 'cat_vol_spike', 'cat_af2', 'cat_af3', 'cat_af4', 'cat_vol_break', 'cat_golden_resonance', 'cat_up_limit']\n", " ts_code trade_date log_circ_mv\n", "0 000001.SZ 2019-01-02 16.574219\n", "1 000001.SZ 2019-01-03 16.583965\n", @@ -1602,6 +1707,7 @@ "print(f\"test_data最大日期: {test_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n", "\n", "cat_columns = [col for col in feature_columns if col.startswith('cat')]\n", + "print(f'cat_columns: {cat_columns}')\n", "for col in cat_columns:\n", " train_data[col] = train_data[col].astype('category')\n", " test_data[col] = test_data[col].astype('category')\n", @@ -1611,7 +1717,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 30, "id": "3ff2d1c5", "metadata": {}, "outputs": [], @@ -1675,17 +1781,17 @@ " params = {\n", " 'loss_function': 'Logloss', # 适用于二分类\n", " 'eval_metric': 'Logloss', # 评估指标\n", - " 'iterations': 1500,\n", + " 'iterations': 750,\n", " 'learning_rate': 0.01,\n", - " 'depth': 10, # 控制模型复杂度\n", + " 'depth': 8, # 控制模型复杂度\n", " 'l2_leaf_reg': 50, # L2 正则化\n", " 'verbose': 5000,\n", - " 'early_stopping_rounds': 300,\n", + " # 'early_stopping_rounds': 300,\n", " # 'od_type': 'Iter', # Overfitting detector type\n", " # 'od_wait': 300, # Number of iterations to wait after the bes\n", - " 'one_hot_max_size': 50,\n", + " # 'one_hot_max_size': 100,\n", " 'class_weights': [0.6, 1.2],\n", - " 'task_type': 'GPU',\n", + " # 'task_type': 'GPU',\n", " 'has_time': True,\n", " 'random_seed': 7\n", " }\n", @@ -1752,7 +1858,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 31, "id": "c6eb5cd4-e714-420a-ac48-39af3e11ee81", "metadata": { "ExecuteTime": { @@ -1786,7 +1892,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "182bcb05602b45a586d931fa2bcb3dd1", + "model_id": "547eff15f2c842308d4306b1aa5e5705", "version_major": 2, "version_minor": 0 }, @@ -1801,16 +1907,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "0:\tlearn: 0.6890148\ttest: 0.6905108\tbest: 0.6905108 (0)\ttotal: 114ms\tremaining: 2m 50s\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bestTest = 0.5226514078\n", - "bestIteration = 527\n", - "Shrink model to first 528 iterations.\n" + "0:\tlearn: 0.6887420\ttest: 0.6896418\tbest: 0.6896418 (0)\ttotal: 18ms\tremaining: 13.5s\n", + "749:\tlearn: 0.3565319\ttest: 0.5068883\tbest: 0.5054505 (576)\ttotal: 12.3s\tremaining: 0us\n", + "\n", + "bestTest = 0.5054505212\n", + "bestIteration = 576\n", + "\n", + "Shrink model to first 577 iterations.\n" ] } ], @@ -1832,7 +1935,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 32, "id": "5d1522a7538db91b", "metadata": { "ExecuteTime": { @@ -1870,7 +1973,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 33, "id": "09b1799e", "metadata": {}, "outputs": [ @@ -1878,8 +1981,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "191\n", - "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "209\n", + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'cat_hot_concept_stock', 'concept_rank_pct_chg', 'concept_rank_turnover_rate', 'concept_rank_volume_ratio', 'holder_net_change_sum_10d', 'holder_increase_days_10d', 'holder_decrease_days_10d', 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", "[]\n" ] } @@ -1892,7 +1995,37 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 34, + "id": "31c4852d", + "metadata": {}, + "outputs": [], + "source": [ + "# model_path = 'my_catboost_model.cbm' # 通常以 .cbm 为扩展名\n", + "# # model.save_model(model_path)\n", + "# # print(f\"模型已保存到: {model_path}\")\n", + "\n", + "# loaded_model = CatBoostClassifier() # 或 CatBoostRegressor 等,取决于你保存的模型类型\n", + "# loaded_model.load_model(model_path)\n", + "# print(f\"模型已从 {model_path} 加载成功。\")\n", + "\n", + "# if type == 'cat':\n", + "# score_df['score'] = loaded_model.predict_proba(score_df[feature_columns])[:, 1]\n", + "# elif type == 'light':\n", + "# score_df['score'] = loaded_model.predict(score_df[feature_columns])\n", + "# score_df['score_ranks'] = score_df.groupby('trade_date')['score'].rank(ascending=True)\n", + "\n", + "# score_df = score_df.groupby('trade_date', group_keys=False).apply(\n", + "# lambda x: x[x['score'] >= x['score'].quantile(0.90)] # 计算90%分位数作为阈值,筛选分数>=阈值的行\n", + "# ).reset_index(drop=True) # drop=True 避免添加旧索引列\n", + "# # save_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nlargest(1, 'score')).reset_index()\n", + "# save_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(2, 'total_mv')).reset_index()\n", + "# save_df = save_df.sort_values(['trade_date', 'score'])\n", + "# save_df[['trade_date', 'score', 'ts_code']].to_csv('predictions_test.tsv', index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, "id": "e53b209a", "metadata": {}, "outputs": [ @@ -1925,7 +2058,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 36, "id": "364e821a", "metadata": {}, "outputs": [], @@ -2009,7 +2142,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 37, "id": "1f6e6336", "metadata": {}, "outputs": [ @@ -2023,26 +2156,32 @@ "1e+05-1e+05\n", "1e+05-2e+05\n", "2e+05-2e+05\n", - "2e+05-2e+05\n", + "2e+05-2e+05\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "2e+05-2e+05\n", "2e+05-3e+05\n", "3e+05-3e+05\n", "二分类评估指标:\n", - "accuracy: 0.6543\n", - "precision: 0.4629\n", - "recall: 0.1754\n", - "f1: 0.2544\n", - "roc_auc: 0.6206\n", + "accuracy: 0.6597\n", + "precision: 0.4824\n", + "recall: 0.0535\n", + "f1: 0.0963\n", + "roc_auc: 0.6190\n", "fpr: (array of length 7484)\n", "tpr: (array of length 7484)\n", "thresholds: (array of length 7484)\n", - "score_return_correlation: -0.0293\n", - "mv_roc_auc: {'6e+04-9e+04': np.float64(0.5687499999999999), '9e+04-1e+05': np.float64(0.5662772981208735), '1e+05-1e+05': np.float64(0.5818040450154087), '1e+05-2e+05': np.float64(0.5694847679411162), '2e+05-2e+05': np.float64(0.6027478841082352), '2e+05-3e+05': np.float64(0.6169522445569707), '3e+05-3e+05': np.float64(0.6131663537577515)}\n" + "score_return_correlation: -0.0515\n", + "mv_roc_auc: {'6e+04-9e+04': np.float64(0.6170032241642627), '9e+04-1e+05': np.float64(0.5933723849372385), '1e+05-1e+05': np.float64(0.5784531090723751), '1e+05-2e+05': np.float64(0.5759209014471692), '2e+05-2e+05': np.float64(0.6110322483330337), '2e+05-3e+05': np.float64(0.6014283834583336), '3e+05-3e+05': np.float64(0.58325233281493)}\n" ] }, { "data": { - "image/png": "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", + "image/png": "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cIaQkBB8fHzsag8eh4SE2GrTpk2jf//+fP7555w9e5bBgwfbGrL4vpYP3L17l+eeew53d3eGDRtG5syZbcs++ugjtm3bxgcffMD06dMJCwvj3XffBSBnzpwEBAQQEBBAjhw5GDp0qO3xk3rzzTdxcXFh+vTpVK9endGjR9v+INmzZw8ff/wxr7zyCuPHjycgIIDixYszZcqUBD33g+f57+sCqFmzpl1jsnDhQrZt28aHH35I//79WbJkie19cPHiRYYMGUK5cuWYP38+/fv359NPP2XPnj2x9jds2DD2799P3759qVChgq3+7bff8umnn9KnTx/mz59PlSpVGD58uG1qqvje2926dSMgIIAPPvgAwPa1/u97OzmOeXy2bt3KF198Qe/evZk9ezalS5fm5ZdfJjIy0i5XuXLlbJkDAgLImTNngvcxceJEZs6cSb9+/Zg1axaZM2emX79+3LlzJ8HP8cDNmzfJkSPHY9cJCwtj4cKFHD16lKZNmwJxfw/6+vraliX0fQUx3ys3btx44uwiyc3d7AAiaVWXLl1s/86aNStffPEFuXPnBmKatUaNGjFixAgAqlWrxpYtW9i4cSPDhw9n2bJlGIbBtGnTbGc179+/z82bN4GYMypr165l6tSpNGvWDIDo6GiGDBnCxYsXKVCgQLz5WrRowfjx4zl69Chly5bl4sWLnDlzxvbx419//cVff/3F2rVrKVu2LBDTmEyYMIEPP/wQT09P23P9+uuvfPPNN7azQUnxoGl1cXGx1fr160fXrl2BmF+8L7zwAvv27aNatWrxfi0f2L59O++88w4vvPBCrH3WrVuXTp06UbVqVSDmI/4HZ9o8PT1tzZunpyf58uWza+aeRJ48efj000+BmDN/Gzdu5OzZs2TNmpWDBw9SpkwZOnToAMRcxBMcHEzlypUT9NwPmi43N7fHrnf79m02b96Mn58fDRs25Ntvv+X48eM0atQIq9XK6NGjadeuHV5eXpQuXZoZM2awf/9+qlevbnuOy5cvU65cORYvXoyrq/05krx58/Lll1/SvHlzIOZrtnz5cs6cOUPFihXjfW/nypWLXLly2T4hiOtrnRzHPD6XLl3Cw8ODbt264evrS7ly5WjWrBkWi8Uul5+fHzlz5nzi90RISAgLFixg8ODBtrPURYsWZdy4cVy9evWJv5dcXV0feeHghAkT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9VRHj96kbNkctscuLi589VV7vLzccNF0CCIiIpLKaJ7btObWEfhttH2t3ZonfprISAuvvrqZcuVm8O23J+yWeXu7q7EVERGRVEnNbVoSehMWPnQr3WFBkCHvEz3N2bN3qFfvKyZN+gOAPn3Wcf16cHKlFBEREUkxGpaQlszMaf+4xULwzPhET7FmzTFefHE99+5FAODp6cbYsY3ImdMvuVKKiIiIpBg1t2nFuR/tH1caBOV6J3jz8PBo3njjR6ZN222rFSvmz6pVXalaNU9ypRQRERFJUWpu0wJrtP3tdT0yQNOZCd789OlAunX7hv37r9lqzz5bjjlz2pIpk9djthQRERFJXdTcpgWTPOwf9z6Q4E1//PEfunRZxf37kQB4ebkxZUpLXnqpqi4aExEREaej5taZhd+F6f72tZJdIEuxBD9FqVLZcHePua6wZMlsfPNNVypWzJWMIUVEREQcR82tszKM2I0tQOsVT/Q0hQpl4euv2xMQcIyZM1uTIYNnMgUUERERcTxNBeasZueLXXvVAq5uj91s9eqj3L8fYVdr3740ixd3VGMrIiIiTk/NrTP6wgVCrv772N0bXjPA5dGHMzQ0in791tOlyzcMHLgBwzAcEFRERETEsdTcOpuIe7Frw0Mfu8nRozepWXMuX311AIDly/9m587zKRBORERExFxqbp3NtCz2j0dGwiNmNTAMg6+/3k/16nM4cuQmAH5+Hixa1IGGDQunbE4RERERE+iCMmdyYIb9444bwM0jzlWDgyMZMmQjixcfstUqVMjJqlVdKV06e0qmFBERETGNmltnsu1l+8dFW8e52qFD13n22QCOH79lqw0YUJUvv2yBj0/czbCIiIhIWqDm1hlE3oepmexr/c/GueqhQ9epVWse4eHRAGTI4MncuW3p3r18SqcUERERMZ3G3DqDhxvbTIUgc+E4V61QISdNmxYFoHLl3OzbN0CNrYiIiKQbOnOb2m3sEbvW7/QjV3dxcWHBgvZMmvQH775bH29vHWIRERFJP3TmNjU7MBOOL7OvvWaAa0zDahgGM2bs5qef7IcoZMvmy/jxjdXYioiISLqj7ic1e/gCspGRtn/euxdO//7fERBwlNy5M3DgwEBy5crg4IAiIiIiqYvO3KZWNw8D/7mL2OAbtmm/du++TJUqswkIOArAtWvBrF9/woSQIiIiIqmL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", "text/plain": [ "
" ] @@ -2078,7 +2217,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 38, "id": "7e9023cc", "metadata": {}, "outputs": [], @@ -2278,7 +2417,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 39, "id": "a0000d75", "metadata": {}, "outputs": [ @@ -2288,7 +2427,7 @@ "text": [ "开始分析 'score' 在 'circ_mv' 和 'future_return' 下的表现...\n", "准备数据,处理 NaN 值...\n", - "原始数据 17430 行,移除 NaN 后剩余 17123 行用于分析。\n", + "原始数据 17430 行,移除 NaN 后剩余 17125 行用于分析。\n", "对 'circ_mv' 和 'future_return' 进行 100 分位数分箱...\n", "按二维分箱分组计算 Spearman Rank IC...\n", "整理结果用于绘图...\n", @@ -2524,7 +2663,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 40, "id": "a436dba4", "metadata": {}, "outputs": [ diff --git a/main/train/Rank2.ipynb b/main/train/Rank2.ipynb index 69bd026..c74bf37 100644 --- a/main/train/Rank2.ipynb +++ b/main/train/Rank2.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 9, + "execution_count": 3, "id": "79a7758178bafdd3", "metadata": { "ExecuteTime": { @@ -46,7 +46,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "a79cafb06a7e0e43", "metadata": { "ExecuteTime": { @@ -60,56 +60,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "daily data\n", - "daily basic\n", - "inner merge on ['ts_code', 'trade_date']\n", - "stk limit\n", - "left merge on ['ts_code', 'trade_date']\n", - "money flow\n", - "left merge on ['ts_code', 'trade_date']\n", - "cyq perf\n", - "left merge on ['ts_code', 'trade_date']\n", - "\n", - "RangeIndex: 8692146 entries, 0 to 8692145\n", - "Data columns (total 33 columns):\n", - " # Column Dtype \n", - "--- ------ ----- \n", - " 0 ts_code object \n", - " 1 trade_date datetime64[ns]\n", - " 2 open float64 \n", - " 3 close float64 \n", - " 4 high float64 \n", - " 5 low float64 \n", - " 6 vol float64 \n", - " 7 pct_chg float64 \n", - " 8 amount float64 \n", - " 9 turnover_rate float64 \n", - " 10 pe_ttm float64 \n", - " 11 circ_mv float64 \n", - " 12 total_mv float64 \n", - " 13 volume_ratio float64 \n", - " 14 is_st bool \n", - " 15 up_limit float64 \n", - " 16 down_limit float64 \n", - " 17 buy_sm_vol float64 \n", - " 18 sell_sm_vol float64 \n", - " 19 buy_lg_vol float64 \n", - " 20 sell_lg_vol float64 \n", - " 21 buy_elg_vol float64 \n", - " 22 sell_elg_vol float64 \n", - " 23 net_mf_vol float64 \n", - " 24 his_low float64 \n", - " 25 his_high float64 \n", - " 26 cost_5pct float64 \n", - " 27 cost_15pct float64 \n", - " 28 cost_50pct float64 \n", - " 29 cost_85pct float64 \n", - " 30 cost_95pct float64 \n", - " 31 weight_avg float64 \n", - " 32 winner_rate float64 \n", - "dtypes: bool(1), datetime64[ns](1), float64(30), object(1)\n", - "memory usage: 2.1+ GB\n", - "None\n" + "daily data\n" ] } ], @@ -146,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "cac01788dac10678", "metadata": { "ExecuteTime": { @@ -214,7 +165,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "c4e9e1d31da6dba6", "metadata": { "ExecuteTime": { @@ -314,7 +265,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "a735bc02ceb4d872", "metadata": { "ExecuteTime": { @@ -330,7 +281,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "53f86ddc0677a6d7", "metadata": { "ExecuteTime": { @@ -397,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "dbe2fd8021b9417f", "metadata": { "ExecuteTime": { @@ -425,7 +376,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "85c3e3d0235ffffa", "metadata": { "ExecuteTime": { @@ -457,7 +408,64 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, + "id": "ba5935c8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✅ 成功从 Redis Hash 'concept_stocks_daily_lists_pickle' 读取 1794 条每日概念股票数据。\n" + ] + } + ], + "source": [ + "import redis\n", + "import pickle\n", + "from datetime import date, datetime\n", + "\n", + "# --- 配置 Redis 连接 ---\n", + "REDIS_HOST = '140.143.91.66'\n", + "REDIS_PORT = 6389\n", + "REDIS_DB = 0\n", + "\n", + "# --- 定义 Redis 键名 ---\n", + "HASH_KEY = \"concept_stocks_daily_lists_pickle\" # 区分之前的 JSON 版本\n", + "MAX_DATE_KEY = \"concept_stocks_max_date_pickle\" # 区分之前的 JSON 版本\n", + "\n", + "concept_dict = {}\n", + "\n", + "# --- 连接 Redis ---\n", + "try:\n", + " r = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB, password='Redis520102')\n", + "\n", + " all_data_from_redis = r.hgetall(HASH_KEY) # 返回的是字典,键是字节,值是字节\n", + " \n", + " if all_data_from_redis:\n", + " for date_bytes, stocks_bytes in all_data_from_redis.items(): # 将变量名改为 date_bytes 更清晰\n", + " try:\n", + " # *** 修正点:将日期字节解码为字符串 ***\n", + " date_str = date_bytes.decode('utf-8') \n", + " date_obj = datetime.strptime(date_str, '%Y%m%d').date()\n", + " \n", + " stocks_list = pickle.loads(stocks_bytes)\n", + " concept_dict[date_obj] = stocks_list\n", + " except (ValueError, pickle.UnpicklingError) as e:\n", + " print(f\"⚠️ 警告: 解析 Redis 数据时出错 (日期键: '{date_bytes.decode('utf-8', errors='ignore')}'),跳过此条数据: {e}\") # 打印警告时也解码一下\n", + " print(f\"✅ 成功从 Redis Hash '{HASH_KEY}' 读取 {len(concept_dict)} 条每日概念股票数据。\")\n", + " else:\n", + " print(f\"ℹ️ Redis Hash '{HASH_KEY}' 中没有找到任何数据。\")\n", + "\n", + "except redis.exceptions.ConnectionError as e:\n", + " print(f\"❌ 错误: 无法连接到 Redis 服务器,请检查 Redis 是否正在运行或连接配置: {e}\")\n", + "except Exception as e:\n", + " print(f\"❌ 从 Redis 读取数据时发生未知错误: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "92d84ce15a562ec6", "metadata": { "ExecuteTime": { @@ -470,21 +478,148 @@ "name": "stdout", "output_type": "stream", "text": [ - "正在计算股东增减持因子(优化版)...\n" + "4554725\n", + "开始生成概念相关因子...\n", + "开始计算概念内截面排序因子,基于: ['pct_chg', 'turnover_rate', 'volume_ratio']\n" ] }, { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[18]\u001b[39m\u001b[32m, line 30\u001b[39m\n\u001b[32m 23\u001b[39m df = df.sort_values(by=[\u001b[33m\"\u001b[39m\u001b[33mts_code\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mtrade_date\u001b[39m\u001b[33m\"\u001b[39m])\n\u001b[32m 25\u001b[39m \u001b[38;5;66;03m# df = price_minus_deduction_price(df, n=120)\u001b[39;00m\n\u001b[32m 26\u001b[39m \u001b[38;5;66;03m# df = price_deduction_price_diff_ratio_to_sma(df, n=120)\u001b[39;00m\n\u001b[32m 27\u001b[39m \u001b[38;5;66;03m# df = cat_price_vs_sma_vs_deduction_price(df, n=120)\u001b[39;00m\n\u001b[32m 28\u001b[39m \u001b[38;5;66;03m# df = cat_reason(df, top_list_df)\u001b[39;00m\n\u001b[32m 29\u001b[39m \u001b[38;5;66;03m# df = cat_is_on_top_list(df, top_list_df)\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m30\u001b[39m df = \u001b[43mholder_trade_factors\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstk_holdertrade_df\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 32\u001b[39m df = cat_senti_mom_vol_spike(\n\u001b[32m 33\u001b[39m df,\n\u001b[32m 34\u001b[39m return_period=\u001b[32m3\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 38\u001b[39m current_pct_chg_max=\u001b[32m0.05\u001b[39m,\n\u001b[32m 39\u001b[39m ) \u001b[38;5;66;03m# 当日涨幅不宜过大\u001b[39;00m\n\u001b[32m 41\u001b[39m df = cat_senti_pre_breakout(\n\u001b[32m 42\u001b[39m df,\n\u001b[32m 43\u001b[39m atr_short_N=\u001b[32m10\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 51\u001b[39m volume_ratio_signal_threshold=\u001b[32m1.1\u001b[39m,\n\u001b[32m 52\u001b[39m )\n", - "\u001b[36mFile \u001b[39m\u001b[32m/mnt/d/PyProject/NewStock/main/factor/money_factor.py:50\u001b[39m, in \u001b[36mholder_trade_factors\u001b[39m\u001b[34m(all_data_df, stk_holdertrade_df)\u001b[39m\n\u001b[32m 43\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m date_in_window \u001b[38;5;129;01min\u001b[39;00m future_dates:\n\u001b[32m 44\u001b[39m \u001b[38;5;66;03m# 只有当日期是实际交易日时才添加\u001b[39;00m\n\u001b[32m 45\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m date_in_window \u001b[38;5;129;01min\u001b[39;00m all_trade_dates_set:\n\u001b[32m 46\u001b[39m expanded_holder_events.append({\n\u001b[32m 47\u001b[39m \u001b[33m'\u001b[39m\u001b[33mts_code\u001b[39m\u001b[33m'\u001b[39m: ts_code,\n\u001b[32m 48\u001b[39m \u001b[33m'\u001b[39m\u001b[33mtrade_date\u001b[39m\u001b[33m'\u001b[39m: date_in_window,\n\u001b[32m 49\u001b[39m \u001b[33m'\u001b[39m\u001b[33min_de_numeric\u001b[39m\u001b[33m'\u001b[39m: row[\u001b[33m'\u001b[39m\u001b[33min_de_numeric\u001b[39m\u001b[33m'\u001b[39m],\n\u001b[32m---> \u001b[39m\u001b[32m50\u001b[39m \u001b[33m'\u001b[39m\u001b[33mchange_ratio_total_agg\u001b[39m\u001b[33m'\u001b[39m: \u001b[43mrow\u001b[49m\u001b[43m[\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mchange_ratio_total_agg\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m]\u001b[49m,\n\u001b[32m 51\u001b[39m \u001b[33m'\u001b[39m\u001b[33mchange_ratio_in_agg\u001b[39m\u001b[33m'\u001b[39m: row[\u001b[33m'\u001b[39m\u001b[33mchange_ratio_in_agg\u001b[39m\u001b[33m'\u001b[39m],\n\u001b[32m 52\u001b[39m \u001b[33m'\u001b[39m\u001b[33mchange_ratio_de_agg\u001b[39m\u001b[33m'\u001b[39m: row[\u001b[33m'\u001b[39m\u001b[33mchange_ratio_de_agg\u001b[39m\u001b[33m'\u001b[39m]\n\u001b[32m 53\u001b[39m })\n\u001b[32m 55\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m expanded_holder_events: \u001b[38;5;66;03m# 如果没有事件,直接返回原始 df\u001b[39;00m\n\u001b[32m 56\u001b[39m \u001b[38;5;66;03m# 确保返回的DataFrame与原始df具有相同的列和顺序\u001b[39;00m\n\u001b[32m 57\u001b[39m \u001b[38;5;66;03m# 并填充为默认值\u001b[39;00m\n\u001b[32m 58\u001b[39m default_factors = pd.DataFrame({\n\u001b[32m 59\u001b[39m \u001b[33m'\u001b[39m\u001b[33mholder_trade_type_10d\u001b[39m\u001b[33m'\u001b[39m: \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 60\u001b[39m \u001b[33m'\u001b[39m\u001b[33mholder_change_ratio_sum_10d\u001b[39m\u001b[33m'\u001b[39m: \u001b[32m0.0\u001b[39m,\n\u001b[32m 61\u001b[39m \u001b[33m'\u001b[39m\u001b[33mholder_in_change_ratio_sum_10d\u001b[39m\u001b[33m'\u001b[39m: \u001b[32m0.0\u001b[39m,\n\u001b[32m 62\u001b[39m \u001b[33m'\u001b[39m\u001b[33mholder_de_change_ratio_sum_10d\u001b[39m\u001b[33m'\u001b[39m: \u001b[32m0.0\u001b[39m\n\u001b[32m 63\u001b[39m }, index=all_data_df.index)\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/series.py:1121\u001b[39m, in \u001b[36mSeries.__getitem__\u001b[39m\u001b[34m(self, key)\u001b[39m\n\u001b[32m 1118\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._values[key]\n\u001b[32m 1120\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m key_is_scalar:\n\u001b[32m-> \u001b[39m\u001b[32m1121\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_get_value\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1123\u001b[39m \u001b[38;5;66;03m# Convert generator to list before going through hashable part\u001b[39;00m\n\u001b[32m 1124\u001b[39m \u001b[38;5;66;03m# (We will iterate through the generator there to check for slices)\u001b[39;00m\n\u001b[32m 1125\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m is_iterator(key):\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/series.py:1239\u001b[39m, in \u001b[36mSeries._get_value\u001b[39m\u001b[34m(self, label, takeable)\u001b[39m\n\u001b[32m 1236\u001b[39m \u001b[38;5;66;03m# Similar to Index.get_value, but we do not fall back to positional\u001b[39;00m\n\u001b[32m 1237\u001b[39m loc = \u001b[38;5;28mself\u001b[39m.index.get_loc(label)\n\u001b[32m-> \u001b[39m\u001b[32m1239\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[43mis_integer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mloc\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[32m 1240\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._values[loc]\n\u001b[32m 1242\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m.index, MultiIndex):\n", - "\u001b[31mKeyboardInterrupt\u001b[39m: " + "name": "stderr", + "output_type": "stream", + "text": [ + "Ranking Features in Concepts: 100%|██████████| 3/3 [00:00<00:00, 15.81it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "概念相关因子生成完毕。\n", + "4554725\n", + "开始计算股东增减持因子...\n", + "警告: 'in_de' 列中存在未映射的值,可能导致 _direction 列出现NaN。\n", + "股东增减持因子计算完成。\n", + "Calculating cat_senti_mom_vol_spike...\n", + "Finished cat_senti_mom_vol_spike.\n", + "Calculating cat_senti_pre_breakout...\n", + "Calculating atr_10 as it's missing...\n", + "Calculating atr_40 as it's missing...\n", + "Finished cat_senti_pre_breakout.\n", + "计算因子 ts_turnover_rate_acceleration_5_20\n", + "计算因子 ts_vol_sustain_10_30\n", + "计算因子 cs_amount_outlier_10\n", + "计算因子 ts_ff_to_total_turnover_ratio\n", + "计算因子 ts_price_volume_trend_coherence_5_20\n", + "计算因子 ts_ff_turnover_rate_surge_10\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "开始计算因子: AR, BR (原地修改)...\n", + "因子 AR, BR 计算成功。\n", + "因子 AR, BR 计算流程结束。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "计算 BBI...\n", + "--- 计算日级别偏离度 (使用 pct_chg) ---\n", + "--- 计算日级别动量基准 (使用 pct_chg) ---\n", + "日级别动量基准计算完成 (使用 pct_chg)。\n", + "日级别偏离度计算完成 (使用 pct_chg)。\n", + "--- 计算日级别行业偏离度 (使用 pct_chg 和行业基准) ---\n", + "--- 计算日级别行业动量基准 (使用 pct_chg 和 cat_l2_code) ---\n", + "错误: 计算日级别行业动量基准需要以下列: ['pct_chg', 'cat_l2_code', 'trade_date', 'ts_code']。\n", + "错误: 计算日级别行业偏离度需要以下列: ['pct_chg', 'daily_industry_positive_benchmark', 'daily_industry_negative_benchmark']。请先运行 daily_industry_momentum_benchmark(df)。\n", + "Index(['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol',\n", + " 'pct_chg', 'amount', 'turnover_rate',\n", + " ...\n", + " 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike',\n", + " 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike',\n", + " 'vol_std_5', 'atr_14', 'atr_6', 'obv'],\n", + " dtype='object', length=104)\n", + "Calculating senti_strong_inflow...\n", + "Finished senti_strong_inflow.\n", + "Calculating lg_flow_mom_corr_20_60...\n", + "Finished lg_flow_mom_corr_20_60.\n", + "Calculating lg_flow_accel...\n", + "Finished lg_flow_accel.\n", + "Calculating profit_pressure...\n", + "Finished profit_pressure.\n", + "Calculating underwater_resistance...\n", + "Finished underwater_resistance.\n", + "Calculating cost_conc_std_20...\n", + "Finished cost_conc_std_20.\n", + "Calculating profit_decay_20...\n", + "Finished profit_decay_20.\n", + "Calculating vol_amp_loss_20...\n", + "Finished vol_amp_loss_20.\n", + "Calculating vol_drop_profit_cnt_5...\n", + "Finished vol_drop_profit_cnt_5.\n", + "Calculating lg_flow_vol_interact_20...\n", + "Finished lg_flow_vol_interact_20.\n", + "Calculating cost_break_confirm_cnt_5...\n", + "Finished cost_break_confirm_cnt_5.\n", + "Calculating atr_norm_channel_pos_14...\n", + "Finished atr_norm_channel_pos_14.\n", + "Calculating turnover_diff_skew_20...\n", + "Finished turnover_diff_skew_20.\n", + "Calculating lg_sm_flow_diverge_20...\n", + "Finished lg_sm_flow_diverge_20.\n", + "Calculating pullback_strong_20_20...\n", + "Finished pullback_strong_20_20.\n", + "Calculating vol_wgt_hist_pos_20...\n", + "Finished vol_wgt_hist_pos_20.\n", + "Calculating vol_adj_roc_20...\n", + "Finished vol_adj_roc_20.\n", + "Calculating cs_rank_net_lg_flow_val...\n", + "Finished cs_rank_net_lg_flow_val.\n", + "Calculating cs_rank_flow_divergence...\n", + "Finished cs_rank_flow_divergence.\n", + "Calculating cs_rank_ind_adj_lg_flow...\n", + "Finished cs_rank_ind_adj_lg_flow.\n", + "Calculating cs_rank_elg_buy_ratio...\n", + "Finished cs_rank_elg_buy_ratio.\n", + "Calculating cs_rank_rel_profit_margin...\n", + "Finished cs_rank_rel_profit_margin.\n", + "Calculating cs_rank_cost_breadth...\n", + "Finished cs_rank_cost_breadth.\n", + "Calculating cs_rank_dist_to_upper_cost...\n", + "Finished cs_rank_dist_to_upper_cost.\n", + "Calculating cs_rank_winner_rate...\n", + "Finished cs_rank_winner_rate.\n", + "Calculating cs_rank_intraday_range...\n", + "Finished cs_rank_intraday_range.\n", + "Calculating cs_rank_close_pos_in_range...\n", + "Finished cs_rank_close_pos_in_range.\n", + "Calculating cs_rank_opening_gap...\n", + "Error calculating cs_rank_opening_gap: Missing 'pre_close' column. Assigning NaN.\n", + "Calculating cs_rank_pos_in_hist_range...\n", + "Finished cs_rank_pos_in_hist_range.\n", + "Calculating cs_rank_vol_x_profit_margin...\n", + "Finished cs_rank_vol_x_profit_margin.\n", + "Calculating cs_rank_lg_flow_price_concordance...\n", + "Finished cs_rank_lg_flow_price_concordance.\n", + "Calculating cs_rank_turnover_per_winner...\n", + "Finished cs_rank_turnover_per_winner.\n", + "Calculating cs_rank_ind_cap_neutral_pe (Placeholder - requires statsmodels)...\n", + "Finished cs_rank_ind_cap_neutral_pe (Placeholder).\n", + "Calculating cs_rank_volume_ratio...\n", + "Finished cs_rank_volume_ratio.\n", + "Calculating cs_rank_elg_buy_sell_sm_ratio...\n", + "Finished cs_rank_elg_buy_sell_sm_ratio.\n", + "Calculating cs_rank_cost_dist_vol_ratio...\n", + "Finished cs_rank_cost_dist_vol_ratio.\n", + "Calculating cs_rank_size...\n", + "Finished cs_rank_size.\n", + "\n", + "RangeIndex: 4554725 entries, 0 to 4554724\n", + "Columns: 198 entries, ts_code to cs_rank_size\n", + "dtypes: bool(10), datetime64[ns](1), float64(176), int64(6), int8(1), object(4)\n", + "memory usage: 6.4+ GB\n", + "None\n", + "['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg', 'amount', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv', 'volume_ratio', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg', 'winner_rate', 'cat_l2_code', 'is_hot_concept_stock', 'concept_rank_pct_chg', 'concept_rank_turnover_rate', 'concept_rank_volume_ratio', 'holder_net_change_sum_10d', 'holder_increase_days_10d', 'holder_decrease_days_10d', 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d', 'holder_direction_score_10d', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'price_cost_divergence', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_flow_divergence', 'cs_rank_ind_adj_lg_flow', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_opening_gap', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_ind_cap_neutral_pe', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size']\n" ] } ], @@ -492,6 +627,7 @@ "import numpy as np\n", "from main.factor.factor import *\n", "from main.factor.money_factor import * \n", + "from main.factor.concept_factor import * \n", "\n", "\n", "def filter_data(df):\n", @@ -518,6 +654,10 @@ "# df = cat_price_vs_sma_vs_deduction_price(df, n=120)\n", "# df = cat_reason(df, top_list_df)\n", "# df = cat_is_on_top_list(df, top_list_df)\n", + "print(len(df))\n", + "df = generate_concept_factors(df, concept_dict)\n", + "print(len(df))\n", + "\n", "df = holder_trade_factors(df, stk_holdertrade_df)\n", "\n", "df = cat_senti_mom_vol_spike(\n", @@ -617,7 +757,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "b87b938028afa206", "metadata": { "ExecuteTime": { @@ -655,580 +795,7 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "f4f16d63ad18d1bc", - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-03T13:08:03.670700Z", - "start_time": "2025-04-03T13:08:03.665739Z" - } - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import statsmodels.api as sm # 用于中性化回归\n", - "from tqdm import tqdm # 可选,用于显示进度条\n", - "\n", - "# --- 常量 ---\n", - "epsilon = 1e-10 # 防止除零\n", - "\n", - "# --- 1. 中位数去极值 (MAD) ---\n", - "\n", - "def cs_mad_filter(df: pd.DataFrame,\n", - " features: list,\n", - " k: float = 3.0,\n", - " scale_factor: float = 1.4826):\n", - " \"\"\"\n", - " 对指定特征列进行截面 MAD 去极值处理 (原地修改)。\n", - "\n", - " 方法: 对每日截面数据,计算 median 和 MAD,\n", - " 将超出 [median - k * scale * MAD, median + k * scale * MAD] 范围的值\n", - " 替换为边界值 (Winsorization)。\n", - " scale_factor=1.4826 使得 MAD 约等于正态分布的标准差。\n", - "\n", - " Args:\n", - " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date' 和 features 列。\n", - " features (list): 需要处理的特征列名列表。\n", - " k (float): MAD 的倍数,用于确定边界。默认为 3.0。\n", - " scale_factor (float): MAD 的缩放因子。默认为 1.4826。\n", - "\n", - " WARNING: 此函数会原地修改输入的 DataFrame 'df'。\n", - " \"\"\"\n", - " print(f\"开始截面 MAD 去极值处理 (k={k})...\")\n", - " if not all(col in df.columns for col in features):\n", - " missing = [col for col in features if col not in df.columns]\n", - " print(f\"错误: DataFrame 中缺少以下特征列: {missing}。跳过去极值处理。\")\n", - " return\n", - "\n", - " grouped = df.groupby('trade_date')\n", - "\n", - " for col in tqdm(features, desc=\"MAD Filtering\"):\n", - " try:\n", - " # 计算截面中位数\n", - " median = grouped[col].transform('median')\n", - " # 计算截面 MAD (Median Absolute Deviation from Median)\n", - " mad = (df[col] - median).abs().groupby(df['trade_date']).transform('median')\n", - "\n", - " # 计算上下边界\n", - " lower_bound = median - k * scale_factor * mad\n", - " upper_bound = median + k * scale_factor * mad\n", - "\n", - " # 原地应用 clip\n", - " df[col] = np.clip(df[col], lower_bound, upper_bound)\n", - "\n", - " except KeyError:\n", - " print(f\"警告: 列 '{col}' 可能不存在或在分组中出错,跳过此列的 MAD 处理。\")\n", - " except Exception as e:\n", - " print(f\"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的 MAD 处理。\")\n", - "\n", - " print(\"截面 MAD 去极值处理完成。\")\n", - "\n", - "\n", - "# --- 2. 行业市值中性化 ---\n", - "\n", - "def cs_neutralize_industry_cap(df: pd.DataFrame,\n", - " features: list,\n", - " industry_col: str = 'cat_l2_code',\n", - " market_cap_col: str = 'circ_mv'):\n", - " \"\"\"\n", - " 对指定特征列进行截面行业和对数市值中性化 (原地修改)。\n", - " 使用 OLS 回归: feature ~ 1 + log(market_cap) + C(industry)\n", - " 将回归残差写回原特征列。\n", - "\n", - " Args:\n", - " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date', features 列,\n", - " industry_col, market_cap_col。\n", - " features (list): 需要处理的特征列名列表。\n", - " industry_col (str): 行业分类列名。\n", - " market_cap_col (str): 流通市值列名。\n", - "\n", - " WARNING: 此函数会原地修改输入的 DataFrame 'df' 的 features 列。\n", - " 计算量较大,可能耗时较长。\n", - " 需要安装 statsmodels 库 (pip install statsmodels)。\n", - " \"\"\"\n", - " print(\"开始截面行业市值中性化...\")\n", - " required_cols = features + ['trade_date', industry_col, market_cap_col]\n", - " if not all(col in df.columns for col in required_cols):\n", - " missing = [col for col in required_cols if col not in df.columns]\n", - " print(f\"错误: DataFrame 中缺少必需列: {missing}。无法进行中性化。\")\n", - " return\n", - "\n", - " # 预处理:计算 log 市值,处理 industry code 可能的 NaN\n", - " log_cap_col = '_log_market_cap'\n", - " df[log_cap_col] = np.log1p(df[market_cap_col]) # log1p 处理 0 值\n", - " # df[industry_col] = df[industry_col].cat.add_categories('UnknownIndustry')\n", - " # df[industry_col] = df[industry_col].fillna('UnknownIndustry') # 填充行业 NaN\n", - " # df[industry_col] = df[industry_col].astype('category') # 转为类别,ols 会自动处理\n", - "\n", - " dates = df['trade_date'].unique()\n", - " all_residuals = [] # 用于收集所有日期的残差\n", - "\n", - " for date in tqdm(dates, desc=\"Neutralizing\"):\n", - " daily_data = df.loc[df['trade_date'] == date, features + [log_cap_col, industry_col]].copy() # 使用 .loc 获取副本\n", - "\n", - " # 准备自变量 X (常数项 + log市值 + 行业哑变量)\n", - " X = daily_data[[log_cap_col]]\n", - " X = sm.add_constant(X, prepend=True) # 添加常数项\n", - " # 创建行业哑变量 (drop_first=True 避免共线性)\n", - " industry_dummies = pd.get_dummies(daily_data[industry_col], prefix=industry_col, drop_first=True)\n", - " industry_dummies = industry_dummies.astype(int)\n", - " X = pd.concat([X, industry_dummies], axis=1)\n", - "\n", - " daily_residuals = daily_data[[col for col in features]].copy() # 创建用于存储残差的df\n", - "\n", - " for col in features:\n", - " Y = daily_data[col]\n", - "\n", - " # 处理 NaN 值,确保 X 和 Y 在相同位置有有效值\n", - " valid_mask = Y.notna() & X.notna().all(axis=1)\n", - " if valid_mask.sum() < (X.shape[1] + 1): # 数据点不足以估计模型\n", - " print(f\"警告: 日期 {date}, 特征 {col} 有效数据不足 ({valid_mask.sum()}个),无法中性化,填充 NaN。\")\n", - " daily_residuals[col] = np.nan\n", - " continue\n", - "\n", - " Y_valid = Y[valid_mask]\n", - " X_valid = X[valid_mask]\n", - "\n", - " # 执行 OLS 回归\n", - " try:\n", - " model = sm.OLS(Y_valid.to_numpy(), X_valid.to_numpy())\n", - " results = model.fit()\n", - " # 将残差填回对应位置\n", - " daily_residuals.loc[valid_mask, col] = results.resid\n", - " daily_residuals.loc[~valid_mask, col] = np.nan # 原本无效的位置填充 NaN\n", - " except Exception as e:\n", - " print(f\"警告: 日期 {date}, 特征 {col} 回归失败: {e},填充 NaN。\")\n", - " daily_residuals[col] = np.nan\n", - " break\n", - "\n", - " all_residuals.append(daily_residuals)\n", - "\n", - " # 合并所有日期的残差结果\n", - " if all_residuals:\n", - " residuals_df = pd.concat(all_residuals)\n", - " # 将残差结果更新回原始 df (原地修改)\n", - " # 使用 update 比 merge 更适合基于索引的原地更新\n", - " # 确保 residuals_df 的索引与 df 中对应部分一致\n", - " df.update(residuals_df)\n", - " else:\n", - " print(\"没有有效的残差结果可以合并。\")\n", - "\n", - "\n", - " # 清理临时列\n", - " df.drop(columns=[log_cap_col], inplace=True)\n", - " print(\"截面行业市值中性化完成。\")\n", - "\n", - "\n", - "# --- 3. Z-Score 标准化 ---\n", - "\n", - "def cs_zscore_standardize(df: pd.DataFrame, features: list, epsilon: float = 1e-10):\n", - " \"\"\"\n", - " 对指定特征列进行截面 Z-Score 标准化 (原地修改)。\n", - " 方法: Z = (value - cross_sectional_mean) / (cross_sectional_std + epsilon)\n", - "\n", - " Args:\n", - " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date' 和 features 列。\n", - " features (list): 需要处理的特征列名列表。\n", - " epsilon (float): 防止除以零的小常数。\n", - "\n", - " WARNING: 此函数会原地修改输入的 DataFrame 'df'。\n", - " \"\"\"\n", - " print(\"开始截面 Z-Score 标准化...\")\n", - " if not all(col in df.columns for col in features):\n", - " missing = [col for col in features if col not in df.columns]\n", - " print(f\"错误: DataFrame 中缺少以下特征列: {missing}。跳过标准化处理。\")\n", - " return\n", - "\n", - " grouped = df.groupby('trade_date')\n", - "\n", - " for col in tqdm(features, desc=\"Standardizing\"):\n", - " try:\n", - " # 使用 transform 计算截面均值和标准差\n", - " mean = grouped[col].transform('mean')\n", - " std = grouped[col].transform('std')\n", - "\n", - " # 计算 Z-Score 并原地赋值\n", - " df[col] = (df[col] - mean) / (std + epsilon)\n", - "\n", - " except KeyError:\n", - " print(f\"警告: 列 '{col}' 可能不存在或在分组中出错,跳过此列的标准化处理。\")\n", - " except Exception as e:\n", - " print(f\"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的标准化处理。\")\n", - "\n", - " print(\"截面 Z-Score 标准化完成。\")\n", - "\n", - "def fill_nan_with_daily_median(df: pd.DataFrame, feature_columns: list[str]) -> pd.DataFrame:\n", - " \"\"\"\n", - " 对指定特征列进行每日截面中位数填充缺失值 (NaN)。\n", - "\n", - " 参数:\n", - " df (pd.DataFrame): 包含多日数据的DataFrame,需要包含 'trade_date' 和 feature_columns 中的列。\n", - " feature_columns (list[str]): 需要进行缺失值填充的特征列名称列表。\n", - "\n", - " 返回:\n", - " pd.DataFrame: 包含缺失值填充后特征列的DataFrame。在输入DataFrame的副本上操作。\n", - " \"\"\"\n", - " processed_df = df.copy() # 在副本上操作,保留原始数据\n", - "\n", - " # 确保 trade_date 是 datetime 类型以便正确分组\n", - " processed_df['trade_date'] = pd.to_datetime(processed_df['trade_date'])\n", - "\n", - " def _fill_daily_nan(group):\n", - " # group 是某一个交易日的 DataFrame\n", - "\n", - " # 遍历指定的特征列\n", - " for feature_col in feature_columns:\n", - " # 检查列是否存在于当前分组中\n", - " if feature_col in group.columns:\n", - " # 计算当日该特征的中位数\n", - " median_val = group[feature_col].median()\n", - "\n", - " # 使用当日中位数填充该特征列的 NaN 值\n", - " # inplace=True 会直接修改 group DataFrame\n", - " group[feature_col].fillna(median_val, inplace=True)\n", - " # else:\n", - " # print(f\"Warning: Feature column '{feature_col}' not found in daily group for {group['trade_date'].iloc[0]}. Skipping.\")\n", - "\n", - " return group\n", - "\n", - " # 按交易日期分组,并应用每日填充函数\n", - " # group_keys=False 避免将分组键添加到结果索引中\n", - " filled_df = processed_df.groupby('trade_date', group_keys=False).apply(_fill_daily_nan)\n", - "\n", - " return filled_df" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "40e6b68a91b30c79", - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-03T13:08:04.694262Z", - "start_time": "2025-04-03T13:08:03.694904Z" - } - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "\n", - "\n", - "def remove_outliers_label_percentile(label: pd.Series, lower_percentile: float = 0.01, upper_percentile: float = 0.99,\n", - " log=True):\n", - " if not (0 <= lower_percentile < upper_percentile <= 1):\n", - " raise ValueError(\"Percentile values must satisfy 0 <= lower_percentile < upper_percentile <= 1.\")\n", - "\n", - " # Calculate lower and upper bounds based on percentiles\n", - " lower_bound = label.quantile(lower_percentile)\n", - " upper_bound = label.quantile(upper_percentile)\n", - "\n", - " # Filter out values outside the bounds\n", - " filtered_label = label[(label >= lower_bound) & (label <= upper_bound)]\n", - "\n", - " # Print the number of removed outliers\n", - " if log:\n", - " print(f\"Removed {len(label) - len(filtered_label)} outliers.\")\n", - " return filtered_label\n", - "\n", - "\n", - "def calculate_risk_adjusted_target(df, days=5):\n", - " df = df.sort_values(by=['ts_code', 'trade_date'])\n", - "\n", - " df['future_close'] = df.groupby('ts_code')['close'].shift(-days)\n", - " df['future_open'] = df.groupby('ts_code')['open'].shift(-1)\n", - " df['future_return'] = (df['future_close'] - df['future_open']) / df['future_open']\n", - "\n", - " df['future_volatility'] = df.groupby('ts_code')['future_return'].rolling(days, min_periods=1).std().reset_index(\n", - " level=0, drop=True)\n", - " sharpe_ratio = df['future_return'] * df['future_volatility']\n", - " sharpe_ratio.replace([np.inf, -np.inf], np.nan, inplace=True)\n", - "\n", - " return sharpe_ratio\n", - "\n", - "\n", - "def calculate_score(df, days=5, lambda_param=1.0):\n", - " def calculate_max_drawdown(prices):\n", - " peak = prices.iloc[0] # 初始化峰值\n", - " max_drawdown = 0 # 初始化最大回撤\n", - "\n", - " for price in prices:\n", - " if price > peak:\n", - " peak = price # 更新峰值\n", - " else:\n", - " drawdown = (peak - price) / peak # 计算当前回撤\n", - " max_drawdown = max(max_drawdown, drawdown) # 更新最大回撤\n", - "\n", - " return max_drawdown\n", - "\n", - " def compute_stock_score(stock_df):\n", - " stock_df = stock_df.sort_values(by=['trade_date'])\n", - " future_return = stock_df['future_return']\n", - " # 使用已有的 pct_chg 字段计算波动率\n", - " volatility = stock_df['pct_chg'].rolling(days).std().shift(-days)\n", - " max_drawdown = stock_df['close'].rolling(days).apply(calculate_max_drawdown, raw=False).shift(-days)\n", - " score = future_return - lambda_param * max_drawdown\n", - " return score\n", - "\n", - " # # 确保 DataFrame 按照股票代码和交易日期排序\n", - " # df = df.sort_values(by=['ts_code', 'trade_date'])\n", - "\n", - " # 对每个股票分别计算 score\n", - " df['score'] = df.groupby('ts_code').apply(compute_stock_score).reset_index(level=0, drop=True)\n", - "\n", - " return df['score']\n", - "\n", - "\n", - "def remove_highly_correlated_features(df, feature_columns, threshold=0.9):\n", - " numeric_features = df[feature_columns].select_dtypes(include=[np.number]).columns.tolist()\n", - " if not numeric_features:\n", - " raise ValueError(\"No numeric features found in the provided data.\")\n", - "\n", - " corr_matrix = df[numeric_features].corr().abs()\n", - " upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))\n", - " to_drop = [column for column in upper.columns if any(upper[column] > threshold)]\n", - " remaining_features = [col for col in feature_columns if col not in to_drop\n", - " or 'act' in col or 'af' in col]\n", - " return remaining_features\n", - "\n", - "\n", - "def cross_sectional_standardization(df, features):\n", - " df_sorted = df.sort_values(by='trade_date') # 按时间排序\n", - " df_standardized = df_sorted.copy()\n", - "\n", - " for date in df_sorted['trade_date'].unique():\n", - " # 获取当前时间点的数据\n", - " current_data = df_standardized[df_standardized['trade_date'] == date]\n", - "\n", - " # 只对指定特征进行标准化\n", - " scaler = StandardScaler()\n", - " standardized_values = scaler.fit_transform(current_data[features])\n", - "\n", - " # 将标准化结果重新赋值回去\n", - " df_standardized.loc[df_standardized['trade_date'] == date, features] = standardized_values\n", - "\n", - " return df_standardized\n", - "\n", - "\n", - "import numpy as np\n", - "import pandas as pd\n", - "\n", - "\n", - "def neutralize_manual_revised(df: pd.DataFrame, features: list, industry_col: str, mkt_cap_col: str) -> pd.DataFrame:\n", - " \"\"\"\n", - " 手动实现简单回归以提升速度,通过构建 Series 确保索引对齐。\n", - " 对特征在行业内部进行市值中性化。\n", - "\n", - " Args:\n", - " df: 输入的 DataFrame,包含特征、行业分类和市值列。\n", - " features: 需要进行中性化的特征列名列表。\n", - " industry_col: 行业分类列的列名。\n", - " mkt_cap_col: 市值列的列名。\n", - "\n", - " Returns:\n", - " 中性化后的 DataFrame。\n", - " \"\"\"\n", - "\n", - " df[mkt_cap_col] = pd.to_numeric(df[mkt_cap_col], errors='coerce')\n", - " df_cleaned = df.dropna(subset=[mkt_cap_col]).copy()\n", - " df_cleaned = df_cleaned[df_cleaned[mkt_cap_col] > 0].copy()\n", - "\n", - " if df_cleaned.empty:\n", - " print(\"警告: 清理市值异常值后 DataFrame 为空。\")\n", - " return df # 返回原始或空df,取决于清理前的状态\n", - "\n", - " processed_df = df\n", - "\n", - " for col in features:\n", - " if col not in df_cleaned.columns:\n", - " print(f\"警告: 特征列 '{col}' 不存在于清理后的 DataFrame 中,已跳过。\")\n", - " # 对于原始 df 中该列不存在的,在结果 df 中也保持原样(可能全是NaN)\n", - " processed_df[col] = df[col] if col in df.columns else np.nan\n", - " continue\n", - "\n", - " # 跳过对控制变量本身进行中性化\n", - " if col == mkt_cap_col or col == industry_col:\n", - " print(f\"警告: 特征列 '{col}' 是控制变量或内部使用的列,跳过中性化。\")\n", - " # 在结果 df 中也保持原样\n", - " processed_df[col] = df[col] if col in df.columns else np.nan\n", - " continue\n", - "\n", - " residual_series = pd.Series(index=df_cleaned.index, dtype=float)\n", - "\n", - " # 在分组前处理特征列的 NaN,只对有因子值的行进行回归计算\n", - " df_subset_factor = df_cleaned.dropna(subset=[col]).copy()\n", - "\n", - " if not df_subset_factor.empty:\n", - " for industry, group in df_subset_factor.groupby(industry_col):\n", - " x = group[mkt_cap_col] # 市值对数\n", - " y = group[col] # 因子值\n", - "\n", - " # 确保有足够的数据点 (>1) 且市值对数有方差 (>0) 进行回归计算\n", - " # 检查 np.var > 一个很小的正数,避免浮点数误差导致的零方差判断问题\n", - " if len(group) > 1 and np.var(x) > 1e-9:\n", - " try:\n", - " beta = np.cov(y, x)[0, 1] / np.var(x)\n", - " alpha = np.mean(y) - beta * np.mean(x)\n", - "\n", - " # 计算残差\n", - " resid = y - (alpha + beta * x)\n", - "\n", - " # 将计算出的残差存储到 residual_series 中,通过索引自动对齐\n", - " residual_series.loc[resid.index] = resid\n", - "\n", - " except Exception as e:\n", - " # 捕获可能的计算异常,例如np.cov或np.var因为极端数据报错\n", - " print(f\"警告: 在行业 {industry} 计算回归时发生错误: {e}。该组残差将设为原始值或 NaN。\")\n", - " # 此时该组的残差会保持 residual_series 初始化时的 NaN 或后续处理\n", - " # 也可以选择保留原始值:residual_series.loc[group.index] = group[col]\n", - "\n", - " else:\n", - " residual_series.loc[group.index] = group[col] # 保留原始因子值\n", - " processed_df.loc[residual_series.index, col] = residual_series\n", - "\n", - "\n", - " else:\n", - " processed_df[col] = np.nan # 或 df[col] if col in df.columns else np.nan\n", - "\n", - " return processed_df\n", - "\n", - "\n", - "import gc\n", - "\n", - "gc.collect()\n", - "\n", - "\n", - "def mad_filter(df, features, n=3):\n", - " for col in features:\n", - " median = df[col].median()\n", - " mad = np.median(np.abs(df[col] - median))\n", - " upper = median + n * mad\n", - " lower = median - n * mad\n", - " df[col] = np.clip(df[col], lower, upper) # 截断极值\n", - " return df\n", - "\n", - "\n", - "def percentile_filter(df, features, lower_percentile=0.01, upper_percentile=0.99):\n", - " for col in features:\n", - " # 按日期分组计算上下百分位数\n", - " lower_bound = df.groupby('trade_date')[col].transform(\n", - " lambda x: x.quantile(lower_percentile)\n", - " )\n", - " upper_bound = df.groupby('trade_date')[col].transform(\n", - " lambda x: x.quantile(upper_percentile)\n", - " )\n", - " # 截断超出范围的值\n", - " df[col] = np.clip(df[col], lower_bound, upper_bound)\n", - " return df\n", - "\n", - "\n", - "from scipy.stats import iqr\n", - "\n", - "\n", - "def iqr_filter(df, features):\n", - " for col in features:\n", - " df[col] = df.groupby('trade_date')[col].transform(\n", - " lambda x: (x - x.median()) / iqr(x) if iqr(x) != 0 else x\n", - " )\n", - " return df\n", - "\n", - "\n", - "def quantile_filter(df, features, lower_quantile=0.01, upper_quantile=0.99, window=60):\n", - " df = df.copy()\n", - " for col in features:\n", - " # 计算 rolling 统计量,需要按日期进行 groupby\n", - " rolling_lower = df.groupby('trade_date')[col].transform(lambda x: x.rolling(window=min(len(x), window)).quantile(lower_quantile))\n", - " rolling_upper = df.groupby('trade_date')[col].transform(lambda x: x.rolling(window=min(len(x), window)).quantile(upper_quantile))\n", - "\n", - " # 对数据进行裁剪\n", - " df[col] = np.clip(df[col], rolling_lower, rolling_upper)\n", - " \n", - " return df\n", - "\n", - "def select_top_features_by_rankic(df: pd.DataFrame, feature_columns: list, n: int, target_column: str = 'future_return') -> list:\n", - " \"\"\"\n", - " 计算给定特征与目标列的 RankIC,并返回 RankIC 绝对值最高的 n 个特征。\n", - "\n", - " Args:\n", - " df: 包含特征列和目标列的 Pandas DataFrame。\n", - " feature_columns: 包含所有待评估特征列名的列表。\n", - " n: 希望选取的 RankIC 绝对值最高的特征数量。\n", - " target_column: 目标列的名称,用于计算 RankIC。默认为 'future_return'。\n", - "\n", - " Returns:\n", - " 包含 RankIC 绝对值最高的 n 个特征列名的列表。\n", - " \"\"\"\n", - " numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns\n", - " numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", - " if target_column not in df.columns:\n", - " raise ValueError(f\"目标列 '{target_column}' 不存在于 DataFrame 中。\")\n", - "\n", - " rankic_scores = {}\n", - " for feature in numeric_columns:\n", - " if feature not in df.columns:\n", - " print(f\"警告: 特征列 '{feature}' 不存在于 DataFrame 中,已跳过。\")\n", - " continue\n", - "\n", - " # 计算特征与目标列的 RankIC (斯皮尔曼相关系数)\n", - " # dropna() 是为了处理缺失值,确保相关性计算不失败\n", - " valid_data = df[[feature, target_column]].dropna()\n", - " if len(valid_data) > 1: # 确保有足够的数据点进行相关性计算\n", - " # 计算斯皮尔曼相关性\n", - " correlation = valid_data[feature].corr(valid_data[target_column], method='spearman')\n", - " rankic_scores[feature] = abs(correlation) # 使用绝对值来衡量相关性强度\n", - " else:\n", - " rankic_scores[feature] = 0 # 数据不足,RankIC设为0或跳过\n", - "\n", - " # 将 RankIC 分数转换为 Series 便于排序\n", - " rankic_series = pd.Series(rankic_scores)\n", - "\n", - " # 按 RankIC 绝对值降序排序,选取前 n 个特征\n", - " # handle case where n might be larger than available features\n", - " n_actual = min(n, len(rankic_series))\n", - " top_features = rankic_series.sort_values(ascending=False).head(n_actual).index.tolist()\n", - " top_features = [col for col in feature_columns if col in top_features or col not in numeric_columns]\n", - " return top_features\n", - "\n", - "def create_deviation_within_dates(df, feature_columns):\n", - " groupby_col = 'cat_l2_code' # 使用 trade_date 进行分组\n", - " new_columns = {}\n", - " ret_feature_columns = feature_columns[:]\n", - "\n", - " # 自动选择所有数值型特征\n", - " num_features = [col for col in feature_columns if 'cat' not in col and 'index' not in col]\n", - "\n", - " # num_features = ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'cat_vol_spike', 'obv', 'maobv_6', 'return_5', 'return_10', 'return_20', 'std_return_5', 'std_return_15', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'act_factor5', 'act_factor6', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'alpha_022', 'alpha_003', 'alpha_007', 'alpha_013']\n", - " num_features = [col for col in num_features if 'cat' not in col and 'industry' not in col]\n", - " num_features = [col for col in num_features if 'limit' not in col]\n", - " num_features = [col for col in num_features if 'cyq' not in col]\n", - "\n", - " # 遍历所有数值型特征\n", - " for feature in num_features:\n", - " if feature == 'trade_date': # 不需要对 'trade_date' 计算偏差\n", - " continue\n", - "\n", - " # grouped_mean = df.groupby(['trade_date'])[feature].transform('mean')\n", - " # deviation_col_name = f'deviation_mean_{feature}'\n", - " # new_columns[deviation_col_name] = df[feature] - grouped_mean\n", - " # ret_feature_columns.append(deviation_col_name)\n", - "\n", - " grouped_mean = df.groupby(['trade_date', groupby_col])[feature].transform('mean')\n", - " deviation_col_name = f'deviation_mean_{feature}'\n", - " new_columns[deviation_col_name] = df[feature] - grouped_mean\n", - " ret_feature_columns.append(deviation_col_name)\n", - "\n", - " # 将新计算的偏差特征与原始 DataFrame 合并\n", - " df = pd.concat([df, pd.DataFrame(new_columns)], axis=1)\n", - "\n", - " # for feature in ['obv', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4']:\n", - " # df[f'deviation_industry_{feature}'] = df[feature] - df[f'industry_{feature}']\n", - "\n", - " return df, ret_feature_columns\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "47c12bb34062ae7a", "metadata": { "ExecuteTime": { @@ -1260,9 +827,9 @@ "# .fillna(0) # 填充每个股票组最后的 NaN\n", "# .astype(int)\n", "# .reset_index(level=0, drop=True))\n", - "# df['label'] = df.groupby('trade_date', group_keys=False)['future_return'].transform(\n", - "# lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n", - "# )\n", + "df['label'] = df.groupby('trade_date', group_keys=False)['future_return'].transform(\n", + " lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n", + ")\n", "# filter_index = df['future_return'].between(df['future_return'].quantile(0.01), df['future_return'].quantile(0.99))\n", "filter_index = df['future_return'].between(df['future_return'].quantile(0.001), 0.6)\n", "\n", @@ -1273,7 +840,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "29221dde", "metadata": {}, "outputs": [ @@ -1281,7 +848,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "200\n" + "208\n" ] } ], @@ -1302,6 +869,8 @@ "feature_columns = [col for col in feature_columns if 'pe_ttm' not in col]\n", "# feature_columns = [col for col in feature_columns if 'volatility' not in col]\n", "# feature_columns = [col for col in feature_columns if 'circ_mv' not in col]\n", + "feature_columns = [col for col in feature_columns if 'circ_mv' not in col]\n", + "\n", "feature_columns = [col for col in feature_columns if 'code' not in col]\n", "feature_columns = [col for col in feature_columns if col not in origin_columns]\n", "feature_columns = [col for col in feature_columns if not col.startswith('_')]\n", @@ -1320,7 +889,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "03ee5daf", "metadata": {}, "outputs": [], @@ -1333,7 +902,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "b76ea08a", "metadata": {}, "outputs": [ @@ -1345,7 +914,7 @@ "0 000001.SZ 2019-01-02 16.574219\n", "1 000001.SZ 2019-01-03 16.583965\n", "2 000001.SZ 2019-01-04 16.633371\n", - "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'is_hot_concept_stock', 'concept_rank_pct_chg', 'concept_rank_turnover_rate', 'concept_rank_volume_ratio', 'holder_net_change_sum_10d', 'holder_increase_days_10d', 'holder_decrease_days_10d', 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", "去除极值\n", "开始截面 MAD 去极值处理 (k=3.0)...\n" ] @@ -1354,7 +923,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "MAD Filtering: 100%|██████████| 139/139 [00:06<00:00, 21.25it/s]\n" + "MAD Filtering: 100%|██████████| 147/147 [00:09<00:00, 15.75it/s]\n" ] }, { @@ -1362,6 +931,22 @@ "output_type": "stream", "text": [ "截面 MAD 去极值处理完成。\n", + "标准化\n", + "开始截面 Z-Score 标准化...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Standardizing: 100%|██████████| 147/147 [00:02<00:00, 54.57it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 Z-Score 标准化完成。\n", "开始截面 MAD 去极值处理 (k=3.0)...\n" ] }, @@ -1369,7 +954,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "MAD Filtering: 100%|██████████| 139/139 [00:05<00:00, 26.68it/s]\n" + "MAD Filtering: 100%|██████████| 147/147 [00:05<00:00, 25.55it/s]\n" ] }, { @@ -1377,6 +962,28 @@ "output_type": "stream", "text": [ "截面 MAD 去极值处理完成。\n", + "开始截面 Z-Score 标准化...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Standardizing: 37%|███▋ | 54/147 [00:00<00:01, 81.06it/s]" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Standardizing: 100%|██████████| 147/147 [00:01<00:00, 80.38it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 Z-Score 标准化完成。\n", "开始截面 MAD 去极值处理 (k=3.0)...\n" ] }, @@ -1407,7 +1014,7 @@ "output_type": "stream", "text": [ "截面 MAD 去极值处理完成。\n", - "feature_columns: ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "feature_columns: ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'is_hot_concept_stock', 'concept_rank_pct_chg', 'concept_rank_turnover_rate', 'concept_rank_volume_ratio', 'holder_net_change_sum_10d', 'holder_increase_days_10d', 'holder_decrease_days_10d', 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", "df最小日期: 2019-01-02\n", "df最大日期: 2025-05-30\n", "1091062\n", @@ -1424,6 +1031,8 @@ } ], "source": [ + "from main.utils.data_process import *\n", + "\n", "split_date = '2023-01-01'\n", "train_data = df[filter_index & (df['trade_date'] <= split_date) & (df['trade_date'] >= '2020-01-01')].groupby(\n", " 'trade_date', group_keys=False).apply(lambda x: x.nsmallest(1500, 'total_mv'))\n", @@ -1442,67 +1051,17 @@ "\n", "train_data, test_data = train_data.replace([np.inf, -np.inf], np.nan), test_data.replace([np.inf, -np.inf], np.nan)\n", "\n", - "train_data['label'] = train_data.groupby('trade_date', group_keys=False)['future_return'].transform(\n", - " lambda x: pd.qcut(x, q=100, labels=False, duplicates='drop')\n", - ")\n", - "test_data['label'] = test_data.groupby('trade_date', group_keys=False)['future_return'].transform(\n", - " lambda x: pd.qcut(x, q=100, labels=False, duplicates='drop')\n", - ")\n", + "# train_data['label'] = train_data.groupby('trade_date', group_keys=False)['future_return'].transform(\n", + "# lambda x: pd.qcut(x, q=100, labels=False, duplicates='drop')\n", + "# )\n", + "# test_data['label'] = test_data.groupby('trade_date', group_keys=False)['future_return'].transform(\n", + "# lambda x: pd.qcut(x, q=100, labels=False, duplicates='drop')\n", + "# )\n", "\n", "# feature_columns_new = feature_columns[:]\n", "# train_data, _ = create_deviation_within_dates(train_data, [col for col in feature_columns if col in train_data.columns])\n", "# test_data, _ = create_deviation_within_dates(test_data, [col for col in feature_columns if col in train_data.columns])\n", "\n", - "# feature_columns = [\n", - "# 'undist_profit_ps', \n", - "# 'AR_BR',\n", - "# 'pe_ttm',\n", - "# 'alpha_22_improved', \n", - "# 'alpha_003', \n", - "# 'alpha_007', \n", - "# 'alpha_013', \n", - "# 'cat_up_limit', \n", - "# 'cat_down_limit', \n", - "# 'up_limit_count_10d', \n", - "# 'down_limit_count_10d', \n", - "# 'consecutive_up_limit', \n", - "# 'vol_break', \n", - "# 'weight_roc5', \n", - "# 'price_cost_divergence', \n", - "# 'smallcap_concentration', \n", - "# 'cost_stability', \n", - "# 'high_cost_break_days', \n", - "# 'liquidity_risk', \n", - "# 'turnover_std', \n", - "# 'mv_volatility', \n", - "# 'volume_growth', \n", - "# 'mv_growth', \n", - "# 'lg_flow_mom_corr_20_60', \n", - "# 'lg_flow_accel', \n", - "# 'profit_pressure', \n", - "# 'underwater_resistance', \n", - "# 'cost_conc_std_20', \n", - "# 'profit_decay_20', \n", - "# 'vol_amp_loss_20', \n", - "# 'vol_drop_profit_cnt_5', \n", - "# 'lg_flow_vol_interact_20', \n", - "# 'cost_break_confirm_cnt_5', \n", - "# 'atr_norm_channel_pos_14', \n", - "# 'turnover_diff_skew_20', \n", - "# 'lg_sm_flow_diverge_20', \n", - "# 'pullback_strong_20_20', \n", - "# 'vol_wgt_hist_pos_20', \n", - "# 'vol_adj_roc_20',\n", - "# 'cashflow_to_ev_factor',\n", - "# 'ocfps',\n", - "# 'book_to_price_ratio',\n", - "# 'turnover_rate_mean_5',\n", - "# 'variance_20',\n", - "# 'bbi_ratio_factor'\n", - "# ]\n", - "# feature_columns = [col for col in feature_columns if col in train_data.columns]\n", - "# feature_columns = [col for col in feature_columns if not col.startswith('_')]\n", - "\n", "numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns\n", "numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", "# feature_columns = select_top_features_by_rankic(df, numeric_columns, n=10)\n", @@ -1526,12 +1085,12 @@ "cs_mad_filter(train_data, transform_feature_columns)\n", "# print('中性化')\n", "# cs_neutralize_industry_cap(train_data, transform_feature_columns)\n", - "# print('标准化')\n", - "# cs_zscore_standardize(train_data, transform_feature_columns)\n", + "print('标准化')\n", + "cs_zscore_standardize(train_data, transform_feature_columns)\n", "\n", "cs_mad_filter(test_data, transform_feature_columns)\n", "# cs_neutralize_industry_cap(test_data, transform_feature_columns)\n", - "# cs_zscore_standardize(test_data, transform_feature_columns)\n", + "cs_zscore_standardize(test_data, transform_feature_columns)\n", "\n", "mad_filter_feature_columns = [col for col in feature_columns if col not in transform_feature_columns and not col.startswith('cat') and col in train_data.columns]\n", "cs_mad_filter(train_data, mad_filter_feature_columns)\n", @@ -1560,7 +1119,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": null, "id": "3ff2d1c5", "metadata": {}, "outputs": [], @@ -1673,15 +1232,15 @@ " 'label_gain': [gain * gain for gain in label_gain],\n", " 'objective': 'lambdarank',\n", " 'metric': 'ndcg',\n", - " 'learning_rate': 0.05,\n", - " 'num_leaves': 1024,\n", - " 'min_data_in_leaf': 256,\n", + " 'learning_rate': 0.01,\n", + " # 'num_leaves': 1024,\n", + " # 'min_data_in_leaf': 256,\n", " # 'max_depth': 10,\n", - " 'max_bin': 1024,\n", + " # 'max_bin': 1024,\n", " 'feature_fraction': 0.5,\n", " 'bagging_fraction': 0.5,\n", " 'bagging_freq': 5,\n", - " 'lambda_l1': 5,\n", + " # 'lambda_l1': 1,\n", " 'lambda_l2': 50,\n", " 'boosting': 'gbdt',\n", " 'verbosity': -1,\n", @@ -1690,10 +1249,10 @@ " 'ndcg_at': '5',\n", " 'quant_train_renew_leaf': True,\n", " 'lambdarank_truncation_level': 10,\n", - " 'lambdarank_position_bias_regularization': 1,\n", + " # 'lambdarank_position_bias_regularization': 1,\n", " 'seed': 7\n", " }\n", - " feature_contri = [2 if feat.startswith('act_factor') or 'buy' in feat or 'sell' in feat else 1 for feat in feature_columns]\n", + " feature_contri = [2 if 'concept' in feat else 1 for feat in feature_columns]\n", " params['feature_contri'] = feature_contri\n", "\n", " train_groups = train_data_split.groupby('trade_date').size().tolist()\n", @@ -1714,7 +1273,7 @@ " evals = {}\n", " callbacks = [lgb.log_evaluation(period=1000),\n", " lgb.callback.record_evaluation(evals),\n", - " # lgb.early_stopping(300, first_metric_only=False)\n", + " lgb.early_stopping(300, first_metric_only=False)\n", " ]\n", " # 训练模型\n", " model = lgb.train(\n", @@ -1759,7 +1318,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 1, "id": "c6eb5cd4-e714-420a-ac48-39af3e11ee81", "metadata": { "ExecuteTime": { @@ -1769,47 +1328,15 @@ }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "train data size: 1091062\n", - " ts_code trade_date log_circ_mv\n", - "0 600306.SH 2020-01-02 11.552040\n", - "1 603269.SH 2020-01-02 11.324801\n", - "2 002633.SZ 2020-01-02 11.759023\n", - "3 603991.SH 2020-01-02 11.181150\n", - "4 000691.SZ 2020-01-02 11.677910\n", - "... ... ... ...\n", - "1091057 603533.SH 2022-12-30 13.362893\n", - "1091058 603416.SH 2022-12-30 13.364553\n", - "1091059 002277.SZ 2022-12-30 13.364740\n", - "1091060 002140.SZ 2022-12-30 13.086924\n", - "1091061 002374.SZ 2022-12-30 13.347147\n", - "\n", - "[1091062 rows x 3 columns]\n", - "原始样本数: 1091062, 去除标签为空后样本数: 1091062\n", - "[1000]\ttrain's ndcg@5: 0.667175\tvalid's ndcg@5: 0.357008\n" + "ename": "NameError", + "evalue": "name 'gc' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[1]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mgc\u001b[49m.collect()\n\u001b[32m 3\u001b[39m use_pca = \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[32m 4\u001b[39m \u001b[38;5;28mtype\u001b[39m = \u001b[33m'\u001b[39m\u001b[33mlight\u001b[39m\u001b[33m'\u001b[39m\n", + "\u001b[31mNameError\u001b[39m: name 'gc' is not defined" ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvAAAAHHCAYAAADZMWzyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAA+ktJREFUeJzs3XlcTun/+PHX3b5TYSoiS3YS2bcQKjKWGesgYxlLRozEGFRj3xnLzBhkD2OEkSXGMmPPYOyGkRgZy2dIMmm5f3/063zdWlRK7tv7+XjcD53rXOc67/dd6rqvc53rqNRqtRohhBBCCCGEVtAr7ACEEEIIIYQQOScdeCGEEEIIIbSIdOCFEEIIIYTQItKBF0IIIYQQQotIB14IIYQQQggtIh14IYQQQgghtIh04IUQQgghhNAi0oEXQgghhBBCi0gHXgghhBBCCC0iHXghhBCiEIWGhqJSqYiOji7sUIQQWkI68EIIId6q9A5rZq+xY8cWyDmPHj1KUFAQjx8/LpD232cJCQkEBQVx8ODBwg5FiPeGQWEHIIQQ4v0UEhJC2bJlNcqqV69eIOc6evQowcHB+Pr6UrRo0QI5R1717t2b7t27Y2xsXNih5ElCQgLBwcEAuLu7F24wQrwnpAMvhBCiUHh5eeHm5lbYYbyRZ8+eYW5u/kZt6Ovro6+vn08RvT2pqam8ePGisMMQ4r0kU2iEEEK8k3bt2kXTpk0xNzfH0tKSdu3acfHiRY06f/zxB76+vpQrVw4TExPs7Oz49NNPefTokVInKCiIgIAAAMqWLatM14mOjiY6OhqVSkVoaGiG86tUKoKCgjTaUalUXLp0iZ49e2JtbU2TJk2U/WvXrqVOnTqYmppiY2ND9+7duX379mvzzGwOvJOTE+3bt+fgwYO4ublhampKjRo1lGkqP/30EzVq1MDExIQ6depw5swZjTZ9fX2xsLDgr7/+om3btpibm+Pg4EBISAhqtVqj7rNnz/jiiy9wdHTE2NiYSpUqMXv27Az1VCoVfn5+rFu3jmrVqmFsbMy3335L8eLFAQgODlbe2/T3LSffn5ff2+vXrytXSYoUKUK/fv1ISEjI8J6tXbuWevXqYWZmhrW1Nc2aNWPv3r0adXLy8yOEtpIReCGEEIXiyZMnPHz4UKOsWLFiAKxZs4a+ffvStm1bZsyYQUJCAkuXLqVJkyacOXMGJycnACIjI/nrr7/o168fdnZ2XLx4ke+//56LFy9y/PhxVCoVnTt35tq1a2zYsIF58+Yp5yhevDgPHjzIddwff/wxzs7OTJ06VenkTpkyhQkTJtC1a1cGDBjAgwcP+Oabb2jWrBlnzpzJ07Sd69ev07NnTz777DM++eQTZs+ejY+PD99++y1ffvklQ4cOBWDatGl07dqVq1evoqf3f+NyKSkpeHp60qBBA2bOnMnu3buZNGkSycnJhISEAKBWq+nQoQMHDhygf//+1KpViz179hAQEMDff//NvHnzNGL65Zdf2LRpE35+fhQrVgwXFxeWLl3KkCFD6NSpE507dwagZs2aQM6+Py/r2rUrZcuWZdq0afz+++/88MMPlChRghkzZih1goODCQoKolGjRoSEhGBkZMSJEyf45ZdfaNOmDZDznx8htJZaCCGEeItWrlypBjJ9qdVq9dOnT9VFixZVDxw4UOO4e/fuqYsUKaJRnpCQkKH9DRs2qAH14cOHlbJZs2apAfXNmzc16t68eVMNqFeuXJmhHUA9adIkZXvSpElqQN2jRw+NetHR0Wp9fX31lClTNMrPnz+vNjAwyFCe1fvxcmxlypRRA+qjR48qZXv27FEDalNTU/WtW7eU8u+++04NqA8cOKCU9e3bVw2ohw8frpSlpqaq27VrpzYyMlI/ePBArVar1eHh4WpAPXnyZI2YPvroI7VKpVJfv35d4/3Q09NTX7x4UaPugwcPMrxX6XL6/Ul/bz/99FONup06dVLb2toq23/++adaT09P3alTJ3VKSopG3dTUVLVanbufHyG0lUyhEUIIUSgWL15MZGSkxgvSRm0fP35Mjx49ePjwofLS19enfv36HDhwQGnD1NRU+fq///7j4cOHNGjQAIDff/+9QOIePHiwxvZPP/1EamoqXbt21YjXzs4OZ2dnjXhzo2rVqjRs2FDZrl+/PgAtW7akdOnSGcr/+uuvDG34+fkpX6dPgXnx4gX79u0DICIiAn19fT7//HON47744gvUajW7du3SKG/evDlVq1bNcQ65/f68+t42bdqUR48eERcXB0B4eDipqalMnDhR42pDen6Qu58fIbSVTKERQghRKOrVq5fpTax//vknkNZRzYyVlZXy9f/+9z+Cg4MJCwvj/v37GvWePHmSj9H+n1dXzvnzzz9Rq9U4OztnWt/Q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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ @@ -1818,15 +1345,23 @@ "\n", "use_pca = False\n", "type = 'light'\n", + "\n", + "train_data['label2'] = train_data.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(1000, 'total_mv'))['future_return'].transform(\n", + " lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n", + ")\n", + "test_data['label2'] = test_data.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(1000, 'total_mv'))['future_return'].transform(\n", + " lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n", + ")\n", + "\n", "# feature_contri = [2 if feat.startswith('act_factor') or 'buy' in feat or 'sell' in feat else 1 for feat in feature_columns]\n", "# light_params['feature_contri'] = feature_contri\n", "# print(f'feature_contri: {feature_contri}')\n", "model, scaler, pca = train_model(train_data\n", " .dropna(subset=['label']).groupby('trade_date', group_keys=False)\n", - " .apply(lambda x: x.nsmallest(3000, 'total_mv'))\n", + " .apply(lambda x: x.nsmallest(1000, 'total_mv'))\n", " .merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", " .merge(index_data, on='trade_date', how='left'), \n", - " feature_columns, type=type, target_column='label')\n" + " feature_columns, type=type, target_column='label2')\n" ] }, { @@ -1841,7 +1376,7 @@ }, "outputs": [], "source": [ - "score_df = test_data.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(3000, 'total_mv'))\n", + "score_df = test_data.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(1000, 'total_mv'))\n", "# score_df = fill_nan_with_daily_median(score_df, ['pe_ttm'])\n", "# score_df = score_df[score_df['pe_ttm'] > 0]\n", "score_df = score_df.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", @@ -1871,6 +1406,24 @@ "save_df[['trade_date', 'score', 'ts_code']].to_csv('predictions_test.tsv', index=False)\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "fed2d6c3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-01-03 00:00:00\n" + ] + } + ], + "source": [ + "print(test_data['trade_date'].min())" + ] + }, { "cell_type": "code", "execution_count": null, @@ -1888,72 +1441,85 @@ "b'\\x80\\x04\\x95\\xbf\\x04\\x01\\x00\\x00\\x00\\x00\\x00\\x8c\\x11pandas.'\n", "\n", "从 Redis 加载的 DataFrame (使用 Pickle):\n", - " index ts_code trade_date open close high low vol \\\n", - "4 25 002802.SZ 2023-01-03 21.53 22.14 22.35 21.31 15974.43 \n", - "3 20 600235.SH 2023-01-03 12.23 12.41 12.50 12.23 35791.00 \n", - "2 13 002691.SZ 2023-01-03 9.13 9.32 9.37 9.13 35566.80 \n", - "1 35 603779.SH 2023-01-03 9.74 9.88 10.16 9.69 78641.45 \n", - "0 131 600228.SH 2023-01-03 15.68 15.75 15.79 15.60 17076.00 \n", - "... ... ... ... ... ... ... ... ... \n", - "2904 87098 000931.SZ 2025-05-30 8.02 7.96 8.13 7.92 170963.38 \n", - "2903 87001 605122.SH 2025-05-30 16.86 16.73 17.11 16.68 20146.40 \n", - "2902 87041 002942.SZ 2025-05-30 24.10 23.95 24.34 23.84 10821.00 \n", - "2901 87122 603170.SH 2025-05-30 14.69 14.34 14.83 14.32 26536.80 \n", - "2900 86987 603177.SH 2025-05-30 8.72 8.55 8.77 8.49 25875.00 \n", + " index ts_code trade_date open close high low vol \\\n", + "4 25 600202.SH 2023-01-03 25.05 25.80 25.90 24.85 -0.393826 \n", + "3 30 603828.SH 2023-01-03 15.09 15.55 15.78 15.09 -0.100351 \n", + "2 0 600768.SH 2023-01-03 30.72 31.55 31.62 30.49 -0.912596 \n", + "1 10 600883.SH 2023-01-03 34.60 35.08 35.27 34.36 -0.868511 \n", + "0 37 002247.SZ 2023-01-03 16.15 16.80 16.87 16.09 0.514578 \n", + "... ... ... ... ... ... ... ... ... \n", + "2904 58029 603778.SH 2025-05-30 20.39 19.95 20.45 19.89 -0.489064 \n", + "2903 58040 002775.SZ 2025-05-30 17.84 17.55 17.84 17.41 -0.705858 \n", + "2902 58001 002652.SZ 2025-05-30 15.36 15.11 15.41 14.95 -0.183952 \n", + "2901 58041 002687.SZ 2025-05-30 31.23 30.75 31.23 30.61 -0.662998 \n", + "2900 58059 002753.SZ 2025-05-30 25.72 25.38 25.76 25.27 -0.865006 \n", "\n", - " pct_chg amount ... 000905.SH_up_ratio_20d 399006.SZ_up_ratio_20d \\\n", - "4 3.12 23729.134 ... 0.3 0.40 \n", - "3 0.73 20011.747 ... 0.3 0.40 \n", - "2 2.08 19174.296 ... 0.3 0.40 \n", - "1 1.65 53043.254 ... 0.3 0.40 \n", - "0 1.42 12366.664 ... 0.3 0.40 \n", - "... ... ... ... ... ... \n", - "2904 -0.38 89186.130 ... 0.6 0.45 \n", - "2903 -1.18 23723.010 ... 0.6 0.45 \n", - "2902 -1.07 18204.020 ... 0.6 0.45 \n", - "2901 -2.45 36665.356 ... 0.6 0.45 \n", - "2900 -1.38 21916.553 ... 0.6 0.45 \n", + " pct_chg amount ... 000905.SH_up_ratio_20d \\\n", + "4 0.634444 28798.328 ... 0.3 \n", + "3 0.624861 26149.008 ... 0.3 \n", + "2 0.342168 15832.327 ... 0.3 \n", + "1 -0.136973 14886.570 ... 0.3 \n", + "0 0.715898 31834.487 ... 0.3 \n", + "... ... ... ... ... \n", + "2904 -0.167798 23633.664 ... 0.6 \n", + "2903 0.241111 19025.635 ... 0.6 \n", + "2902 -0.045125 32385.927 ... 0.6 \n", + "2901 0.210443 24919.298 ... 0.6 \n", + "2900 0.031546 22718.273 ... 0.6 \n", "\n", - " 000852.SH_volatility 000905.SH_volatility 399006.SZ_volatility \\\n", - "4 1.036997 0.828596 0.935322 \n", - "3 1.036997 0.828596 0.935322 \n", - "2 1.036997 0.828596 0.935322 \n", - "1 1.036997 0.828596 0.935322 \n", - "0 1.036997 0.828596 0.935322 \n", - "... ... ... ... \n", - "2904 1.089861 0.850444 1.195355 \n", - "2903 1.089861 0.850444 1.195355 \n", - "2902 1.089861 0.850444 1.195355 \n", - "2901 1.089861 0.850444 1.195355 \n", - "2900 1.089861 0.850444 1.195355 \n", + " 399006.SZ_up_ratio_20d 000852.SH_volatility 000905.SH_volatility \\\n", + "4 0.40 1.036997 0.828596 \n", + "3 0.40 1.036997 0.828596 \n", + "2 0.40 1.036997 0.828596 \n", + "1 0.40 1.036997 0.828596 \n", + "0 0.40 1.036997 0.828596 \n", + "... ... ... ... \n", + "2904 0.45 1.089861 0.850444 \n", + "2903 0.45 1.089861 0.850444 \n", + "2902 0.45 1.089861 0.850444 \n", + "2901 0.45 1.089861 0.850444 \n", + "2900 0.45 1.089861 0.850444 \n", "\n", - " 000852.SH_volume_change_rate 000905.SH_volume_change_rate \\\n", - "4 5.203088 -0.750721 \n", - "3 5.203088 -0.750721 \n", - "2 5.203088 -0.750721 \n", - "1 5.203088 -0.750721 \n", - "0 5.203088 -0.750721 \n", - "... ... ... \n", - "2904 -2.039466 -12.002493 \n", - "2903 -2.039466 -12.002493 \n", - "2902 -2.039466 -12.002493 \n", - "2901 -2.039466 -12.002493 \n", - "2900 -2.039466 -12.002493 \n", + " 399006.SZ_volatility 000852.SH_volume_change_rate \\\n", + "4 0.935322 5.203088 \n", + "3 0.935322 5.203088 \n", + "2 0.935322 5.203088 \n", + "1 0.935322 5.203088 \n", + "0 0.935322 5.203088 \n", + "... ... ... \n", + "2904 1.195355 -2.039466 \n", + "2903 1.195355 -2.039466 \n", + "2902 1.195355 -2.039466 \n", + "2901 1.195355 -2.039466 \n", + "2900 1.195355 -2.039466 \n", "\n", - " 399006.SZ_volume_change_rate score score_ranks \n", - "4 8.827360 0.391351 1496.0 \n", - "3 8.827360 0.410662 1497.0 \n", - "2 8.827360 0.470817 1498.0 \n", - "1 8.827360 0.567032 1499.0 \n", - "0 8.827360 0.596280 1500.0 \n", - "... ... ... ... \n", - "2904 5.078672 0.707379 1490.0 \n", - "2903 5.078672 0.769014 1491.0 \n", - "2902 5.078672 0.874366 1492.0 \n", - "2901 5.078672 0.975826 1493.0 \n", - "2900 5.078672 1.072646 1494.0 \n", + " 000905.SH_volume_change_rate 399006.SZ_volume_change_rate score \\\n", + "4 -0.750721 8.827360 0.141602 \n", + "3 -0.750721 8.827360 0.145938 \n", + "2 -0.750721 8.827360 0.169856 \n", + "1 -0.750721 8.827360 0.174660 \n", + "0 -0.750721 8.827360 0.200525 \n", + "... ... ... ... \n", + "2904 -12.002493 5.078672 0.269821 \n", + "2903 -12.002493 5.078672 0.273371 \n", + "2902 -12.002493 5.078672 0.274304 \n", + "2901 -12.002493 5.078672 0.291169 \n", + "2900 -12.002493 5.078672 0.312279 \n", "\n", - "[2905 rows x 241 columns]\n", + " score_ranks \n", + "4 996.0 \n", + "3 997.0 \n", + "2 998.0 \n", + "1 999.0 \n", + "0 1000.0 \n", + "... ... \n", + "2904 996.0 \n", + "2903 997.0 \n", + "2902 998.0 \n", + "2901 999.0 \n", + "2900 1000.0 \n", + "\n", + "[2905 rows x 252 columns]\n", "\n", "验证成功:原始 DataFrame 和从 Redis 加载的 DataFrame 一致。\n", "\n", @@ -2027,8 +1593,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "200\n", - "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n" + "208\n", + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'is_hot_concept_stock', 'concept_rank_pct_chg', 'concept_rank_turnover_rate', 'concept_rank_volume_ratio', 'holder_net_change_sum_10d', 'holder_increase_days_10d', 'holder_decrease_days_10d', 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n" ] } ], @@ -2047,22 +1613,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "警告: DataFrame 中没有 'group_id' 列。假设整个 DataFrame 是一个需要排序的组。\n" - ] - }, - { - "ename": "AttributeError", - "evalue": "`np.asfarray` was removed in the NumPy 2.0 release. Use `np.asarray` with a proper dtype instead.", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[105]\u001b[39m\u001b[32m, line 52\u001b[39m\n\u001b[32m 48\u001b[39m avg_ndcg = {k: np.mean(v) \u001b[38;5;28;01mif\u001b[39;00m v \u001b[38;5;28;01melse\u001b[39;00m np.nan \u001b[38;5;28;01mfor\u001b[39;00m k, v \u001b[38;5;129;01min\u001b[39;00m ndcg_scores.items()}\n\u001b[32m 49\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m avg_ndcg\n\u001b[32m---> \u001b[39m\u001b[32m52\u001b[39m ndcg_results_single_group = \u001b[43mcalculate_ndcg\u001b[49m\u001b[43m(\u001b[49m\u001b[43mscore_df\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mscore_col\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mscore\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlabel_col\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mlabel\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mk_values\u001b[49m\u001b[43m=\u001b[49m\u001b[43m[\u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m3\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[32;43m5\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgroup_id\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[32m 53\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33mNDCG 结果\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 54\u001b[39m \u001b[38;5;28mprint\u001b[39m(ndcg_results_single_group)\n", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[105]\u001b[39m\u001b[32m, line 40\u001b[39m, in \u001b[36mcalculate_ndcg\u001b[39m\u001b[34m(df, score_col, label_col, group_id, k_values)\u001b[39m\n\u001b[32m 38\u001b[39m relevant_labels = group_df[label_col].values\n\u001b[32m 39\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m k \u001b[38;5;129;01min\u001b[39;00m k_values:\n\u001b[32m---> \u001b[39m\u001b[32m40\u001b[39m ndcg_scores[\u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33mndcg@\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mk\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m].append(\u001b[43mndcg_at_k\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrelevant_labels\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mk\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[32m 41\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 42\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m _, group_df \u001b[38;5;129;01min\u001b[39;00m df.groupby(group_id):\n", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[105]\u001b[39m\u001b[32m, line 27\u001b[39m, in \u001b[36mcalculate_ndcg..ndcg_at_k\u001b[39m\u001b[34m(r, k)\u001b[39m\n\u001b[32m 26\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mndcg_at_k\u001b[39m(r, k):\n\u001b[32m---> \u001b[39m\u001b[32m27\u001b[39m dcg_max = \u001b[43mdcg_at_k\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43msorted\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreverse\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mk\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 28\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m dcg_max:\n\u001b[32m 29\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[32m0.\u001b[39m\n", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[105]\u001b[39m\u001b[32m, line 23\u001b[39m, in \u001b[36mcalculate_ndcg..dcg_at_k\u001b[39m\u001b[34m(r, k)\u001b[39m\n\u001b[32m 22\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mdcg_at_k\u001b[39m(r, k):\n\u001b[32m---> \u001b[39m\u001b[32m23\u001b[39m r = \u001b[43mnp\u001b[49m\u001b[43m.\u001b[49m\u001b[43masfarray\u001b[49m(r)[:k] \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(r) > \u001b[32m0\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m np.zeros(k)\n\u001b[32m 24\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m np.sum(r / np.log2(np.arange(\u001b[32m2\u001b[39m, r.size + \u001b[32m2\u001b[39m)))\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/numpy/__init__.py:400\u001b[39m, in \u001b[36m__getattr__\u001b[39m\u001b[34m(attr)\u001b[39m\n\u001b[32m 397\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(__former_attrs__[attr], name=\u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 399\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;129;01min\u001b[39;00m __expired_attributes__:\n\u001b[32m--> \u001b[39m\u001b[32m400\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(\n\u001b[32m 401\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33m`np.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mattr\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m` was removed in the NumPy 2.0 release. \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 402\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m__expired_attributes__[attr]\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m,\n\u001b[32m 403\u001b[39m name=\u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 404\u001b[39m )\n\u001b[32m 406\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m attr == \u001b[33m\"\u001b[39m\u001b[33mchararray\u001b[39m\u001b[33m\"\u001b[39m:\n\u001b[32m 407\u001b[39m warnings.warn(\n\u001b[32m 408\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m`np.chararray` is deprecated and will be removed from \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 409\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mthe main namespace in the future. Use an array with a string \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 410\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mor bytes dtype instead.\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;167;01mDeprecationWarning\u001b[39;00m, stacklevel=\u001b[32m2\u001b[39m)\n", - "\u001b[31mAttributeError\u001b[39m: `np.asfarray` was removed in the NumPy 2.0 release. Use `np.asarray` with a proper dtype instead." + "警告: DataFrame 中没有 'group_id' 列。假设整个 DataFrame 是一个需要排序的组。\n", + "\n", + "NDCG 结果\n", + "{'ndcg@1': np.float64(nan), 'ndcg@3': np.float64(nan), 'ndcg@5': np.float64(nan)}\n" ] } ], @@ -2089,7 +1643,7 @@ " ndcg_scores = {f'ndcg@{k}': [] for k in k_values}\n", "\n", " def dcg_at_k(r, k):\n", - " r = np.asfarray(r)[:k] if len(r) > 0 else np.zeros(k)\n", + " r = np.asarray(r)[:k] if len(r) > 0 else np.zeros(k)\n", " return np.sum(r / np.log2(np.arange(2, r.size + 2)))\n", "\n", " def ndcg_at_k(r, k):\n", @@ -2134,84 +1688,84 @@ "output_type": "stream", "text": [ " ts_code trade_date open close high low vol pct_chg \\\n", - "1626778 002652.SZ 2019-01-02 19.59 19.64 19.89 19.28 20196.79 1.03 \n", - "1626779 002652.SZ 2019-01-03 19.74 19.44 19.84 19.33 15731.99 -1.02 \n", - "1626780 002652.SZ 2019-01-04 19.33 19.94 19.99 19.08 21099.93 2.57 \n", - "1626781 002652.SZ 2019-01-07 20.04 21.95 21.95 20.04 83534.19 10.08 \n", - "1626782 002652.SZ 2019-01-08 23.21 21.65 23.87 21.65 149377.97 -1.37 \n", + "1632028 002652.SZ 2019-01-02 19.59 19.64 19.89 19.28 20196.79 1.03 \n", + "1632029 002652.SZ 2019-01-03 19.74 19.44 19.84 19.33 15731.99 -1.02 \n", + "1632030 002652.SZ 2019-01-04 19.33 19.94 19.99 19.08 21099.93 2.57 \n", + "1632031 002652.SZ 2019-01-07 20.04 21.95 21.95 20.04 83534.19 10.08 \n", + "1632032 002652.SZ 2019-01-08 23.21 21.65 23.87 21.65 149377.97 -1.37 \n", "... ... ... ... ... ... ... ... ... \n", - "1628321 002652.SZ 2025-05-19 15.05 15.05 15.21 14.80 142648.00 1.69 \n", - "1628322 002652.SZ 2025-05-20 15.11 15.31 15.36 14.85 131075.23 1.73 \n", - "1628323 002652.SZ 2025-05-21 15.51 15.26 15.56 15.11 147109.00 -0.33 \n", - "1628324 002652.SZ 2025-05-22 15.11 14.95 15.46 14.75 129187.20 -2.03 \n", - "1628325 002652.SZ 2025-05-23 14.95 14.70 15.11 14.70 139145.40 -1.67 \n", + "1633576 002652.SZ 2025-05-26 14.75 14.85 15.11 14.55 99560.80 1.02 \n", + "1633577 002652.SZ 2025-05-27 14.90 15.00 15.11 14.70 101184.00 1.01 \n", + "1633578 002652.SZ 2025-05-28 15.11 14.85 15.16 14.80 75859.20 -1.00 \n", + "1633579 002652.SZ 2025-05-29 15.00 15.36 15.36 14.85 126044.40 3.43 \n", + "1633580 002652.SZ 2025-05-30 15.36 15.11 15.41 14.95 107732.00 -1.63 \n", "\n", " amount turnover_rate ... cs_rank_vol_x_profit_margin \\\n", - "1626778 7867.047 0.3964 ... 0.608839 \n", - "1626779 6121.460 0.3088 ... 0.586710 \n", - "1626780 8245.083 0.4141 ... 0.682847 \n", - "1626781 35514.117 1.6394 ... 0.987591 \n", - "1626782 67160.354 2.9317 ... 0.765693 \n", + "1632028 7867.047 0.3964 ... 0.608839 \n", + "1632029 6121.460 0.3088 ... 0.586710 \n", + "1632030 8245.083 0.4141 ... 0.682847 \n", + "1632031 35514.117 1.6394 ... 0.987591 \n", + "1632032 67160.354 2.9317 ... 0.765693 \n", "... ... ... ... ... \n", - "1628321 42651.655 2.7857 ... 0.758644 \n", - "1628322 39438.290 2.5597 ... 0.834661 \n", - "1628323 44703.816 2.8729 ... 0.365327 \n", - "1628324 38679.608 2.5229 ... 0.810362 \n", - "1628325 41151.946 2.7173 ... 0.738293 \n", + "1633576 29428.560 1.9443 ... 0.652159 \n", + "1633577 30112.801 1.9760 ... 0.657694 \n", + "1633578 22507.876 1.4814 ... 0.664673 \n", + "1633579 38068.857 2.4615 ... 0.921236 \n", + "1633580 32385.927 2.1039 ... 0.702990 \n", "\n", " cs_rank_lg_flow_price_concordance cs_rank_turnover_per_winner \\\n", - "1626778 0.203142 0.864865 \n", - "1626779 0.156684 0.763417 \n", - "1626780 0.184009 0.660949 \n", - "1626781 0.734940 0.700000 \n", - "1626782 0.874042 0.914234 \n", + "1632028 0.203142 0.864865 \n", + "1632029 0.156684 0.763417 \n", + "1632030 0.184009 0.660949 \n", + "1632031 0.734940 0.700000 \n", + "1632032 0.874042 0.914234 \n", "... ... ... \n", - "1628321 0.106051 0.544548 \n", - "1628322 0.202523 0.478420 \n", - "1628323 0.580870 0.520757 \n", - "1628324 0.808369 0.476918 \n", - "1628325 0.617735 0.404517 \n", + "1633576 0.122259 0.394684 \n", + "1633577 0.092722 0.414756 \n", + "1633578 0.684945 0.323363 \n", + "1633579 0.295779 0.390828 \n", + "1633580 0.705316 0.419934 \n", "\n", " cs_rank_ind_cap_neutral_pe cs_rank_volume_ratio \\\n", - "1626778 NaN 0.646930 \n", - "1626779 NaN 0.251279 \n", - "1626780 NaN 0.311724 \n", - "1626781 NaN 0.988313 \n", - "1626782 NaN 0.990142 \n", + "1632028 NaN 0.646930 \n", + "1632029 NaN 0.251279 \n", + "1632030 NaN 0.311724 \n", + "1632031 NaN 0.988313 \n", + "1632032 NaN 0.990142 \n", "... ... ... \n", - "1628321 NaN 0.695645 \n", - "1628322 NaN 0.542497 \n", - "1628323 NaN 0.678180 \n", - "1628324 NaN 0.524743 \n", - "1628325 NaN 0.585852 \n", + "1633576 NaN 0.400997 \n", + "1633577 NaN 0.450150 \n", + "1633578 NaN 0.199236 \n", + "1633579 NaN 0.640744 \n", + "1633580 NaN 0.537542 \n", "\n", " cs_rank_elg_buy_sell_sm_ratio cs_rank_cost_dist_vol_ratio \\\n", - "1626778 0.341855 0.678941 \n", - "1626779 0.318912 0.402916 \n", - "1626780 0.260036 0.460713 \n", - "1626781 0.796350 0.988501 \n", - "1626782 0.598905 0.991571 \n", + "1632028 0.341855 0.678941 \n", + "1632029 0.318912 0.402916 \n", + "1632030 0.260036 0.460713 \n", + "1632031 0.796350 0.988501 \n", + "1632032 0.598905 0.991571 \n", "... ... ... \n", - "1628321 0.287899 0.788896 \n", - "1628322 0.116534 0.705843 \n", - "1628323 0.492860 0.783793 \n", - "1628324 0.130521 0.696446 \n", - "1628325 0.134175 0.735636 \n", + "1633576 0.153987 0.620930 \n", + "1633577 0.156198 0.643403 \n", + "1633578 0.153373 0.484546 \n", + "1633579 0.623795 0.764374 \n", + "1633580 0.133056 0.703987 \n", "\n", " cs_rank_size future_return label \n", - "1626778 0.258948 0.092159 45.0 \n", - "1626779 0.258123 0.075103 41.0 \n", - "1626780 0.257664 0.058175 41.0 \n", - "1626781 0.290146 -0.034169 4.0 \n", - "1626782 0.282482 -0.023095 4.0 \n", + "1632028 0.258948 0.158859 40.0 \n", + "1632029 0.258123 0.136831 37.0 \n", + "1632030 0.257664 0.106319 39.0 \n", + "1632031 0.290146 -0.072893 4.0 \n", + "1632032 0.282482 -0.057737 5.0 \n", "... ... ... ... \n", - "1628321 0.032912 NaN NaN \n", - "1628322 0.034861 NaN NaN \n", - "1628323 0.035204 NaN NaN \n", - "1628324 0.034208 NaN NaN \n", - "1628325 0.032547 NaN NaN \n", + "1633576 0.032226 NaN NaN \n", + "1633577 0.032901 NaN NaN \n", + "1633578 0.032237 NaN NaN \n", + "1633579 0.034231 NaN NaN \n", + "1633580 0.033887 NaN NaN \n", "\n", - "[1548 rows x 190 columns]\n" + "[1553 rows x 200 columns]\n" ] } ], diff --git a/main/train/Rank2_polars.ipynb b/main/train/Rank2_polars.ipynb new file mode 100644 index 0000000..5481bf0 --- /dev/null +++ b/main/train/Rank2_polars.ipynb @@ -0,0 +1,2473 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "79a7758178bafdd3", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:46:06.987506Z", + "start_time": "2025-04-03T12:46:06.259551Z" + }, + "jupyter": { + "source_hidden": true + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/mnt/d/PyProject/NewStock\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "import gc\n", + "import os\n", + "import sys\n", + "sys.path.append('/mnt/d/PyProject/NewStock/')\n", + "print(os.getcwd())\n", + "import pandas as pd\n", + "from main.factor.factor import get_rolling_factor, get_simple_factor\n", + "from main.utils.factor import read_industry_data\n", + "from main.utils.factor_processor import calculate_score\n", + "from main.utils.utils import read_and_merge_h5_data, merge_with_industry_data\n", + "\n", + "import warnings\n", + "\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a79cafb06a7e0e43", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:00.212859Z", + "start_time": "2025-04-03T12:46:06.998047Z" + }, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "daily data\n", + "daily basic\n", + "inner merge on ['ts_code', 'trade_date']\n", + "stk limit\n", + "left merge on ['ts_code', 'trade_date']\n", + "money flow\n", + "left merge on ['ts_code', 'trade_date']\n", + "cyq perf\n", + "left merge on ['ts_code', 'trade_date']\n", + "\n", + "RangeIndex: 8692146 entries, 0 to 8692145\n", + "Data columns (total 33 columns):\n", + " # Column Dtype \n", + "--- ------ ----- \n", + " 0 ts_code object \n", + " 1 trade_date datetime64[ns]\n", + " 2 open float64 \n", + " 3 close float64 \n", + " 4 high float64 \n", + " 5 low float64 \n", + " 6 vol float64 \n", + " 7 pct_chg float64 \n", + " 8 amount float64 \n", + " 9 turnover_rate float64 \n", + " 10 pe_ttm float64 \n", + " 11 circ_mv float64 \n", + " 12 total_mv float64 \n", + " 13 volume_ratio float64 \n", + " 14 is_st bool \n", + " 15 up_limit float64 \n", + " 16 down_limit float64 \n", + " 17 buy_sm_vol float64 \n", + " 18 sell_sm_vol float64 \n", + " 19 buy_lg_vol float64 \n", + " 20 sell_lg_vol float64 \n", + " 21 buy_elg_vol float64 \n", + " 22 sell_elg_vol float64 \n", + " 23 net_mf_vol float64 \n", + " 24 his_low float64 \n", + " 25 his_high float64 \n", + " 26 cost_5pct float64 \n", + " 27 cost_15pct float64 \n", + " 28 cost_50pct float64 \n", + " 29 cost_85pct float64 \n", + " 30 cost_95pct float64 \n", + " 31 weight_avg float64 \n", + " 32 winner_rate float64 \n", + "dtypes: bool(1), datetime64[ns](1), float64(30), object(1)\n", + "memory usage: 2.1+ GB\n", + "None\n" + ] + } + ], + "source": [ + "from main.utils.utils import read_and_merge_h5_data\n", + "\n", + "print('daily data')\n", + "df = read_and_merge_h5_data('/mnt/d/PyProject/NewStock/data/daily_data.h5', key='daily_data',\n", + " columns=['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg', 'amount'],\n", + " df=None)\n", + "\n", + "print('daily basic')\n", + "df = read_and_merge_h5_data('/mnt/d/PyProject/NewStock/data/daily_basic.h5', key='daily_basic',\n", + " columns=['ts_code', 'trade_date', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv', 'volume_ratio',\n", + " 'is_st'], df=df, join='inner')\n", + "\n", + "print('stk limit')\n", + "df = read_and_merge_h5_data('/mnt/d/PyProject/NewStock/data/stk_limit.h5', key='stk_limit',\n", + " columns=['ts_code', 'trade_date', 'pre_close', 'up_limit', 'down_limit'],\n", + " df=df)\n", + "print('money flow')\n", + "df = read_and_merge_h5_data('/mnt/d/PyProject/NewStock/data/money_flow.h5', key='money_flow',\n", + " columns=['ts_code', 'trade_date', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol',\n", + " 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol'],\n", + " df=df)\n", + "print('cyq perf')\n", + "df = read_and_merge_h5_data('/mnt/d/PyProject/NewStock/data/cyq_perf.h5', key='cyq_perf',\n", + " columns=['ts_code', 'trade_date', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct',\n", + " 'cost_50pct',\n", + " 'cost_85pct', 'cost_95pct', 'weight_avg', 'winner_rate'],\n", + " df=df)\n", + "print(df.info())" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cac01788dac10678", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:10.527104Z", + "start_time": "2025-04-03T12:47:00.488715Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "industry\n" + ] + } + ], + "source": [ + "print('industry')\n", + "industry_df = read_and_merge_h5_data('/mnt/d/PyProject/NewStock/data/industry_data.h5', key='industry_data',\n", + " columns=['ts_code', 'l2_code', 'in_date'],\n", + " df=None, on=['ts_code'], join='left')\n", + "\n", + "\n", + "def merge_with_industry_data(df, industry_df):\n", + " # 确保日期字段是 datetime 类型\n", + " df['trade_date'] = pd.to_datetime(df['trade_date'])\n", + " industry_df['in_date'] = pd.to_datetime(industry_df['in_date'])\n", + "\n", + " # 对 industry_df 按 ts_code 和 in_date 排序\n", + " industry_df_sorted = industry_df.sort_values(['in_date', 'ts_code'])\n", + "\n", + " # 对原始 df 按 ts_code 和 trade_date 排序\n", + " df_sorted = df.sort_values(['trade_date', 'ts_code'])\n", + "\n", + " # 使用 merge_asof 进行向后合并\n", + " merged = pd.merge_asof(\n", + " df_sorted,\n", + " industry_df_sorted,\n", + " by='ts_code', # 按 ts_code 分组\n", + " left_on='trade_date',\n", + " right_on='in_date',\n", + " direction='backward'\n", + " )\n", + "\n", + " # 获取每个 ts_code 的最早 in_date 记录\n", + " min_in_date_per_ts = (industry_df_sorted\n", + " .groupby('ts_code')\n", + " .first()\n", + " .reset_index()[['ts_code', 'l2_code']])\n", + "\n", + " # 填充未匹配到的记录(trade_date 早于所有 in_date 的情况)\n", + " merged['l2_code'] = merged['l2_code'].fillna(\n", + " merged['ts_code'].map(min_in_date_per_ts.set_index('ts_code')['l2_code'])\n", + " )\n", + "\n", + " # 保留需要的列并重置索引\n", + " result = merged.reset_index(drop=True)\n", + " return result\n", + "\n", + "\n", + "# 使用示例\n", + "df = merge_with_industry_data(df, industry_df)\n", + "# print(mdf[mdf['ts_code'] == '600751.SH'][['ts_code', 'trade_date', 'l2_code']])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c4e9e1d31da6dba6", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:10.719252Z", + "start_time": "2025-04-03T12:47:10.541247Z" + }, + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "from main.factor.factor import *\n", + "\n", + "def calculate_indicators(df):\n", + " \"\"\"\n", + " 计算四个指标:当日涨跌幅、5日移动平均、RSI、MACD。\n", + " \"\"\"\n", + " df = df.sort_values('trade_date')\n", + " df['daily_return'] = (df['close'] - df['pre_close']) / df['pre_close'] * 100\n", + " # df['5_day_ma'] = df['close'].rolling(window=5).mean()\n", + " delta = df['close'].diff()\n", + " gain = delta.where(delta > 0, 0)\n", + " loss = -delta.where(delta < 0, 0)\n", + " avg_gain = gain.rolling(window=14).mean()\n", + " avg_loss = loss.rolling(window=14).mean()\n", + " rs = avg_gain / avg_loss\n", + " df['RSI'] = 100 - (100 / (1 + rs))\n", + "\n", + " # 计算MACD\n", + " ema12 = df['close'].ewm(span=12, adjust=False).mean()\n", + " ema26 = df['close'].ewm(span=26, adjust=False).mean()\n", + " df['MACD'] = ema12 - ema26\n", + " df['Signal_line'] = df['MACD'].ewm(span=9, adjust=False).mean()\n", + " df['MACD_hist'] = df['MACD'] - df['Signal_line']\n", + "\n", + " # 4. 情绪因子1:市场上涨比例(Up Ratio)\n", + " df['up_ratio'] = df['daily_return'].apply(lambda x: 1 if x > 0 else 0)\n", + " df['up_ratio_20d'] = df['up_ratio'].rolling(window=20).mean() # 过去20天上涨比例\n", + "\n", + " # 5. 情绪因子2:成交量变化率(Volume Change Rate)\n", + " df['volume_mean'] = df['vol'].rolling(window=20).mean() # 过去20天的平均成交量\n", + " df['volume_change_rate'] = (df['vol'] - df['volume_mean']) / df['volume_mean'] * 100 # 成交量变化率\n", + "\n", + " # 6. 情绪因子3:波动率(Volatility)\n", + " df['volatility'] = df['daily_return'].rolling(window=20).std() # 过去20天的日收益率标准差\n", + "\n", + " # 7. 情绪因子4:成交额变化率(Amount Change Rate)\n", + " df['amount_mean'] = df['amount'].rolling(window=20).mean() # 过去20天的平均成交额\n", + " df['amount_change_rate'] = (df['amount'] - df['amount_mean']) / df['amount_mean'] * 100 # 成交额变化率\n", + "\n", + " # df = sentiment_panic_greed_index(df)\n", + " # df = sentiment_market_breadth_proxy(df)\n", + " # df = sentiment_reversal_indicator(df)\n", + "\n", + " return df\n", + "\n", + "\n", + "def generate_index_indicators(h5_filename):\n", + " df = pd.read_hdf(h5_filename, key='index_data')\n", + " df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')\n", + " df = df.sort_values('trade_date')\n", + "\n", + " # 计算每个ts_code的相关指标\n", + " df_indicators = []\n", + " for ts_code in df['ts_code'].unique():\n", + " df_index = df[df['ts_code'] == ts_code].copy()\n", + " df_index = calculate_indicators(df_index)\n", + " df_indicators.append(df_index)\n", + "\n", + " # 合并所有指数的结果\n", + " df_all_indicators = pd.concat(df_indicators, ignore_index=True)\n", + "\n", + " # 保留trade_date列,并将同一天的数据按ts_code合并成一行\n", + " df_final = df_all_indicators.pivot_table(\n", + " index='trade_date',\n", + " columns='ts_code',\n", + " values=['daily_return', \n", + " 'RSI', 'MACD', 'Signal_line', 'MACD_hist', \n", + " # 'sentiment_panic_greed_index',\n", + " 'up_ratio_20d', 'volume_change_rate', 'volatility',\n", + " 'amount_change_rate', 'amount_mean'],\n", + " aggfunc='last'\n", + " )\n", + "\n", + " df_final.columns = [f\"{col[1]}_{col[0]}\" for col in df_final.columns]\n", + " df_final = df_final.reset_index()\n", + "\n", + " return df_final\n", + "\n", + "\n", + "# 使用函数\n", + "h5_filename = '/mnt/d/PyProject/NewStock/data/index_data.h5'\n", + "index_data = generate_index_indicators(h5_filename)\n", + "index_data = index_data.dropna()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "a735bc02ceb4d872", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:10.821169Z", + "start_time": "2025-04-03T12:47:10.751831Z" + } + }, + "outputs": [], + "source": [ + "import talib\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "53f86ddc0677a6d7", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:15.944254Z", + "start_time": "2025-04-03T12:47:10.826179Z" + }, + "jupyter": { + "source_hidden": true + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "from main.utils.factor import get_act_factor\n", + "\n", + "\n", + "def read_industry_data(h5_filename):\n", + " # 读取 H5 文件中所有的行业数据\n", + " industry_data = pd.read_hdf(h5_filename, key='sw_daily', columns=[\n", + " 'ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'pe', 'pb', 'vol'\n", + " ]) # 假设 H5 文件的键是 'industry_data'\n", + " industry_data = industry_data.sort_values(by=['ts_code', 'trade_date'])\n", + " industry_data = industry_data.reindex()\n", + " industry_data['trade_date'] = pd.to_datetime(industry_data['trade_date'], format='%Y%m%d')\n", + "\n", + " grouped = industry_data.groupby('ts_code', group_keys=False)\n", + " industry_data['obv'] = grouped.apply(\n", + " lambda x: pd.Series(talib.OBV(x['close'].values, x['vol'].values), index=x.index)\n", + " )\n", + " industry_data['return_5'] = grouped['close'].apply(lambda x: x / x.shift(5) - 1)\n", + " industry_data['return_20'] = grouped['close'].apply(lambda x: x / x.shift(20) - 1)\n", + "\n", + " industry_data = get_act_factor(industry_data, cat=False)\n", + " industry_data = industry_data.sort_values(by=['trade_date', 'ts_code'])\n", + "\n", + " # # 计算每天每个 ts_code 的因子和当天所有 ts_code 的中位数的偏差\n", + " # factor_columns = ['obv', 'return_5', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4'] # 因子列\n", + " # \n", + " # for factor in factor_columns:\n", + " # if factor in industry_data.columns:\n", + " # # 计算每天每个 ts_code 的因子值与当天所有 ts_code 的中位数的偏差\n", + " # industry_data[f'{factor}_deviation'] = industry_data.groupby('trade_date')[factor].transform(\n", + " # lambda x: x - x.mean())\n", + "\n", + " industry_data['return_5_percentile'] = industry_data.groupby('trade_date')['return_5'].transform(\n", + " lambda x: x.rank(pct=True))\n", + " industry_data['return_20_percentile'] = industry_data.groupby('trade_date')['return_20'].transform(\n", + " lambda x: x.rank(pct=True))\n", + "\n", + " # cs_rank_intraday_range(industry_data)\n", + " # cs_rank_close_pos_in_range(industry_data)\n", + "\n", + " industry_data = industry_data.drop(columns=['open', 'close', 'high', 'low', 'pe', 'pb', 'vol'])\n", + "\n", + " industry_data = industry_data.rename(\n", + " columns={col: f'industry_{col}' for col in industry_data.columns if col not in ['ts_code', 'trade_date']})\n", + "\n", + " industry_data = industry_data.rename(columns={'ts_code': 'cat_l2_code'})\n", + " return industry_data\n", + "\n", + "\n", + "industry_df = read_industry_data('/mnt/d/PyProject/NewStock/data/sw_daily.h5')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "dbe2fd8021b9417f", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:15.969344Z", + "start_time": "2025-04-03T12:47:15.963327Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['ts_code', 'open', 'close', 'high', 'low', 'amount', 'circ_mv', 'total_mv', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg', 'in_date']\n" + ] + } + ], + "source": [ + "origin_columns = df.columns.tolist()\n", + "origin_columns = [col for col in origin_columns if\n", + " col not in ['turnover_rate', 'pe_ttm', 'volume_ratio', 'vol', 'pct_chg', 'l2_code', 'winner_rate']]\n", + "origin_columns = [col for col in origin_columns if col not in index_data.columns]\n", + "origin_columns = [col for col in origin_columns if 'cyq' not in col]\n", + "print(origin_columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "85c3e3d0235ffffa", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:16.089879Z", + "start_time": "2025-04-03T12:47:15.990101Z" + } + }, + "outputs": [], + "source": [ + "fina_indicator_df = read_and_merge_h5_data('/mnt/d/PyProject/NewStock/data/fina_indicator.h5', key='fina_indicator',\n", + " columns=['ts_code', 'ann_date', 'undist_profit_ps', 'ocfps', 'bps'],\n", + " df=None)\n", + "cashflow_df = read_and_merge_h5_data('/mnt/d/PyProject/NewStock/data/cashflow.h5', key='cashflow',\n", + " columns=['ts_code', 'ann_date', 'n_cashflow_act'],\n", + " df=None)\n", + "balancesheet_df = read_and_merge_h5_data('/mnt/d/PyProject/NewStock/data/balancesheet.h5', key='balancesheet',\n", + " columns=['ts_code', 'ann_date', 'money_cap', 'total_liab'],\n", + " df=None)\n", + "top_list_df = read_and_merge_h5_data('/mnt/d/PyProject/NewStock/data/top_list.h5', key='top_list',\n", + " columns=['ts_code', 'trade_date', 'reason'],\n", + " df=None)\n", + "\n", + "top_list_df = top_list_df.sort_values(by='trade_date', ascending=False).drop_duplicates(subset=['ts_code', 'trade_date'], keep='first').sort_values(by='trade_date')\n", + "\n", + "stk_holdertrade_df = read_and_merge_h5_data('/mnt/d/PyProject/NewStock/data/stk_holdertrade.h5', key='stk_holdertrade',\n", + " columns=['ts_code', 'ann_date', 'in_de', 'change_ratio'],\n", + " df=None)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "92d84ce15a562ec6", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:01.612695Z", + "start_time": "2025-04-03T12:47:16.121802Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "开始计算股东增减持因子...\n", + "警告: 'in_de' 列中存在未映射的值,可能导致 _direction 列出现NaN。\n", + "股东增减持因子计算完成。\n", + "Calculating cat_senti_mom_vol_spike...\n", + "Finished cat_senti_mom_vol_spike.\n", + "Calculating cat_senti_pre_breakout...\n", + "Calculating atr_10 as it's missing...\n", + "Calculating atr_40 as it's missing...\n", + "Finished cat_senti_pre_breakout.\n", + "计算因子 ts_turnover_rate_acceleration_5_20\n", + "计算因子 ts_vol_sustain_10_30\n", + "计算因子 cs_amount_outlier_10\n", + "计算因子 ts_ff_to_total_turnover_ratio\n", + "计算因子 ts_price_volume_trend_coherence_5_20\n", + "计算因子 ts_ff_turnover_rate_surge_10\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "开始计算因子: AR, BR (原地修改)...\n", + "因子 AR, BR 计算成功。\n", + "因子 AR, BR 计算流程结束。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "计算 BBI...\n", + "--- 计算日级别偏离度 (使用 pct_chg) ---\n", + "--- 计算日级别动量基准 (使用 pct_chg) ---\n", + "日级别动量基准计算完成 (使用 pct_chg)。\n", + "日级别偏离度计算完成 (使用 pct_chg)。\n", + "--- 计算日级别行业偏离度 (使用 pct_chg 和行业基准) ---\n", + "--- 计算日级别行业动量基准 (使用 pct_chg 和 cat_l2_code) ---\n", + "错误: 计算日级别行业动量基准需要以下列: ['pct_chg', 'cat_l2_code', 'trade_date', 'ts_code']。\n", + "错误: 计算日级别行业偏离度需要以下列: ['pct_chg', 'daily_industry_positive_benchmark', 'daily_industry_negative_benchmark']。请先运行 daily_industry_momentum_benchmark(df)。\n", + "Index(['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol',\n", + " 'pct_chg', 'amount', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv',\n", + " 'volume_ratio', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol',\n", + " 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol',\n", + " 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct',\n", + " 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg',\n", + " 'winner_rate', 'l2_code', 'holder_net_change_sum_10d',\n", + " 'holder_increase_days_10d', 'holder_decrease_days_10d',\n", + " 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d',\n", + " 'holder_direction_score_10d', 'cat_senti_mom_vol_spike',\n", + " 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20',\n", + " 'ts_vol_sustain_10_30', 'cs_amount_outlier_10',\n", + " 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20',\n", + " 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR',\n", + " 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio',\n", + " 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor',\n", + " 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity',\n", + " 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio',\n", + " 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change',\n", + " 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel',\n", + " 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy',\n", + " 'cost_support_15pct_change', 'cat_winner_price_zone',\n", + " 'flow_chip_consistency', 'profit_taking_vs_absorb', '_is_positive',\n", + " '_is_negative', 'cat_is_positive', '_pos_returns', '_neg_returns',\n", + " '_pos_returns_sq', '_neg_returns_sq', 'upside_vol', 'downside_vol',\n", + " 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate',\n", + " 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike',\n", + " 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike',\n", + " 'vol_std_5', 'atr_24', 'atr_6', 'obv'],\n", + " dtype='object')\n", + "Calculating senti_strong_inflow...\n", + "Finished senti_strong_inflow.\n", + "Calculating lg_flow_mom_corr_20_60...\n", + "Finished lg_flow_mom_corr_20_60.\n", + "Calculating lg_flow_accel...\n", + "Finished lg_flow_accel.\n", + "Calculating profit_pressure...\n", + "Finished profit_pressure.\n", + "Calculating underwater_resistance...\n", + "Finished underwater_resistance.\n", + "Calculating cost_conc_std_20...\n", + "Finished cost_conc_std_20.\n", + "Calculating profit_decay_20...\n", + "Finished profit_decay_20.\n", + "Calculating vol_amp_loss_20...\n", + "Finished vol_amp_loss_20.\n", + "Calculating vol_drop_profit_cnt_5...\n", + "Finished vol_drop_profit_cnt_5.\n", + "Calculating lg_flow_vol_interact_20...\n", + "Finished lg_flow_vol_interact_20.\n", + "Calculating cost_break_confirm_cnt_5...\n", + "Finished cost_break_confirm_cnt_5.\n", + "Calculating atr_norm_channel_pos_14...\n", + "Finished atr_norm_channel_pos_14.\n", + "Calculating turnover_diff_skew_20...\n", + "Finished turnover_diff_skew_20.\n", + "Calculating lg_sm_flow_diverge_20...\n", + "Finished lg_sm_flow_diverge_20.\n", + "Calculating pullback_strong_20_20...\n", + "Finished pullback_strong_20_20.\n", + "Calculating vol_wgt_hist_pos_20...\n", + "Finished vol_wgt_hist_pos_20.\n", + "Calculating vol_adj_roc_20...\n", + "Finished vol_adj_roc_20.\n", + "Calculating cs_rank_net_lg_flow_val...\n", + "Finished cs_rank_net_lg_flow_val.\n", + "Calculating cs_rank_flow_divergence...\n", + "Finished cs_rank_flow_divergence.\n", + "Calculating cs_rank_ind_adj_lg_flow...\n", + "Finished cs_rank_ind_adj_lg_flow.\n", + "Calculating cs_rank_elg_buy_ratio...\n", + "Finished cs_rank_elg_buy_ratio.\n", + "Calculating cs_rank_rel_profit_margin...\n", + "Finished cs_rank_rel_profit_margin.\n", + "Calculating cs_rank_cost_breadth...\n", + "Finished cs_rank_cost_breadth.\n", + "Calculating cs_rank_dist_to_upper_cost...\n", + "Finished cs_rank_dist_to_upper_cost.\n", + "Calculating cs_rank_winner_rate...\n", + "Finished cs_rank_winner_rate.\n", + "Calculating cs_rank_intraday_range...\n", + "Finished cs_rank_intraday_range.\n", + "Calculating cs_rank_close_pos_in_range...\n", + "Finished cs_rank_close_pos_in_range.\n", + "Calculating cs_rank_opening_gap...\n", + "Error calculating cs_rank_opening_gap: Missing 'pre_close' column. Assigning NaN.\n", + "Calculating cs_rank_pos_in_hist_range...\n", + "Finished cs_rank_pos_in_hist_range.\n", + "Calculating cs_rank_vol_x_profit_margin...\n", + "Finished cs_rank_vol_x_profit_margin.\n", + "Calculating cs_rank_lg_flow_price_concordance...\n", + "Finished cs_rank_lg_flow_price_concordance.\n", + "Calculating cs_rank_turnover_per_winner...\n", + "Finished cs_rank_turnover_per_winner.\n", + "Calculating cs_rank_ind_cap_neutral_pe (Placeholder - requires statsmodels)...\n", + "Finished cs_rank_ind_cap_neutral_pe (Placeholder).\n", + "Calculating cs_rank_volume_ratio...\n", + "Finished cs_rank_volume_ratio.\n", + "Calculating cs_rank_elg_buy_sell_sm_ratio...\n", + "Finished cs_rank_elg_buy_sell_sm_ratio.\n", + "Calculating cs_rank_cost_dist_vol_ratio...\n", + "Finished cs_rank_cost_dist_vol_ratio.\n", + "Calculating cs_rank_size...\n", + "Finished cs_rank_size.\n", + "\n", + "RangeIndex: 4554725 entries, 0 to 4554724\n", + "Columns: 194 entries, ts_code to cs_rank_size\n", + "dtypes: bool(10), datetime64[ns](1), float64(173), int64(6), object(4)\n", + "memory usage: 6.3+ GB\n", + "None\n", + "['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg', 'amount', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv', 'volume_ratio', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg', 'winner_rate', 'cat_l2_code', 'holder_net_change_sum_10d', 'holder_increase_days_10d', 'holder_decrease_days_10d', 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d', 'holder_direction_score_10d', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_24', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'price_cost_divergence', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_flow_divergence', 'cs_rank_ind_adj_lg_flow', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_opening_gap', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_ind_cap_neutral_pe', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size']\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from main.factor.factor import *\n", + "from main.factor.money_factor import * \n", + "\n", + "\n", + "def filter_data(df):\n", + " # df = df.groupby('trade_date').apply(lambda x: x.nlargest(1000, 'act_factor1'))\n", + " df = df[~df[\"is_st\"]]\n", + " df = df[~df[\"ts_code\"].str.endswith(\"BJ\")]\n", + " df = df[~df[\"ts_code\"].str.startswith(\"30\")]\n", + " df = df[~df[\"ts_code\"].str.startswith(\"68\")]\n", + " df = df[~df[\"ts_code\"].str.startswith(\"8\")]\n", + " df = df[df[\"trade_date\"] >= \"2019-01-01\"]\n", + " if \"in_date\" in df.columns:\n", + " df = df.drop(columns=[\"in_date\"])\n", + " df = df.reset_index(drop=True)\n", + " return df\n", + "\n", + "\n", + "gc.collect()\n", + "\n", + "df = filter_data(df)\n", + "df = df.sort_values(by=[\"ts_code\", \"trade_date\"])\n", + "\n", + "# df = price_minus_deduction_price(df, n=120)\n", + "# df = price_deduction_price_diff_ratio_to_sma(df, n=120)\n", + "# df = cat_price_vs_sma_vs_deduction_price(df, n=120)\n", + "# df = cat_reason(df, top_list_df)\n", + "# df = cat_is_on_top_list(df, top_list_df)\n", + "df = holder_trade_factors(df, stk_holdertrade_df)\n", + "\n", + "df = cat_senti_mom_vol_spike(\n", + " df,\n", + " return_period=3,\n", + " return_threshold=0.03, # 近3日涨幅超3%\n", + " volume_ratio_threshold=1.3,\n", + " current_pct_chg_min=0.0, # 当日必须收红\n", + " current_pct_chg_max=0.05,\n", + ") # 当日涨幅不宜过大\n", + "\n", + "df = cat_senti_pre_breakout(\n", + " df,\n", + " atr_short_N=10,\n", + " atr_long_M=40,\n", + " vol_atrophy_N=10,\n", + " vol_atrophy_M=40,\n", + " price_stab_N=5,\n", + " price_stab_threshold=0.06,\n", + " current_pct_chg_min_signal=0.002,\n", + " current_pct_chg_max_signal=0.05,\n", + " volume_ratio_signal_threshold=1.1,\n", + ")\n", + "\n", + "df = ts_turnover_rate_acceleration_5_20(df)\n", + "df = ts_vol_sustain_10_30(df)\n", + "# df = cs_turnover_rate_relative_strength_20(df)\n", + "df = cs_amount_outlier_10(df)\n", + "df = ts_ff_to_total_turnover_ratio(df)\n", + "df = ts_price_volume_trend_coherence_5_20(df)\n", + "# df = ts_turnover_rate_trend_strength_5(df)\n", + "df = ts_ff_turnover_rate_surge_10(df)\n", + "\n", + "df = add_financial_factor(df, fina_indicator_df, factor_value_col=\"undist_profit_ps\")\n", + "df = add_financial_factor(df, fina_indicator_df, factor_value_col=\"ocfps\")\n", + "calculate_arbr(df, N=26)\n", + "df[\"log_circ_mv\"] = np.log(df[\"circ_mv\"])\n", + "df = calculate_cashflow_to_ev_factor(df, cashflow_df, balancesheet_df)\n", + "df = caculate_book_to_price_ratio(df, fina_indicator_df)\n", + "df = turnover_rate_n(df, n=5)\n", + "df = variance_n(df, n=20)\n", + "df = bbi_ratio_factor(df)\n", + "df = daily_deviation(df)\n", + "df = daily_industry_deviation(df)\n", + "df, _ = get_rolling_factor(df)\n", + "df, _ = get_simple_factor(df)\n", + "\n", + "df = calculate_strong_inflow_signal(df)\n", + "\n", + "df = df.rename(columns={\"l1_code\": \"cat_l1_code\"})\n", + "df = df.rename(columns={\"l2_code\": \"cat_l2_code\"})\n", + "\n", + "lg_flow_mom_corr(df, N=20, M=60)\n", + "lg_flow_accel(df)\n", + "profit_pressure(df)\n", + "underwater_resistance(df)\n", + "cost_conc_std(df, N=20)\n", + "profit_decay(df, N=20)\n", + "vol_amp_loss(df, N=20)\n", + "vol_drop_profit_cnt(df, N=20, M=5)\n", + "lg_flow_vol_interact(df, N=20)\n", + "cost_break_confirm_cnt(df, M=5)\n", + "atr_norm_channel_pos(df, N=14)\n", + "turnover_diff_skew(df, N=20)\n", + "lg_sm_flow_diverge(df, N=20)\n", + "pullback_strong(df, N=20, M=20)\n", + "vol_wgt_hist_pos(df, N=20)\n", + "vol_adj_roc(df, N=20)\n", + "\n", + "cs_rank_net_lg_flow_val(df)\n", + "cs_rank_flow_divergence(df)\n", + "cs_rank_industry_adj_lg_flow(df) # Needs cat_l2_code\n", + "cs_rank_elg_buy_ratio(df)\n", + "cs_rank_rel_profit_margin(df)\n", + "cs_rank_cost_breadth(df)\n", + "cs_rank_dist_to_upper_cost(df)\n", + "cs_rank_winner_rate(df)\n", + "cs_rank_intraday_range(df)\n", + "cs_rank_close_pos_in_range(df)\n", + "cs_rank_opening_gap(df) # Needs pre_close\n", + "cs_rank_pos_in_hist_range(df) # Needs his_low, his_high\n", + "cs_rank_vol_x_profit_margin(df)\n", + "cs_rank_lg_flow_price_concordance(df)\n", + "cs_rank_turnover_per_winner(df)\n", + "cs_rank_ind_cap_neutral_pe(df) # Placeholder - needs external libraries\n", + "cs_rank_volume_ratio(df) # Needs volume_ratio\n", + "cs_rank_elg_buy_sell_sm_ratio(df)\n", + "cs_rank_cost_dist_vol_ratio(df) # Needs volume_ratio\n", + "cs_rank_size(df) # Needs circ_mv\n", + "\n", + "\n", + "# df = df.merge(index_data, on='trade_date', how='left')\n", + "\n", + "print(df.info())\n", + "print(df.columns.tolist())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "b87b938028afa206", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:03.658725Z", + "start_time": "2025-04-03T13:08:02.469611Z" + } + }, + "outputs": [], + "source": [ + "from scipy.stats import ks_2samp, wasserstein_distance\n", + "\n", + "\n", + "def remove_shifted_features(train_data, test_data, feature_columns, ks_threshold=0.05, wasserstein_threshold=0.1,\n", + " importance_threshold=0.05):\n", + " dropped_features = []\n", + "\n", + " # **统计数据漂移**\n", + " numeric_columns = train_data.select_dtypes(include=['float64', 'int64']).columns\n", + " numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", + " for feature in numeric_columns:\n", + " ks_stat, p_value = ks_2samp(train_data[feature], test_data[feature])\n", + " wasserstein_dist = wasserstein_distance(train_data[feature], test_data[feature])\n", + "\n", + " if p_value < ks_threshold or wasserstein_dist > wasserstein_threshold:\n", + " dropped_features.append(feature)\n", + "\n", + " print(f\"检测到 {len(dropped_features)} 个可能漂移的特征: {dropped_features}\")\n", + "\n", + " # **应用阈值进行最终筛选**\n", + " filtered_features = [f for f in feature_columns if f not in dropped_features]\n", + "\n", + " return filtered_features, dropped_features\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f4f16d63ad18d1bc", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:03.670700Z", + "start_time": "2025-04-03T13:08:03.665739Z" + } + }, + "outputs": [], + "source": [ + "import polars as pl\n", + "import numpy as np\n", + "# from tqdm import tqdm # Polars 通常处理速度快,可能不需要 tqdm,但如果需要可以保留\n", + "\n", + "def cs_mad_filter_polars(df: pl.DataFrame,\n", + " features: list[str],\n", + " k: float = 3.0,\n", + " scale_factor: float = 1.4826) -> pl.DataFrame:\n", + " \"\"\"\n", + " 对指定特征列进行截面 MAD 去极值处理 (Polars 版本)。\n", + "\n", + " 方法: 对每日截面数据,计算 median 和 MAD,\n", + " 将超出 [median - k * scale * MAD, median + k * scale * MAD] 范围的值\n", + " 替换为边界值 (Winsorization)。\n", + " scale_factor=1.4826 使得 MAD 约等于正态分布的标准差。\n", + "\n", + " Args:\n", + " df (pl.DataFrame): 输入 Polars DataFrame,需包含 'trade_date' 和 features 列。\n", + " features (list): 需要处理的特征列名列表。\n", + " k (float): MAD 的倍数,用于确定边界。默认为 3.0。\n", + " scale_factor (float): MAD 的缩放因子。默认为 1.4826。\n", + "\n", + " Returns:\n", + " pl.DataFrame: 处理后的 Polars DataFrame (返回新 DataFrame,原 DataFrame 不变)。\n", + " \"\"\"\n", + " print(f\"开始截面 MAD 去极值处理 (k={k})...\")\n", + "\n", + " # 检查特征列是否存在\n", + " existing_features = [col for col in features if col in df.columns]\n", + " missing_features = [col for col in features if col not in df.columns]\n", + "\n", + " if missing_features:\n", + " print(f\"警告: DataFrame 中缺少以下特征列: {missing_features}。这些列将跳过去极值处理。\")\n", + "\n", + " if not existing_features:\n", + " print(\"没有找到需要处理的特征列。跳过去极值处理。\")\n", + " return df # 返回原始 DataFrame\n", + "\n", + " # 构建一个表达式列表,用于一次性处理所有特征列\n", + " expressions = []\n", + " for col in existing_features:\n", + " col_expr = pl.col(col)\n", + "\n", + " try:\n", + " # 计算截面中位数 (median) - 使用 over()\n", + " median_val = col_expr.median().over('trade_date')\n", + "\n", + " # 计算截面 MAD (Median Absolute Deviation from Median) - 使用 over()\n", + " mad_val = (col_expr - median_val).abs().median().over('trade_date')\n", + "\n", + " # 计算上下边界\n", + " # 确保 mad_val 不为 null 或 0,否则边界会是 NaN\n", + " lower_bound = median_val - k * scale_factor * mad_val\n", + " upper_bound = median_val + k * scale_factor * mad_val\n", + "\n", + " # 应用 Winsorization (裁剪值到边界内)\n", + " # 使用 when/then/otherwise 来确保边界值为 NaN 或 MAD 为 0 时不进行过滤,保留原始值\n", + " clipped_col_expr = pl.when(\n", + " lower_bound.is_not_null() &\n", + " upper_bound.is_not_null() &\n", + " mad_val.is_not_null() &\n", + " (mad_val != 0) # MAD 为 0 意味着所有值都相同,此时不应裁剪\n", + " ).then(col_expr.clip(lower_bound, upper_bound)).otherwise(col_expr).alias(col) # 保持列名不变\n", + "\n", + " expressions.append(clipped_col_expr)\n", + "\n", + " except Exception as e:\n", + " print(f\"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的 MAD 处理。保留原始列。\")\n", + " expressions.append(col_expr) # 发生错误时保留原始列\n", + "\n", + " # 使用 with_columns 一次性应用所有表达式,创建新的 DataFrame\n", + " result_df = df.with_columns(expressions)\n", + "\n", + " print(\"截面 MAD 去极值处理完成。\")\n", + " return result_df\n", + "\n", + "\n", + "# --- 您的 cs_zscore_standardize_polars 函数 (确保其也是全 Polars 实现) ---\n", + "# (如果您的 cs_zscore_standardize_polars 也有类似问题,也需要按此模式修改)\n", + "def cs_zscore_standardize_polars(df: pl.DataFrame, features: list[str], epsilon: float = 1e-10) -> pl.DataFrame:\n", + " print(\"开始截面 Z-Score 标准化...\")\n", + "\n", + " existing_features = [col for col in features if col in df.columns]\n", + " missing_features = [col for col in features if col not in df.columns]\n", + "\n", + " if missing_features:\n", + " print(f\"警告: DataFrame 中缺少以下特征列: {missing_features}。这些列将跳过标准化处理。\")\n", + "\n", + " if not existing_features:\n", + " print(\"没有找到需要标准化的特征列。跳过标准化处理。\")\n", + " return df\n", + "\n", + " expressions = []\n", + " for col in existing_features:\n", + " col_expr = pl.col(col)\n", + "\n", + " if not col_expr.dtype.is_numeric():\n", + " print(f\"警告: 列 '{col}' 不是数值类型 ({col_expr.dtype}),跳过此列的标准化处理。\")\n", + " expressions.append(col_expr)\n", + " continue\n", + "\n", + " mean_val = col_expr.mean().over('trade_date')\n", + " std_val = col_expr.std().over('trade_date')\n", + "\n", + " # 处理标准差为 0 或 NaN 的情况,防止 Inf/NaN 扩散\n", + " z_score_expr = pl.when(std_val.is_null() | (std_val == 0)).then(0) # 如果标准差为 null 或 0,设为 0 (或 np.nan,取决于业务逻辑).otherwise((col_expr - mean_val) / (std_val + epsilon)).alias(col)\n", + " expressions.append(z_score_expr)\n", + "\n", + " result_df = df.with_columns(expressions)\n", + " print(\"截面 Z-Score 标准化完成。\")\n", + " return result_df\n", + "\n", + "\n", + "# --- 2. 行业市值中性化 ---\n", + "def cs_neutralize_industry_cap(df: pd.DataFrame,\n", + " features: list,\n", + " industry_col: str = 'cat_l2_code',\n", + " market_cap_col: str = 'circ_mv'):\n", + " \"\"\"\n", + " 对指定特征列进行截面行业和对数市值中性化 (原地修改)。\n", + " 使用 OLS 回归: feature ~ 1 + log(market_cap) + C(industry)\n", + " 将回归残差写回原特征列。\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date', features 列,\n", + " industry_col, market_cap_col。\n", + " features (list): 需要处理的特征列名列表。\n", + " industry_col (str): 行业分类列名。\n", + " market_cap_col (str): 流通市值列名。\n", + "\n", + " WARNING: 此函数会原地修改输入的 DataFrame 'df' 的 features 列。\n", + " 计算量较大,可能耗时较长。\n", + " 需要安装 statsmodels 库 (pip install statsmodels)。\n", + " \"\"\"\n", + " print(\"开始截面行业市值中性化...\")\n", + " required_cols = features + ['trade_date', industry_col, market_cap_col]\n", + " if not all(col in df.columns for col in required_cols):\n", + " missing = [col for col in required_cols if col not in df.columns]\n", + " print(f\"错误: DataFrame 中缺少必需列: {missing}。无法进行中性化。\")\n", + " return\n", + "\n", + " # 预处理:计算 log 市值,处理 industry code 可能的 NaN\n", + " log_cap_col = '_log_market_cap'\n", + " df[log_cap_col] = np.log1p(df[market_cap_col]) # log1p 处理 0 值\n", + " # df[industry_col] = df[industry_col].cat.add_categories('UnknownIndustry')\n", + " # df[industry_col] = df[industry_col].fillna('UnknownIndustry') # 填充行业 NaN\n", + " # df[industry_col] = df[industry_col].astype('category') # 转为类别,ols 会自动处理\n", + "\n", + " dates = df['trade_date'].unique()\n", + " all_residuals = [] # 用于收集所有日期的残差\n", + "\n", + " for date in tqdm(dates, desc=\"Neutralizing\"):\n", + " daily_data = df.loc[df['trade_date'] == date, features + [log_cap_col, industry_col]].copy() # 使用 .loc 获取副本\n", + "\n", + " # 准备自变量 X (常数项 + log市值 + 行业哑变量)\n", + " X = daily_data[[log_cap_col]]\n", + " X = sm.add_constant(X, prepend=True) # 添加常数项\n", + " # 创建行业哑变量 (drop_first=True 避免共线性)\n", + " industry_dummies = pd.get_dummies(daily_data[industry_col], prefix=industry_col, drop_first=True)\n", + " industry_dummies = industry_dummies.astype(int)\n", + " X = pd.concat([X, industry_dummies], axis=1)\n", + "\n", + " daily_residuals = daily_data[[col for col in features]].copy() # 创建用于存储残差的df\n", + "\n", + " for col in features:\n", + " Y = daily_data[col]\n", + "\n", + " # 处理 NaN 值,确保 X 和 Y 在相同位置有有效值\n", + " valid_mask = Y.notna() & X.notna().all(axis=1)\n", + " if valid_mask.sum() < (X.shape[1] + 1): # 数据点不足以估计模型\n", + " print(f\"警告: 日期 {date}, 特征 {col} 有效数据不足 ({valid_mask.sum()}个),无法中性化,填充 NaN。\")\n", + " daily_residuals[col] = np.nan\n", + " continue\n", + "\n", + " Y_valid = Y[valid_mask]\n", + " X_valid = X[valid_mask]\n", + "\n", + " # 执行 OLS 回归\n", + " try:\n", + " model = sm.OLS(Y_valid.to_numpy(), X_valid.to_numpy())\n", + " results = model.fit()\n", + " # 将残差填回对应位置\n", + " daily_residuals.loc[valid_mask, col] = results.resid\n", + " daily_residuals.loc[~valid_mask, col] = np.nan # 原本无效的位置填充 NaN\n", + " except Exception as e:\n", + " print(f\"警告: 日期 {date}, 特征 {col} 回归失败: {e},填充 NaN。\")\n", + " daily_residuals[col] = np.nan\n", + " break\n", + "\n", + " all_residuals.append(daily_residuals)\n", + "\n", + " # 合并所有日期的残差结果\n", + " if all_residuals:\n", + " residuals_df = pd.concat(all_residuals)\n", + " # 将残差结果更新回原始 df (原地修改)\n", + " # 使用 update 比 merge 更适合基于索引的原地更新\n", + " # 确保 residuals_df 的索引与 df 中对应部分一致\n", + " df.update(residuals_df)\n", + " else:\n", + " print(\"没有有效的残差结果可以合并。\")\n", + "\n", + "\n", + " # 清理临时列\n", + " df.drop(columns=[log_cap_col], inplace=True)\n", + " print(\"截面行业市值中性化完成。\")\n", + "\n", + "\n", + "# --- 3. Z-Score 标准化 ---\n", + "\n", + "import polars as pl\n", + "import numpy as np # 用于 np.float64, np.nan 等\n", + "\n", + "def cs_zscore_standardize_polars(df: pl.DataFrame,\n", + " features: list,\n", + " epsilon: float = 1e-10) -> pl.DataFrame:\n", + " \"\"\"\n", + " 对指定特征列进行截面 Z-Score 标准化 (Polars 版本)。\n", + " 方法: Z = (value - cross_sectional_mean) / (cross_sectional_std + epsilon)\n", + "\n", + " Args:\n", + " df (pl.DataFrame): 输入 Polars DataFrame,需包含 'trade_date' 和 features 列。\n", + " features (list): 需要处理的特征列名列表。\n", + " epsilon (float): 防止除以零的小常数。\n", + "\n", + " Returns:\n", + " pl.DataFrame: 处理后的 Polars DataFrame (返回新 DataFrame,原 DataFrame 不变)。\n", + " \"\"\"\n", + " print(\"开始截面 Z-Score 标准化...\")\n", + "\n", + " # 检查特征列是否存在\n", + " existing_features = [col for col in features if col in df.columns]\n", + " missing_features = [col for col in features if col not in df.columns]\n", + "\n", + " if missing_features:\n", + " print(f\"警告: DataFrame 中缺少以下特征列: {missing_features}。这些列将跳过标准化处理。\")\n", + "\n", + " if not existing_features:\n", + " print(\"没有找到需要标准化的特征列。跳过标准化处理。\")\n", + " return df # 返回原始 DataFrame\n", + "\n", + " # 构建一个表达式列表,用于一次性处理所有特征列\n", + " expressions = []\n", + " for col in existing_features:\n", + " col_expr = pl.col(col)\n", + "\n", + " # 确保列是数值类型,否则跳过\n", + " if not col_expr.dtype.is_numeric():\n", + " print(f\"警告: 列 '{col}' 不是数值类型 ({col_expr.dtype}),跳过此列的标准化处理。\")\n", + " expressions.append(col_expr) # 保留原始列\n", + " continue\n", + "\n", + " try:\n", + " # 计算截面均值和标准差\n", + " mean_val = col_expr.mean().over('trade_date')\n", + " std_val = col_expr.std().over('trade_date')\n", + "\n", + " # 计算 Z-Score\n", + " # 这里需要处理 std_val 可能是 0 的情况,即使有 epsilon,也可能因浮点精度问题导致问题\n", + " # 或当 trade_date 组内只有少数几个相同的值时 std_val 可能会是 NaN 或 0\n", + " # 使用 when/then/otherwise 来处理 std_val 为 0 或 NaN 的情况,防止 Inf/NaN 扩散\n", + " z_score_expr = pl.when(std_val.is_null() | (std_val == 0)).then(0).otherwise((col_expr - mean_val) / (std_val + epsilon)).alias(col)\n", + "\n", + " expressions.append(z_score_expr)\n", + "\n", + " except Exception as e:\n", + " print(f\"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的标准化处理。保留原始列。\")\n", + " expressions.append(col_expr) # 发生错误时保留原始列\n", + "\n", + " # 使用 with_columns 一次性应用所有表达式,创建新的 DataFrame\n", + " result_df = df.with_columns(expressions)\n", + "\n", + " print(\"截面 Z-Score 标准化完成。\")\n", + " return result_df\n", + "\n", + "\n", + "def fill_nan_with_daily_median(df: pd.DataFrame, feature_columns: list[str]) -> pd.DataFrame:\n", + " \"\"\"\n", + " 对指定特征列进行每日截面中位数填充缺失值 (NaN)。\n", + "\n", + " 参数:\n", + " df (pd.DataFrame): 包含多日数据的DataFrame,需要包含 'trade_date' 和 feature_columns 中的列。\n", + " feature_columns (list[str]): 需要进行缺失值填充的特征列名称列表。\n", + "\n", + " 返回:\n", + " pd.DataFrame: 包含缺失值填充后特征列的DataFrame。在输入DataFrame的副本上操作。\n", + " \"\"\"\n", + " processed_df = df.copy() # 在副本上操作,保留原始数据\n", + "\n", + " # 确保 trade_date 是 datetime 类型以便正确分组\n", + " processed_df['trade_date'] = pd.to_datetime(processed_df['trade_date'])\n", + "\n", + " def _fill_daily_nan(group):\n", + " # group 是某一个交易日的 DataFrame\n", + "\n", + " # 遍历指定的特征列\n", + " for feature_col in feature_columns:\n", + " # 检查列是否存在于当前分组中\n", + " if feature_col in group.columns:\n", + " # 计算当日该特征的中位数\n", + " median_val = group[feature_col].median()\n", + "\n", + " # 使用当日中位数填充该特征列的 NaN 值\n", + " # inplace=True 会直接修改 group DataFrame\n", + " group[feature_col].fillna(median_val, inplace=True)\n", + " # else:\n", + " # print(f\"Warning: Feature column '{feature_col}' not found in daily group for {group['trade_date'].iloc[0]}. Skipping.\")\n", + "\n", + " return group\n", + "\n", + " # 按交易日期分组,并应用每日填充函数\n", + " # group_keys=False 避免将分组键添加到结果索引中\n", + " filled_df = processed_df.groupby('trade_date', group_keys=False).apply(_fill_daily_nan)\n", + "\n", + " return filled_df" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "40e6b68a91b30c79", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:04.694262Z", + "start_time": "2025-04-03T13:08:03.694904Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "\n", + "def remove_outliers_label_percentile(label: pd.Series, lower_percentile: float = 0.01, upper_percentile: float = 0.99,\n", + " log=True):\n", + " if not (0 <= lower_percentile < upper_percentile <= 1):\n", + " raise ValueError(\"Percentile values must satisfy 0 <= lower_percentile < upper_percentile <= 1.\")\n", + "\n", + " # Calculate lower and upper bounds based on percentiles\n", + " lower_bound = label.quantile(lower_percentile)\n", + " upper_bound = label.quantile(upper_percentile)\n", + "\n", + " # Filter out values outside the bounds\n", + " filtered_label = label[(label >= lower_bound) & (label <= upper_bound)]\n", + "\n", + " # Print the number of removed outliers\n", + " if log:\n", + " print(f\"Removed {len(label) - len(filtered_label)} outliers.\")\n", + " return filtered_label\n", + "\n", + "\n", + "def calculate_risk_adjusted_target(df, days=5):\n", + " df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "\n", + " df['future_close'] = df.groupby('ts_code')['close'].shift(-days)\n", + " df['future_open'] = df.groupby('ts_code')['open'].shift(-1)\n", + " df['future_return'] = (df['future_close'] - df['future_open']) / df['future_open']\n", + "\n", + " df['future_volatility'] = df.groupby('ts_code')['future_return'].rolling(days, min_periods=1).std().reset_index(\n", + " level=0, drop=True)\n", + " sharpe_ratio = df['future_return'] * df['future_volatility']\n", + " sharpe_ratio.replace([np.inf, -np.inf], np.nan, inplace=True)\n", + "\n", + " return sharpe_ratio\n", + "\n", + "\n", + "def calculate_score(df, days=5, lambda_param=1.0):\n", + " def calculate_max_drawdown(prices):\n", + " peak = prices.iloc[0] # 初始化峰值\n", + " max_drawdown = 0 # 初始化最大回撤\n", + "\n", + " for price in prices:\n", + " if price > peak:\n", + " peak = price # 更新峰值\n", + " else:\n", + " drawdown = (peak - price) / peak # 计算当前回撤\n", + " max_drawdown = max(max_drawdown, drawdown) # 更新最大回撤\n", + "\n", + " return max_drawdown\n", + "\n", + " def compute_stock_score(stock_df):\n", + " stock_df = stock_df.sort_values(by=['trade_date'])\n", + " future_return = stock_df['future_return']\n", + " # 使用已有的 pct_chg 字段计算波动率\n", + " volatility = stock_df['pct_chg'].rolling(days).std().shift(-days)\n", + " max_drawdown = stock_df['close'].rolling(days).apply(calculate_max_drawdown, raw=False).shift(-days)\n", + " score = future_return - lambda_param * max_drawdown\n", + " return score\n", + "\n", + " # # 确保 DataFrame 按照股票代码和交易日期排序\n", + " # df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "\n", + " # 对每个股票分别计算 score\n", + " df['score'] = df.groupby('ts_code').apply(compute_stock_score).reset_index(level=0, drop=True)\n", + "\n", + " return df['score']\n", + "\n", + "\n", + "def remove_highly_correlated_features(df, feature_columns, threshold=0.9):\n", + " numeric_features = df[feature_columns].select_dtypes(include=[np.number]).columns.tolist()\n", + " if not numeric_features:\n", + " raise ValueError(\"No numeric features found in the provided data.\")\n", + "\n", + " corr_matrix = df[numeric_features].corr().abs()\n", + " upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))\n", + " to_drop = [column for column in upper.columns if any(upper[column] > threshold)]\n", + " remaining_features = [col for col in feature_columns if col not in to_drop\n", + " or 'act' in col or 'af' in col]\n", + " return remaining_features\n", + "\n", + "\n", + "def cross_sectional_standardization(df, features):\n", + " df_sorted = df.sort_values(by='trade_date') # 按时间排序\n", + " df_standardized = df_sorted.copy()\n", + "\n", + " for date in df_sorted['trade_date'].unique():\n", + " # 获取当前时间点的数据\n", + " current_data = df_standardized[df_standardized['trade_date'] == date]\n", + "\n", + " # 只对指定特征进行标准化\n", + " scaler = StandardScaler()\n", + " standardized_values = scaler.fit_transform(current_data[features])\n", + "\n", + " # 将标准化结果重新赋值回去\n", + " df_standardized.loc[df_standardized['trade_date'] == date, features] = standardized_values\n", + "\n", + " return df_standardized\n", + "\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "\n", + "def neutralize_manual_revised(df: pd.DataFrame, features: list, industry_col: str, mkt_cap_col: str) -> pd.DataFrame:\n", + " \"\"\"\n", + " 手动实现简单回归以提升速度,通过构建 Series 确保索引对齐。\n", + " 对特征在行业内部进行市值中性化。\n", + "\n", + " Args:\n", + " df: 输入的 DataFrame,包含特征、行业分类和市值列。\n", + " features: 需要进行中性化的特征列名列表。\n", + " industry_col: 行业分类列的列名。\n", + " mkt_cap_col: 市值列的列名。\n", + "\n", + " Returns:\n", + " 中性化后的 DataFrame。\n", + " \"\"\"\n", + "\n", + " df[mkt_cap_col] = pd.to_numeric(df[mkt_cap_col], errors='coerce')\n", + " df_cleaned = df.dropna(subset=[mkt_cap_col]).copy()\n", + " df_cleaned = df_cleaned[df_cleaned[mkt_cap_col] > 0].copy()\n", + "\n", + " if df_cleaned.empty:\n", + " print(\"警告: 清理市值异常值后 DataFrame 为空。\")\n", + " return df # 返回原始或空df,取决于清理前的状态\n", + "\n", + " processed_df = df\n", + "\n", + " for col in features:\n", + " if col not in df_cleaned.columns:\n", + " print(f\"警告: 特征列 '{col}' 不存在于清理后的 DataFrame 中,已跳过。\")\n", + " # 对于原始 df 中该列不存在的,在结果 df 中也保持原样(可能全是NaN)\n", + " processed_df[col] = df[col] if col in df.columns else np.nan\n", + " continue\n", + "\n", + " # 跳过对控制变量本身进行中性化\n", + " if col == mkt_cap_col or col == industry_col:\n", + " print(f\"警告: 特征列 '{col}' 是控制变量或内部使用的列,跳过中性化。\")\n", + " # 在结果 df 中也保持原样\n", + " processed_df[col] = df[col] if col in df.columns else np.nan\n", + " continue\n", + "\n", + " residual_series = pd.Series(index=df_cleaned.index, dtype=float)\n", + "\n", + " # 在分组前处理特征列的 NaN,只对有因子值的行进行回归计算\n", + " df_subset_factor = df_cleaned.dropna(subset=[col]).copy()\n", + "\n", + " if not df_subset_factor.empty:\n", + " for industry, group in df_subset_factor.groupby(industry_col):\n", + " x = group[mkt_cap_col] # 市值对数\n", + " y = group[col] # 因子值\n", + "\n", + " # 确保有足够的数据点 (>1) 且市值对数有方差 (>0) 进行回归计算\n", + " # 检查 np.var > 一个很小的正数,避免浮点数误差导致的零方差判断问题\n", + " if len(group) > 1 and np.var(x) > 1e-9:\n", + " try:\n", + " beta = np.cov(y, x)[0, 1] / np.var(x)\n", + " alpha = np.mean(y) - beta * np.mean(x)\n", + "\n", + " # 计算残差\n", + " resid = y - (alpha + beta * x)\n", + "\n", + " # 将计算出的残差存储到 residual_series 中,通过索引自动对齐\n", + " residual_series.loc[resid.index] = resid\n", + "\n", + " except Exception as e:\n", + " # 捕获可能的计算异常,例如np.cov或np.var因为极端数据报错\n", + " print(f\"警告: 在行业 {industry} 计算回归时发生错误: {e}。该组残差将设为原始值或 NaN。\")\n", + " # 此时该组的残差会保持 residual_series 初始化时的 NaN 或后续处理\n", + " # 也可以选择保留原始值:residual_series.loc[group.index] = group[col]\n", + "\n", + " else:\n", + " residual_series.loc[group.index] = group[col] # 保留原始因子值\n", + " processed_df.loc[residual_series.index, col] = residual_series\n", + "\n", + "\n", + " else:\n", + " processed_df[col] = np.nan # 或 df[col] if col in df.columns else np.nan\n", + "\n", + " return processed_df\n", + "\n", + "\n", + "import gc\n", + "\n", + "gc.collect()\n", + "\n", + "\n", + "def mad_filter(df, features, n=3):\n", + " for col in features:\n", + " median = df[col].median()\n", + " mad = np.median(np.abs(df[col] - median))\n", + " upper = median + n * mad\n", + " lower = median - n * mad\n", + " df[col] = np.clip(df[col], lower, upper) # 截断极值\n", + " return df\n", + "\n", + "\n", + "def percentile_filter(df, features, lower_percentile=0.01, upper_percentile=0.99):\n", + " for col in features:\n", + " # 按日期分组计算上下百分位数\n", + " lower_bound = df.groupby('trade_date')[col].transform(\n", + " lambda x: x.quantile(lower_percentile)\n", + " )\n", + " upper_bound = df.groupby('trade_date')[col].transform(\n", + " lambda x: x.quantile(upper_percentile)\n", + " )\n", + " # 截断超出范围的值\n", + " df[col] = np.clip(df[col], lower_bound, upper_bound)\n", + " return df\n", + "\n", + "\n", + "from scipy.stats import iqr\n", + "\n", + "\n", + "def iqr_filter(df, features):\n", + " for col in features:\n", + " df[col] = df.groupby('trade_date')[col].transform(\n", + " lambda x: (x - x.median()) / iqr(x) if iqr(x) != 0 else x\n", + " )\n", + " return df\n", + "\n", + "\n", + "def quantile_filter(df, features, lower_quantile=0.01, upper_quantile=0.99, window=60):\n", + " df = df.copy()\n", + " for col in features:\n", + " # 计算 rolling 统计量,需要按日期进行 groupby\n", + " rolling_lower = df.groupby('trade_date')[col].transform(lambda x: x.rolling(window=min(len(x), window)).quantile(lower_quantile))\n", + " rolling_upper = df.groupby('trade_date')[col].transform(lambda x: x.rolling(window=min(len(x), window)).quantile(upper_quantile))\n", + "\n", + " # 对数据进行裁剪\n", + " df[col] = np.clip(df[col], rolling_lower, rolling_upper)\n", + " \n", + " return df\n", + "\n", + "def select_top_features_by_rankic(df: pd.DataFrame, feature_columns: list, n: int, target_column: str = 'future_return') -> list:\n", + " \"\"\"\n", + " 计算给定特征与目标列的 RankIC,并返回 RankIC 绝对值最高的 n 个特征。\n", + "\n", + " Args:\n", + " df: 包含特征列和目标列的 Pandas DataFrame。\n", + " feature_columns: 包含所有待评估特征列名的列表。\n", + " n: 希望选取的 RankIC 绝对值最高的特征数量。\n", + " target_column: 目标列的名称,用于计算 RankIC。默认为 'future_return'。\n", + "\n", + " Returns:\n", + " 包含 RankIC 绝对值最高的 n 个特征列名的列表。\n", + " \"\"\"\n", + " numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns\n", + " numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", + " if target_column not in df.columns:\n", + " raise ValueError(f\"目标列 '{target_column}' 不存在于 DataFrame 中。\")\n", + "\n", + " rankic_scores = {}\n", + " for feature in numeric_columns:\n", + " if feature not in df.columns:\n", + " print(f\"警告: 特征列 '{feature}' 不存在于 DataFrame 中,已跳过。\")\n", + " continue\n", + "\n", + " # 计算特征与目标列的 RankIC (斯皮尔曼相关系数)\n", + " # dropna() 是为了处理缺失值,确保相关性计算不失败\n", + " valid_data = df[[feature, target_column]].dropna()\n", + " if len(valid_data) > 1: # 确保有足够的数据点进行相关性计算\n", + " # 计算斯皮尔曼相关性\n", + " correlation = valid_data[feature].corr(valid_data[target_column], method='spearman')\n", + " rankic_scores[feature] = abs(correlation) # 使用绝对值来衡量相关性强度\n", + " else:\n", + " rankic_scores[feature] = 0 # 数据不足,RankIC设为0或跳过\n", + "\n", + " # 将 RankIC 分数转换为 Series 便于排序\n", + " rankic_series = pd.Series(rankic_scores)\n", + "\n", + " # 按 RankIC 绝对值降序排序,选取前 n 个特征\n", + " # handle case where n might be larger than available features\n", + " n_actual = min(n, len(rankic_series))\n", + " top_features = rankic_series.sort_values(ascending=False).head(n_actual).index.tolist()\n", + " top_features = [col for col in feature_columns if col in top_features or col not in numeric_columns]\n", + " return top_features\n", + "\n", + "def create_deviation_within_dates(df, feature_columns):\n", + " groupby_col = 'cat_l2_code' # 使用 trade_date 进行分组\n", + " new_columns = {}\n", + " ret_feature_columns = feature_columns[:]\n", + "\n", + " # 自动选择所有数值型特征\n", + " num_features = [col for col in feature_columns if 'cat' not in col and 'index' not in col]\n", + "\n", + " # num_features = ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'cat_vol_spike', 'obv', 'maobv_6', 'return_5', 'return_10', 'return_20', 'std_return_5', 'std_return_15', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'act_factor5', 'act_factor6', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'alpha_022', 'alpha_003', 'alpha_007', 'alpha_013']\n", + " num_features = [col for col in num_features if 'cat' not in col and 'industry' not in col]\n", + " num_features = [col for col in num_features if 'limit' not in col]\n", + " num_features = [col for col in num_features if 'cyq' not in col]\n", + "\n", + " # 遍历所有数值型特征\n", + " for feature in num_features:\n", + " if feature == 'trade_date': # 不需要对 'trade_date' 计算偏差\n", + " continue\n", + "\n", + " # grouped_mean = df.groupby(['trade_date'])[feature].transform('mean')\n", + " # deviation_col_name = f'deviation_mean_{feature}'\n", + " # new_columns[deviation_col_name] = df[feature] - grouped_mean\n", + " # ret_feature_columns.append(deviation_col_name)\n", + "\n", + " grouped_mean = df.groupby(['trade_date', groupby_col])[feature].transform('mean')\n", + " deviation_col_name = f'deviation_mean_{feature}'\n", + " new_columns[deviation_col_name] = df[feature] - grouped_mean\n", + " ret_feature_columns.append(deviation_col_name)\n", + "\n", + " # 将新计算的偏差特征与原始 DataFrame 合并\n", + " df = pd.concat([df, pd.DataFrame(new_columns)], axis=1)\n", + "\n", + " # for feature in ['obv', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4']:\n", + " # df[f'deviation_industry_{feature}'] = df[feature] - df[f'industry_{feature}']\n", + "\n", + " return df, ret_feature_columns\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "47c12bb34062ae7a", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T14:57:50.841165Z", + "start_time": "2025-04-03T14:49:25.889057Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import polars as pl\n", + "import numpy as np\n", + "import gc\n", + "\n", + "# --- 配置参数 ---\n", + "days = 5\n", + "validation_days = 120 # 此处未使用,保留用于上下文\n", + "\n", + "\n", + "# --- 核心处理逻辑: Pandas 转 Polars,处理,再转回 Pandas ---\n", + "\n", + "# 1. Pandas DataFrame 转 Polars DataFrame\n", + "gc.collect() # 清理内存,为 Polars 腾出空间\n", + "df = pl.DataFrame(df)\n", + "\n", + "# 2. Polars 处理\n", + "# 确保数据已排序,对于 shift 操作至关重要\n", + "df = df.sort(['ts_code', 'trade_date'])\n", + "\n", + "# 计算 future_return\n", + "df = df.with_columns(\n", + " (\n", + " (pl.col('close').shift(-days).over('ts_code') / pl.col('close')) - 1\n", + " ).alias('future_return_1'),\n", + " (\n", + " (pl.col('close').shift(-2 * days).over('ts_code') / pl.col('close')) - 1\n", + " ).alias('future_return_2')\n", + ").with_columns(\n", + " (pl.col('future_return_1') + pl.col('future_return_2')).alias('future_return')\n", + ").drop(['future_return_1', 'future_return_2']) # 删除中间列\n", + "\n", + "# --- 修正:安全地计算 label ---\n", + "# 使用 pl.when().then().otherwise() 来处理 future_return 中的 NaN\n", + "# 如果 future_return 为空 (NaN),则 label 也设为 None (Polars 中整数列的空值)\n", + "# 否则,计算 qcut 并转换为整数\n", + "df = df.with_columns(\n", + " pl.col(\"future_return\").qcut(50, allow_duplicates=True).over(\"trade_date\").alias(\"label\")\n", + ")\n", + "\n", + "# 根据 future_return 的全局分位数进行过滤\n", + "lower_bound_quantile = df['future_return'].quantile(0.001)\n", + "upper_bound_fixed = 0.6 # 固定上限值\n", + "\n", + "# 3. Polars DataFrame 转回 Pandas DataFrame\n", + "# df_final_pd = df.to_pandas()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "29221dde", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "205\n" + ] + } + ], + "source": [ + "industry_df = pl.DataFrame(industry_df).sort('trade_date')\n", + "index_data = pl.DataFrame(index_data).sort('trade_date')\n", + "\n", + "feature_columns = (\n", + " df.head(10)\n", + " .join(industry_df, on=[\"cat_l2_code\", \"trade_date\"], how=\"left\")\n", + " .join(index_data, on=\"trade_date\", how=\"left\")\n", + " .columns\n", + ")\n", + "feature_columns = [col for col in feature_columns if col not in ['trade_date',\n", + " 'ts_code',\n", + " 'label']]\n", + "feature_columns = [col for col in feature_columns if 'future' not in col]\n", + "feature_columns = [col for col in feature_columns if 'label' not in col]\n", + "feature_columns = [col for col in feature_columns if 'score' not in col]\n", + "feature_columns = [col for col in feature_columns if 'gen' not in col]\n", + "feature_columns = [col for col in feature_columns if 'is_st' not in col]\n", + "feature_columns = [col for col in feature_columns if 'pe_ttm' not in col]\n", + "# feature_columns = [col for col in feature_columns if 'volatility' not in col]\n", + "# feature_columns = [col for col in feature_columns if 'circ_mv' not in col]\n", + "feature_columns = [col for col in feature_columns if 'code' not in col]\n", + "feature_columns = [col for col in feature_columns if col not in origin_columns]\n", + "feature_columns = [col for col in feature_columns if not col.startswith('_')]\n", + "# feature_columns = [col for col in feature_columns if col not in ['ts_code', 'trade_date', 'vol_std_5', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_007', 'consecutive_up_limit', 'mv_volatility', 'volume_growth', 'mv_growth', 'arbr']]\n", + "feature_columns = [col for col in feature_columns if col not in ['intraday_lg_flow_corr_20', \n", + " 'cap_neutral_cost_metric', \n", + " 'hurst_net_mf_vol_60', \n", + " 'complex_factor_deap_1', \n", + " 'lg_buy_consolidation_20',\n", + " 'cs_rank_ind_cap_neutral_pe',\n", + " 'cs_rank_opening_gap',\n", + " 'cs_rank_ind_adj_lg_flow']]\n", + "feature_columns = [col for col in feature_columns if col not in ['cat_reason', 'cat_is_on_top_list']]\n", + "print(len(feature_columns))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "03ee5daf", + "metadata": {}, + "outputs": [], + "source": [ + "# df = fill_nan_with_daily_median(df, feature_columns)\n", + "for feature_col in [col for col in feature_columns if col in df.columns]:\n", + " pl.col(feature_col).fill_null(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "b76ea08a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "shape: (3, 3)\n", + "┌───────────┬─────────────────────┬─────────────┐\n", + "│ ts_code ┆ trade_date ┆ log_circ_mv │\n", + "│ --- ┆ --- ┆ --- │\n", + "│ str ┆ datetime[ns] ┆ f64 │\n", + "╞═══════════╪═════════════════════╪═════════════╡\n", + "│ 000001.SZ ┆ 2019-01-02 00:00:00 ┆ 16.574219 │\n", + "│ 000001.SZ ┆ 2019-01-03 00:00:00 ┆ 16.583965 │\n", + "│ 000001.SZ ┆ 2019-01-04 00:00:00 ┆ 16.633371 │\n", + "└───────────┴─────────────────────┴─────────────┘\n", + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'holder_net_change_sum_10d', 'holder_increase_days_10d', 'holder_decrease_days_10d', 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_24', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "去除极值\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 100%|██████████| 144/144 [00:00<00:00, 170.19it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "标准化\n", + "开始截面 Z-Score 标准化...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Standardizing: 100%|██████████| 144/144 [00:00<00:00, 767.01it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 Z-Score 标准化完成。\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 100%|██████████| 144/144 [00:26<00:00, 5.49it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "开始截面 Z-Score 标准化...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Standardizing: 100%|██████████| 144/144 [00:03<00:00, 37.17it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 Z-Score 标准化完成。\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 0it [00:00, ?it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 0it [00:00, ?it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "feature_columns: ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'holder_net_change_sum_10d', 'holder_increase_days_10d', 'holder_decrease_days_10d', 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_24', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "df最小日期: 2019-01-02\n", + "df最大日期: 2025-05-30\n", + "148609\n", + "train_data最小日期: 2020-01-02\n", + "train_data最大日期: 2020-03-31\n", + "3591195\n", + "test_data最小日期: 2020-03-31\n", + "test_data最大日期: 2025-05-30\n", + "shape: (3, 3)\n", + "┌───────────┬─────────────────────┬─────────────┐\n", + "│ ts_code ┆ trade_date ┆ log_circ_mv │\n", + "│ --- ┆ --- ┆ --- │\n", + "│ str ┆ datetime[ns] ┆ f64 │\n", + "╞═══════════╪═════════════════════╪═════════════╡\n", + "│ 000001.SZ ┆ 2019-01-02 00:00:00 ┆ 16.574219 │\n", + "│ 000001.SZ ┆ 2019-01-03 00:00:00 ┆ 16.583965 │\n", + "│ 000001.SZ ┆ 2019-01-04 00:00:00 ┆ 16.633371 │\n", + "└───────────┴─────────────────────┴─────────────┘\n" + ] + } + ], + "source": [ + "from main.utils.data_process import * \n", + "\n", + "split_date = '2023-01-01'\n", + "split_date = pd.to_datetime('2020-03-31') # 将你的分割日期转换为 Pandas Timestamp\n", + "\n", + "# --- 训练数据处理 ---\n", + "train_data = df.filter(\n", + " (pl.col('trade_date') <= split_date) &\n", + " (pl.col('trade_date') >= pd.to_datetime('2020-01-01')) &\n", + " (pl.col('future_return') >= lower_bound_quantile) &\n", + " (pl.col('future_return') <= upper_bound_fixed)\n", + ")\n", + "\n", + "# --- 测试数据处理 ---\n", + "test_data = (\n", + " df.filter(\n", + " pl.col('trade_date') >= split_date\n", + " )\n", + ")\n", + "\n", + "print(df[['ts_code', 'trade_date', 'log_circ_mv']].head(3))\n", + "\n", + "numeric_columns = [\n", + " col for col, dtype in zip(df.columns, df.dtypes)\n", + " if dtype in [pl.Float64, pl.Float32, pl.Int64, pl.Int32]\n", + "]\n", + "numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", + "print(feature_columns)\n", + "\n", + "train_data = train_data.with_columns([\n", + " pl.when(pl.col(col).is_infinite())\n", + " .then(np.nan)\n", + " .otherwise(pl.col(col))\n", + " .alias(col)\n", + " for col in numeric_columns\n", + "])\n", + "test_data = test_data.with_columns([\n", + " pl.when(pl.col(col).is_infinite())\n", + " .then(np.nan)\n", + " .otherwise(pl.col(col))\n", + " .alias(col)\n", + " for col in numeric_columns\n", + "])\n", + "\n", + "\n", + "train_data = train_data.drop_nulls(subset=[col for col in feature_columns if col in train_data.columns])\n", + "test_data = test_data.drop_nulls(subset=[col for col in feature_columns if col in test_data.columns])\n", + "\n", + "transform_feature_columns = feature_columns\n", + "transform_feature_columns = [col for col in transform_feature_columns if col in feature_columns and not col.startswith('cat') and col in train_data.columns]\n", + "# transform_feature_columns.remove('undist_profit_ps')\n", + "print('去除极值')\n", + "train_data = train_data.to_pandas()\n", + "test_data = test_data.to_pandas()\n", + "gc.collect()\n", + "cs_mad_filter(train_data, transform_feature_columns)\n", + "print('标准化')\n", + "cs_zscore_standardize(train_data, transform_feature_columns)\n", + "\n", + "cs_mad_filter(test_data, transform_feature_columns)\n", + "cs_zscore_standardize(test_data, transform_feature_columns)\n", + "\n", + "mad_filter_feature_columns = [col for col in feature_columns if col not in transform_feature_columns and not col.startswith('cat') and col in train_data.columns]\n", + "cs_mad_filter(train_data, mad_filter_feature_columns)\n", + "cs_mad_filter(test_data, mad_filter_feature_columns)\n", + "\n", + "\n", + "print(f'feature_columns: {feature_columns}')\n", + "\n", + "\n", + "print(f\"df最小日期: {df['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + "print(f\"df最大日期: {df['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + "print(len(train_data))\n", + "print(f\"train_data最小日期: {train_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + "print(f\"train_data最大日期: {train_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + "print(len(test_data))\n", + "print(f\"test_data最小日期: {test_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + "print(f\"test_data最大日期: {test_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + "\n", + "cat_columns = [col for col in feature_columns if col.startswith('cat')]\n", + "for col in cat_columns:\n", + " train_data[col] = train_data[col].astype('category')\n", + " test_data[col] = test_data[col].astype('category')\n", + "\n", + "print(df[['ts_code', 'trade_date', 'log_circ_mv']].head(3))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "3ff2d1c5", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LogisticRegression\n", + "import matplotlib.pyplot as plt # 保持 matplotlib 导入,尽管LightGBM的绘图功能已移除\n", + "from sklearn.decomposition import PCA\n", + "import pandas as pd\n", + "import numpy as np\n", + "import datetime # 用于日期计算\n", + "from catboost import CatBoostClassifier, CatBoostRanker, CatBoostRegressor\n", + "from catboost import Pool\n", + "import lightgbm as lgb\n", + "from lightgbm import LGBMRanker, LGBMRegressor\n", + "\n", + "def train_model(train_data_df, feature_columns,\n", + " print_info=True, # 调整参数名,更通用\n", + " validation_days=180, use_pca=False, split_date=None,\n", + " target_column='label', type='light'): # 增加目标列参数\n", + "\n", + " print('train data size: ', len(train_data_df))\n", + " print(train_data_df[['ts_code', 'trade_date', 'log_circ_mv']])\n", + " # 确保数据按时间排序\n", + " train_data_df = train_data_df.sort_values(by='trade_date')\n", + "\n", + " # 去除标签为空的样本\n", + " initial_len = len(train_data_df)\n", + " train_data_df = train_data_df.dropna(subset=[target_column])\n", + "\n", + " if print_info:\n", + " print(f'原始样本数: {initial_len}, 去除标签为空后样本数: {len(train_data_df)}')\n", + "\n", + " # 提取特征和标签,只取数值型特征用于线性回归\n", + " \n", + " if split_date is None:\n", + " all_dates = train_data_df['trade_date'].unique() # 获取所有唯一的 trade_date\n", + " split_date = all_dates[-validation_days] # 划分点为倒数第 validation_days 天\n", + " train_data_split = train_data_df[train_data_df['trade_date'] < split_date] # 训练集\n", + " val_data_split = train_data_df[train_data_df['trade_date'] >= split_date] # 验证集\n", + "\n", + " train_data_split = train_data_split.sort_values('trade_date')\n", + " val_data_split = val_data_split.sort_values('trade_date')\n", + "\n", + " \n", + " X_train = train_data_split[feature_columns]\n", + " y_train = train_data_split[target_column]\n", + " \n", + " X_val = val_data_split[feature_columns]\n", + " y_val = val_data_split[target_column]\n", + "\n", + "\n", + " # # 标准化数值特征 (使用 StandardScaler 对训练集fit并transform, 对验证集只transform)\n", + " scaler = StandardScaler()\n", + " # X_train = scaler.fit_transform(X_train)\n", + "\n", + " # 训练线性回归模型\n", + " # model = LogisticRegression(random_state=42)\n", + " \n", + " # # 使用处理后的特征和样本权重进行训练\n", + " # model.fit(X_train, y_train)\n", + "\n", + "\n", + " if type == 'cat':\n", + " params = {\n", + " 'loss_function': 'QueryRMSE', # 适用于二分类\n", + " 'eval_metric': 'NDCG', # 评估指标\n", + " 'iterations': 1500,\n", + " 'learning_rate': 0.03,\n", + " 'depth': 8, # 控制模型复杂度\n", + " 'l2_leaf_reg': 1, # L2 正则化\n", + " 'verbose': 5000,\n", + " 'early_stopping_rounds': 300,\n", + " 'one_hot_max_size': 50,\n", + " # 'class_weights': [0.6, 1.2],\n", + " 'task_type': 'GPU',\n", + " 'has_time': True,\n", + " 'random_seed': 7\n", + " }\n", + " cat_features = [i for i, col in enumerate(feature_columns) if col.startswith('cat')]\n", + " group_train = train_data_split['trade_date'].factorize()[0]\n", + " group_val = val_data_split['trade_date'].factorize()[0]\n", + " train_pool = Pool(\n", + " data=X_train,\n", + " label=y_train,\n", + " group_id=group_train,\n", + " cat_features=cat_features\n", + " )\n", + " val_pool = Pool(\n", + " data=X_val,\n", + " label=y_val,\n", + " group_id=group_val,\n", + " cat_features=cat_features\n", + " )\n", + "\n", + "\n", + " model = CatBoostRanker(**params)\n", + " model.fit(train_pool,\n", + " eval_set=val_pool, \n", + " plot=True, \n", + " use_best_model=True\n", + " )\n", + " elif type == 'light':\n", + " label_gain = list(range(len(train_data_split[target_column].unique())))\n", + " \n", + " params = {\n", + " 'label_gain': [gain * gain for gain in label_gain],\n", + " 'objective': 'lambdarank',\n", + " 'metric': 'ndcg',\n", + " 'learning_rate': 0.01,\n", + " # 'num_leaves': 1024,\n", + " # 'min_data_in_leaf': 256,\n", + " # 'max_depth': 10,\n", + " # 'max_bin': 1024,\n", + " 'feature_fraction': 0.5,\n", + " 'bagging_fraction': 0.5,\n", + " 'bagging_freq': 5,\n", + " # 'lambda_l1': 1,\n", + " 'lambda_l2': 50,\n", + " 'boosting': 'gbdt',\n", + " 'verbosity': -1,\n", + " 'extra_trees': True,\n", + " # 'max_position': 5,\n", + " 'ndcg_at': '5',\n", + " 'quant_train_renew_leaf': True,\n", + " 'lambdarank_truncation_level': 10,\n", + " # 'lambdarank_position_bias_regularization': 1,\n", + " 'seed': 7\n", + " }\n", + " # feature_contri = [2 if feat.startswith('act_factor') or 'buy' in feat or 'sell' in feat else 1 for feat in feature_columns]\n", + " # params['feature_contri'] = feature_contri\n", + "\n", + " train_groups = train_data_split.groupby('trade_date').size().tolist()\n", + " val_groups = val_data_split.groupby('trade_date').size().tolist()\n", + "\n", + " categorical_feature = [col for col in feature_columns if 'cat' in col]\n", + " train_dataset = lgb.Dataset(\n", + " X_train, label=y_train, \n", + " group=train_groups,\n", + " categorical_feature=categorical_feature\n", + " )\n", + " val_dataset = lgb.Dataset(\n", + " X_val, label=y_val, \n", + " group=val_groups,\n", + " categorical_feature=categorical_feature\n", + " )\n", + "\n", + " evals = {}\n", + " callbacks = [lgb.log_evaluation(period=1000),\n", + " lgb.callback.record_evaluation(evals),\n", + " lgb.early_stopping(300, first_metric_only=False)\n", + " ]\n", + " # 训练模型\n", + " model = lgb.train(\n", + " params, train_dataset, num_boost_round=1000,\n", + " valid_sets=[train_dataset, val_dataset], valid_names=['train', 'valid'],\n", + " callbacks=callbacks\n", + " )\n", + "\n", + " # 打印特征重要性(如果需要)\n", + " if True:\n", + " lgb.plot_metric(evals)\n", + " lgb.plot_importance(model, importance_type='split', max_num_features=20)\n", + " plt.show()\n", + "\n", + " # from flaml import AutoML\n", + " # from sklearn.datasets import fetch_california_housing\n", + "\n", + " # # Initialize an AutoML instance\n", + " # model = AutoML()\n", + " # # Specify automl goal and constraint\n", + " # automl_settings = {\n", + " # \"time_budget\": 600, # in seconds\n", + " # \"metric\": \"ndcg@1\",\n", + " # \"task\": \"rank\",\n", + " # \"estimator_list\": [\n", + " # \"catboost\",\n", + " # \"lgbm\",\n", + " # \"xgboost\"\n", + " # ], \n", + " # \"ensemble\": {\n", + " # \"final_estimator\": LGBMRanker(),\n", + " # \"passthrough\": False,\n", + " # },\n", + " # }\n", + " # model.fit(X_train=X_train, y_train=y_train, groups=train_groups,\n", + " # X_val=X_val, y_val=y_val,groups_val=val_groups,\n", + " # mlflow_logging=False, **automl_settings)\n", + "\n", + "\n", + " return model, scaler, None # 返回训练好的模型、scaler 和 pca 对象" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "c6eb5cd4-e714-420a-ac48-39af3e11ee81", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T15:03:18.426481Z", + "start_time": "2025-04-03T15:02:19.926352Z" + } + }, + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[18]\u001b[39m\u001b[32m, line 9\u001b[39m\n\u001b[32m 4\u001b[39m \u001b[38;5;28mtype\u001b[39m = \u001b[33m'\u001b[39m\u001b[33mlight\u001b[39m\u001b[33m'\u001b[39m\n\u001b[32m 6\u001b[39m train_data[\u001b[33m'\u001b[39m\u001b[33mlabel2\u001b[39m\u001b[33m'\u001b[39m] = train_data.groupby(\u001b[33m'\u001b[39m\u001b[33mtrade_date\u001b[39m\u001b[33m'\u001b[39m, group_keys=\u001b[38;5;28;01mFalse\u001b[39;00m).apply(\u001b[38;5;28;01mlambda\u001b[39;00m x: x.nsmallest(\u001b[32m1000\u001b[39m, \u001b[33m'\u001b[39m\u001b[33mtotal_mv\u001b[39m\u001b[33m'\u001b[39m))[\u001b[33m'\u001b[39m\u001b[33mfuture_return\u001b[39m\u001b[33m'\u001b[39m].transform(\n\u001b[32m 7\u001b[39m \u001b[38;5;28;01mlambda\u001b[39;00m x: pd.qcut(x, q=\u001b[32m50\u001b[39m, labels=\u001b[38;5;28;01mFalse\u001b[39;00m, duplicates=\u001b[33m'\u001b[39m\u001b[33mdrop\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 8\u001b[39m )\n\u001b[32m----> \u001b[39m\u001b[32m9\u001b[39m test_data[\u001b[33m'\u001b[39m\u001b[33mlabel2\u001b[39m\u001b[33m'\u001b[39m] = \u001b[43mtest_data\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgroupby\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mtrade_date\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgroup_keys\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mapply\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43;01mlambda\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[43m.\u001b[49m\u001b[43mnsmallest\u001b[49m\u001b[43m(\u001b[49m\u001b[32;43m1000\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mtotal_mv\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m[\u001b[33m'\u001b[39m\u001b[33mfuture_return\u001b[39m\u001b[33m'\u001b[39m].transform(\n\u001b[32m 10\u001b[39m \u001b[38;5;28;01mlambda\u001b[39;00m x: pd.qcut(x, q=\u001b[32m50\u001b[39m, labels=\u001b[38;5;28;01mFalse\u001b[39;00m, duplicates=\u001b[33m'\u001b[39m\u001b[33mdrop\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 11\u001b[39m )\n\u001b[32m 13\u001b[39m \u001b[38;5;66;03m# feature_contri = [2 if feat.startswith('act_factor') or 'buy' in feat or 'sell' in feat else 1 for feat in feature_columns]\u001b[39;00m\n\u001b[32m 14\u001b[39m \u001b[38;5;66;03m# light_params['feature_contri'] = feature_contri\u001b[39;00m\n\u001b[32m 15\u001b[39m \u001b[38;5;66;03m# print(f'feature_contri: {feature_contri}')\u001b[39;00m\n\u001b[32m 16\u001b[39m model, scaler, pca = train_model(train_data.groupby(\u001b[33m'\u001b[39m\u001b[33mtrade_date\u001b[39m\u001b[33m'\u001b[39m, group_keys=\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[32m 17\u001b[39m .apply(\u001b[38;5;28;01mlambda\u001b[39;00m x: x.nsmallest(\u001b[32m1000\u001b[39m, \u001b[33m'\u001b[39m\u001b[33mtotal_mv\u001b[39m\u001b[33m'\u001b[39m))\n\u001b[32m 18\u001b[39m .merge(industry_df, on=[\u001b[33m'\u001b[39m\u001b[33mcat_l2_code\u001b[39m\u001b[33m'\u001b[39m, \u001b[33m'\u001b[39m\u001b[33mtrade_date\u001b[39m\u001b[33m'\u001b[39m], how=\u001b[33m'\u001b[39m\u001b[33mleft\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 19\u001b[39m .merge(index_data, on=\u001b[33m'\u001b[39m\u001b[33mtrade_date\u001b[39m\u001b[33m'\u001b[39m, how=\u001b[33m'\u001b[39m\u001b[33mleft\u001b[39m\u001b[33m'\u001b[39m), \n\u001b[32m 20\u001b[39m feature_columns, \u001b[38;5;28mtype\u001b[39m=\u001b[38;5;28mtype\u001b[39m, target_column=\u001b[33m'\u001b[39m\u001b[33mlabel2\u001b[39m\u001b[33m'\u001b[39m)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/groupby/groupby.py:1824\u001b[39m, in \u001b[36mGroupBy.apply\u001b[39m\u001b[34m(self, func, include_groups, *args, **kwargs)\u001b[39m\n\u001b[32m 1822\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m option_context(\u001b[33m\"\u001b[39m\u001b[33mmode.chained_assignment\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[32m 1823\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1824\u001b[39m result = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_python_apply_general\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_selected_obj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1825\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[32m 1826\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m.obj, Series)\n\u001b[32m 1827\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m._selection \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 1828\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m._selected_obj.shape != \u001b[38;5;28mself\u001b[39m._obj_with_exclusions.shape\n\u001b[32m 1829\u001b[39m ):\n\u001b[32m 1830\u001b[39m warnings.warn(\n\u001b[32m 1831\u001b[39m message=_apply_groupings_depr.format(\n\u001b[32m 1832\u001b[39m \u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28mself\u001b[39m).\u001b[34m__name__\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mapply\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m (...)\u001b[39m\u001b[32m 1835\u001b[39m stacklevel=find_stack_level(),\n\u001b[32m 1836\u001b[39m )\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/groupby/groupby.py:1885\u001b[39m, in \u001b[36mGroupBy._python_apply_general\u001b[39m\u001b[34m(self, f, data, not_indexed_same, is_transform, is_agg)\u001b[39m\n\u001b[32m 1850\u001b[39m \u001b[38;5;129m@final\u001b[39m\n\u001b[32m 1851\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_python_apply_general\u001b[39m(\n\u001b[32m 1852\u001b[39m \u001b[38;5;28mself\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 1857\u001b[39m is_agg: \u001b[38;5;28mbool\u001b[39m = \u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[32m 1858\u001b[39m ) -> NDFrameT:\n\u001b[32m 1859\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 1860\u001b[39m \u001b[33;03m Apply function f in python space\u001b[39;00m\n\u001b[32m 1861\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 1883\u001b[39m \u001b[33;03m data after applying f\u001b[39;00m\n\u001b[32m 1884\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1885\u001b[39m values, mutated = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_grouper\u001b[49m\u001b[43m.\u001b[49m\u001b[43mapply_groupwise\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43maxis\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1886\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m not_indexed_same \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 1887\u001b[39m not_indexed_same = mutated\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/groupby/ops.py:919\u001b[39m, in \u001b[36mBaseGrouper.apply_groupwise\u001b[39m\u001b[34m(self, f, data, axis)\u001b[39m\n\u001b[32m 917\u001b[39m \u001b[38;5;66;03m# group might be modified\u001b[39;00m\n\u001b[32m 918\u001b[39m group_axes = group.axes\n\u001b[32m--> \u001b[39m\u001b[32m919\u001b[39m res = \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgroup\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 920\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m mutated \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m _is_indexed_like(res, group_axes, axis):\n\u001b[32m 921\u001b[39m mutated = \u001b[38;5;28;01mTrue\u001b[39;00m\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[18]\u001b[39m\u001b[32m, line 9\u001b[39m, in \u001b[36m\u001b[39m\u001b[34m(x)\u001b[39m\n\u001b[32m 4\u001b[39m \u001b[38;5;28mtype\u001b[39m = \u001b[33m'\u001b[39m\u001b[33mlight\u001b[39m\u001b[33m'\u001b[39m\n\u001b[32m 6\u001b[39m train_data[\u001b[33m'\u001b[39m\u001b[33mlabel2\u001b[39m\u001b[33m'\u001b[39m] = train_data.groupby(\u001b[33m'\u001b[39m\u001b[33mtrade_date\u001b[39m\u001b[33m'\u001b[39m, group_keys=\u001b[38;5;28;01mFalse\u001b[39;00m).apply(\u001b[38;5;28;01mlambda\u001b[39;00m x: x.nsmallest(\u001b[32m1000\u001b[39m, \u001b[33m'\u001b[39m\u001b[33mtotal_mv\u001b[39m\u001b[33m'\u001b[39m))[\u001b[33m'\u001b[39m\u001b[33mfuture_return\u001b[39m\u001b[33m'\u001b[39m].transform(\n\u001b[32m 7\u001b[39m \u001b[38;5;28;01mlambda\u001b[39;00m x: pd.qcut(x, q=\u001b[32m50\u001b[39m, labels=\u001b[38;5;28;01mFalse\u001b[39;00m, duplicates=\u001b[33m'\u001b[39m\u001b[33mdrop\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 8\u001b[39m )\n\u001b[32m----> \u001b[39m\u001b[32m9\u001b[39m test_data[\u001b[33m'\u001b[39m\u001b[33mlabel2\u001b[39m\u001b[33m'\u001b[39m] = test_data.groupby(\u001b[33m'\u001b[39m\u001b[33mtrade_date\u001b[39m\u001b[33m'\u001b[39m, group_keys=\u001b[38;5;28;01mFalse\u001b[39;00m).apply(\u001b[38;5;28;01mlambda\u001b[39;00m x: \u001b[43mx\u001b[49m\u001b[43m.\u001b[49m\u001b[43mnsmallest\u001b[49m\u001b[43m(\u001b[49m\u001b[32;43m1000\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mtotal_mv\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m)\u001b[49m)[\u001b[33m'\u001b[39m\u001b[33mfuture_return\u001b[39m\u001b[33m'\u001b[39m].transform(\n\u001b[32m 10\u001b[39m \u001b[38;5;28;01mlambda\u001b[39;00m x: pd.qcut(x, q=\u001b[32m50\u001b[39m, labels=\u001b[38;5;28;01mFalse\u001b[39;00m, duplicates=\u001b[33m'\u001b[39m\u001b[33mdrop\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 11\u001b[39m )\n\u001b[32m 13\u001b[39m \u001b[38;5;66;03m# feature_contri = [2 if feat.startswith('act_factor') or 'buy' in feat or 'sell' in feat else 1 for feat in feature_columns]\u001b[39;00m\n\u001b[32m 14\u001b[39m \u001b[38;5;66;03m# light_params['feature_contri'] = feature_contri\u001b[39;00m\n\u001b[32m 15\u001b[39m \u001b[38;5;66;03m# print(f'feature_contri: {feature_contri}')\u001b[39;00m\n\u001b[32m 16\u001b[39m model, scaler, pca = train_model(train_data.groupby(\u001b[33m'\u001b[39m\u001b[33mtrade_date\u001b[39m\u001b[33m'\u001b[39m, group_keys=\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[32m 17\u001b[39m .apply(\u001b[38;5;28;01mlambda\u001b[39;00m x: x.nsmallest(\u001b[32m1000\u001b[39m, \u001b[33m'\u001b[39m\u001b[33mtotal_mv\u001b[39m\u001b[33m'\u001b[39m))\n\u001b[32m 18\u001b[39m .merge(industry_df, on=[\u001b[33m'\u001b[39m\u001b[33mcat_l2_code\u001b[39m\u001b[33m'\u001b[39m, \u001b[33m'\u001b[39m\u001b[33mtrade_date\u001b[39m\u001b[33m'\u001b[39m], how=\u001b[33m'\u001b[39m\u001b[33mleft\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m 19\u001b[39m .merge(index_data, on=\u001b[33m'\u001b[39m\u001b[33mtrade_date\u001b[39m\u001b[33m'\u001b[39m, how=\u001b[33m'\u001b[39m\u001b[33mleft\u001b[39m\u001b[33m'\u001b[39m), \n\u001b[32m 20\u001b[39m feature_columns, \u001b[38;5;28mtype\u001b[39m=\u001b[38;5;28mtype\u001b[39m, target_column=\u001b[33m'\u001b[39m\u001b[33mlabel2\u001b[39m\u001b[33m'\u001b[39m)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/frame.py:7756\u001b[39m, in \u001b[36mDataFrame.nsmallest\u001b[39m\u001b[34m(self, n, columns, keep)\u001b[39m\n\u001b[32m 7646\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mnsmallest\u001b[39m(\n\u001b[32m 7647\u001b[39m \u001b[38;5;28mself\u001b[39m, n: \u001b[38;5;28mint\u001b[39m, columns: IndexLabel, keep: NsmallestNlargestKeep = \u001b[33m\"\u001b[39m\u001b[33mfirst\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 7648\u001b[39m ) -> DataFrame:\n\u001b[32m 7649\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 7650\u001b[39m \u001b[33;03m Return the first `n` rows ordered by `columns` in ascending order.\u001b[39;00m\n\u001b[32m 7651\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 7754\u001b[39m \u001b[33;03m Nauru 337000 182 NR\u001b[39;00m\n\u001b[32m 7755\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m7756\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mselectn\u001b[49m\u001b[43m.\u001b[49m\u001b[43mSelectNFrame\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mn\u001b[49m\u001b[43m=\u001b[49m\u001b[43mn\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkeep\u001b[49m\u001b[43m=\u001b[49m\u001b[43mkeep\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcolumns\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcolumns\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mnsmallest\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/methods/selectn.py:61\u001b[39m, in \u001b[36mSelectN.nsmallest\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 59\u001b[39m \u001b[38;5;129m@final\u001b[39m\n\u001b[32m 60\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mnsmallest\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[32m---> \u001b[39m\u001b[32m61\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mcompute\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mnsmallest\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/methods/selectn.py:218\u001b[39m, in \u001b[36mSelectNFrame.compute\u001b[39m\u001b[34m(self, method)\u001b[39m\n\u001b[32m 216\u001b[39m \u001b[38;5;66;03m# Below we save and reset the index in case index contains duplicates\u001b[39;00m\n\u001b[32m 217\u001b[39m original_index = frame.index\n\u001b[32m--> \u001b[39m\u001b[32m218\u001b[39m cur_frame = frame = \u001b[43mframe\u001b[49m\u001b[43m.\u001b[49m\u001b[43mreset_index\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdrop\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[32m 219\u001b[39m cur_n = n\n\u001b[32m 220\u001b[39m indexer = Index([], dtype=np.int64)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/frame.py:6417\u001b[39m, in \u001b[36mDataFrame.reset_index\u001b[39m\u001b[34m(self, level, drop, inplace, col_level, col_fill, allow_duplicates, names)\u001b[39m\n\u001b[32m 6415\u001b[39m new_obj = \u001b[38;5;28mself\u001b[39m\n\u001b[32m 6416\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m6417\u001b[39m new_obj = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mcopy\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdeep\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[32m 6418\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m allow_duplicates \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m lib.no_default:\n\u001b[32m 6419\u001b[39m allow_duplicates = validate_bool_kwarg(allow_duplicates, \u001b[33m\"\u001b[39m\u001b[33mallow_duplicates\u001b[39m\u001b[33m\"\u001b[39m)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/generic.py:6811\u001b[39m, in \u001b[36mNDFrame.copy\u001b[39m\u001b[34m(self, deep)\u001b[39m\n\u001b[32m 6662\u001b[39m \u001b[38;5;129m@final\u001b[39m\n\u001b[32m 6663\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mcopy\u001b[39m(\u001b[38;5;28mself\u001b[39m, deep: bool_t | \u001b[38;5;28;01mNone\u001b[39;00m = \u001b[38;5;28;01mTrue\u001b[39;00m) -> Self:\n\u001b[32m 6664\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 6665\u001b[39m \u001b[33;03m Make a copy of this object's indices and data.\u001b[39;00m\n\u001b[32m 6666\u001b[39m \n\u001b[32m (...)\u001b[39m\u001b[32m 6809\u001b[39m \u001b[33;03m dtype: int64\u001b[39;00m\n\u001b[32m 6810\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m6811\u001b[39m data = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_mgr\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcopy\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdeep\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdeep\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 6812\u001b[39m \u001b[38;5;28mself\u001b[39m._clear_item_cache()\n\u001b[32m 6813\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._constructor_from_mgr(data, axes=data.axes).__finalize__(\n\u001b[32m 6814\u001b[39m \u001b[38;5;28mself\u001b[39m, method=\u001b[33m\"\u001b[39m\u001b[33mcopy\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 6815\u001b[39m )\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/internals/managers.py:593\u001b[39m, in \u001b[36mBaseBlockManager.copy\u001b[39m\u001b[34m(self, deep)\u001b[39m\n\u001b[32m 590\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 591\u001b[39m new_axes = \u001b[38;5;28mlist\u001b[39m(\u001b[38;5;28mself\u001b[39m.axes)\n\u001b[32m--> \u001b[39m\u001b[32m593\u001b[39m res = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mapply\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mcopy\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdeep\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdeep\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 594\u001b[39m res.axes = new_axes\n\u001b[32m 596\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.ndim > \u001b[32m1\u001b[39m:\n\u001b[32m 597\u001b[39m \u001b[38;5;66;03m# Avoid needing to re-compute these\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/internals/managers.py:363\u001b[39m, in \u001b[36mBaseBlockManager.apply\u001b[39m\u001b[34m(self, f, align_keys, **kwargs)\u001b[39m\n\u001b[32m 361\u001b[39m applied = b.apply(f, **kwargs)\n\u001b[32m 362\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m363\u001b[39m applied = \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 364\u001b[39m result_blocks = extend_blocks(applied, result_blocks)\n\u001b[32m 366\u001b[39m out = \u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28mself\u001b[39m).from_blocks(result_blocks, \u001b[38;5;28mself\u001b[39m.axes)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/stock/lib/python3.13/site-packages/pandas/core/internals/blocks.py:796\u001b[39m, in \u001b[36mBlock.copy\u001b[39m\u001b[34m(self, deep)\u001b[39m\n\u001b[32m 794\u001b[39m refs: BlockValuesRefs | \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 795\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m deep:\n\u001b[32m--> \u001b[39m\u001b[32m796\u001b[39m values = \u001b[43mvalues\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcopy\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 797\u001b[39m refs = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 798\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "\u001b[31mKeyboardInterrupt\u001b[39m: " + ] + } + ], + "source": [ + "\n", + "gc.collect()\n", + "\n", + "use_pca = False\n", + "type = 'light'\n", + "\n", + "train_data['label2'] = train_data.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(1000, 'total_mv'))['future_return'].transform(\n", + " lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n", + ")\n", + "test_data['label2'] = test_data.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(1000, 'total_mv'))['future_return'].transform(\n", + " lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n", + ")\n", + "\n", + "# feature_contri = [2 if feat.startswith('act_factor') or 'buy' in feat or 'sell' in feat else 1 for feat in feature_columns]\n", + "# light_params['feature_contri'] = feature_contri\n", + "# print(f'feature_contri: {feature_contri}')\n", + "model, scaler, pca = train_model(train_data.groupby('trade_date', group_keys=False)\n", + " .apply(lambda x: x.nsmallest(1000, 'total_mv'))\n", + " .merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", + " .merge(index_data, on='trade_date', how='left'), \n", + " feature_columns, type=type, target_column='label2')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d1522a7538db91b", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T15:04:39.656944Z", + "start_time": "2025-04-03T15:04:39.298483Z" + } + }, + "outputs": [], + "source": [ + "score_df = test_data.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(1000, 'total_mv'))\n", + "# score_df = fill_nan_with_daily_median(score_df, ['pe_ttm'])\n", + "# score_df = score_df[score_df['pe_ttm'] > 0]\n", + "score_df = score_df.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", + "score_df = score_df.merge(index_data, on='trade_date', how='left')\n", + "# score_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(50, 'total_mv')).reset_index()\n", + "numeric_columns = score_df.select_dtypes(include=['float64', 'int64']).columns\n", + "numeric_columns = [col for col in feature_columns if col in numeric_columns]\n", + "\n", + "if type == 'cat':\n", + " score_df['score'] = model.predict(score_df[feature_columns])\n", + "elif type == 'light':\n", + " score_df['score'] = model.predict(score_df[feature_columns])\n", + "score_df['score_ranks'] = score_df.groupby('trade_date')['score'].rank(ascending=True)\n", + "\n", + "score_df = score_df.groupby('trade_date', group_keys=False).apply(\n", + " lambda x: \n", + " x[\n", + " # (x['score'] <= x['score'].quantile(0.99)) & \n", + " (x['score'] >= x['score'].quantile(0.90))\n", + " ] # 计算90%分位数作为阈值,筛选分数>=阈值的行\n", + ").reset_index(drop=True) # drop=True 避免添加旧索引列\n", + "# df_to_drop = score_df.loc[score_df.groupby('trade_date')['score'].idxmax()]\n", + "# score_df = score_df.drop(df_to_drop.index)\n", + "save_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nlargest(5, 'score')).reset_index()\n", + "# save_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(2, 'total_mv')).reset_index()\n", + "save_df = save_df.sort_values(['trade_date', 'score'])\n", + "save_df[['trade_date', 'score', 'ts_code']].to_csv('predictions_test.tsv', index=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fed2d6c3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-01-03 00:00:00\n" + ] + } + ], + "source": [ + "print(test_data['trade_date'].min())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f3c1331", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "成功连接到 Redis 服务器: 140.143.91.66:6389,数据库 0\n", + "DataFrame 已使用 Pickle 序列化并写入 Redis,键为 'save_df'\n", + "从 Redis 读取到的 Pickle 序列化数据 (前 20 字节):\n", + "b'\\x80\\x04\\x95\\xbf\\x04\\x01\\x00\\x00\\x00\\x00\\x00\\x8c\\x11pandas.'\n", + "\n", + "从 Redis 加载的 DataFrame (使用 Pickle):\n", + " index ts_code trade_date open close high low vol \\\n", + "4 36 002247.SZ 2023-01-03 16.15 16.80 16.87 16.09 0.514578 \n", + "3 26 002513.SZ 2023-01-03 15.41 15.77 15.95 15.41 -0.499029 \n", + "2 14 002629.SZ 2023-01-03 15.17 15.54 15.58 15.13 0.631716 \n", + "1 5 603030.SH 2023-01-03 8.08 8.32 8.32 8.05 -0.033641 \n", + "0 3 000691.SZ 2023-01-03 13.87 14.24 14.36 13.63 -0.030740 \n", + "... ... ... ... ... ... ... ... ... \n", + "2904 58031 002524.SZ 2025-05-30 19.49 19.40 20.27 19.31 0.455783 \n", + "2903 58034 002084.SZ 2025-05-30 11.88 11.68 11.88 11.58 0.610122 \n", + "2902 58029 600159.SH 2025-05-30 13.66 13.55 13.86 13.50 -0.170606 \n", + "2901 58035 002775.SZ 2025-05-30 17.84 17.55 17.84 17.41 -0.705858 \n", + "2900 58019 600408.SH 2025-05-30 8.64 8.51 8.64 8.43 0.684604 \n", + "\n", + " pct_chg amount ... 000905.SH_up_ratio_20d \\\n", + "4 0.715898 31834.487 ... 0.3 \n", + "3 0.121763 25452.447 ... 0.3 \n", + "2 0.299045 55379.071 ... 0.3 \n", + "1 0.241548 22271.706 ... 0.3 \n", + "0 0.279880 38602.205 ... 0.3 \n", + "... ... ... ... ... \n", + "2904 0.552905 76113.818 ... 0.6 \n", + "2903 -0.070682 67595.352 ... 0.6 \n", + "2902 0.005989 28573.069 ... 0.6 \n", + "2901 0.241111 19025.635 ... 0.6 \n", + "2900 0.788027 40827.689 ... 0.6 \n", + "\n", + " 399006.SZ_up_ratio_20d 000852.SH_volatility 000905.SH_volatility \\\n", + "4 0.40 1.036997 0.828596 \n", + "3 0.40 1.036997 0.828596 \n", + "2 0.40 1.036997 0.828596 \n", + "1 0.40 1.036997 0.828596 \n", + "0 0.40 1.036997 0.828596 \n", + "... ... ... ... \n", + "2904 0.45 1.089861 0.850444 \n", + "2903 0.45 1.089861 0.850444 \n", + "2902 0.45 1.089861 0.850444 \n", + "2901 0.45 1.089861 0.850444 \n", + "2900 0.45 1.089861 0.850444 \n", + "\n", + " 399006.SZ_volatility 000852.SH_volume_change_rate \\\n", + "4 0.935322 5.203088 \n", + "3 0.935322 5.203088 \n", + "2 0.935322 5.203088 \n", + "1 0.935322 5.203088 \n", + "0 0.935322 5.203088 \n", + "... ... ... \n", + "2904 1.195355 -2.039466 \n", + "2903 1.195355 -2.039466 \n", + "2902 1.195355 -2.039466 \n", + "2901 1.195355 -2.039466 \n", + "2900 1.195355 -2.039466 \n", + "\n", + " 000905.SH_volume_change_rate 399006.SZ_volume_change_rate score \\\n", + "4 -0.750721 8.827360 0.042645 \n", + "3 -0.750721 8.827360 0.047474 \n", + "2 -0.750721 8.827360 0.055433 \n", + "1 -0.750721 8.827360 0.061053 \n", + "0 -0.750721 8.827360 0.068349 \n", + "... ... ... ... \n", + "2904 -12.002493 5.078672 0.064251 \n", + "2903 -12.002493 5.078672 0.064517 \n", + "2902 -12.002493 5.078672 0.065030 \n", + "2901 -12.002493 5.078672 0.068848 \n", + "2900 -12.002493 5.078672 0.074780 \n", + "\n", + " score_ranks \n", + "4 996.0 \n", + "3 997.0 \n", + "2 998.0 \n", + "1 999.0 \n", + "0 1000.0 \n", + "... ... \n", + "2904 996.0 \n", + "2903 997.0 \n", + "2902 998.0 \n", + "2901 999.0 \n", + "2900 1000.0 \n", + "\n", + "[2905 rows x 248 columns]\n", + "\n", + "验证成功:原始 DataFrame 和从 Redis 加载的 DataFrame 一致。\n", + "\n", + "清理了 Redis 中键 'save_df' 的数据。\n" + ] + } + ], + "source": [ + "import redis\n", + "import pickle\n", + "\n", + "redis_host = '140.143.91.66'\n", + "redis_port = 6389\n", + "redis_db = 0\n", + "redis_key = 'save_df'\n", + "\n", + "try:\n", + " # 1. 连接到 Redis 服务器\n", + " r = redis.Redis(host=redis_host, port=redis_port, db=redis_db, password='Redis520102')\n", + " r.ping()\n", + " print(f\"\\n成功连接到 Redis 服务器: {redis_host}:{redis_port},数据库 {redis_db}\")\n", + "\n", + " # 2. 将 DataFrame 写入 Redis (使用 Pickle 序列化)\n", + " df_serialized = pickle.dumps(save_df)\n", + " r.set(redis_key, df_serialized)\n", + " print(f\"DataFrame 已使用 Pickle 序列化并写入 Redis,键为 '{redis_key}'\")\n", + "\n", + " # 3. 从 Redis 读取数据 (获取 Pickle 序列化的字节流)\n", + " retrieved_serialized = r.get(redis_key)\n", + "\n", + " if retrieved_serialized:\n", + " print(f\"从 Redis 读取到的 Pickle 序列化数据 (前 20 字节):\")\n", + " print(retrieved_serialized[:20])\n", + "\n", + " # 4. 使用 Pickle 反序列化回 Pandas DataFrame\n", + " loaded_df = pickle.loads(retrieved_serialized)\n", + " print(\"\\n从 Redis 加载的 DataFrame (使用 Pickle):\")\n", + " print(loaded_df)\n", + "\n", + " # 5. 验证原始 DataFrame 和加载的 DataFrame 是否一致\n", + " if save_df.equals(loaded_df):\n", + " print(\"\\n验证成功:原始 DataFrame 和从 Redis 加载的 DataFrame 一致。\")\n", + " else:\n", + " print(\"\\n验证失败:原始 DataFrame 和从 Redis 加载的 DataFrame 不一致!\")\n", + "\n", + " else:\n", + " print(f\"错误:无法从 Redis 获取键 '{redis_key}' 的值。\")\n", + "\n", + " # 6. 清理测试数据 (可选)\n", + " r.delete(redis_key)\n", + " print(f\"\\n清理了 Redis 中键 '{redis_key}' 的数据。\")\n", + "\n", + "except redis.exceptions.ConnectionError as e:\n", + " print(f\"无法连接到 Redis 服务器: {e}\")\n", + " print(\"请确保您的 Redis 服务器已启动并且主机和端口配置正确。\")\n", + "except redis.exceptions.TimeoutError as e:\n", + " print(f\"连接 Redis 服务器超时: {e}\")\n", + " print(\"请检查您的网络连接和 Redis 服务器状态。\")\n", + "except Exception as e:\n", + " print(f\"测试 Redis 时发生未知错误: {e}\")\n", + " print(f\"测试 Redis 时发生未知错误: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "09b1799e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "205\n", + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'holder_net_change_sum_10d', 'holder_increase_days_10d', 'holder_decrease_days_10d', 'holder_any_increase_flag_10d', 'holder_any_decrease_flag_10d', 'cat_senti_mom_vol_spike', 'cat_senti_pre_breakout', 'ts_turnover_rate_acceleration_5_20', 'ts_vol_sustain_10_30', 'cs_amount_outlier_10', 'ts_ff_to_total_turnover_ratio', 'ts_price_volume_trend_coherence_5_20', 'ts_ff_turnover_rate_surge_10', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'senti_strong_inflow', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n" + ] + } + ], + "source": [ + "print(len(feature_columns))\n", + "print(feature_columns)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bceabd1f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "警告: DataFrame 中没有 'group_id' 列。假设整个 DataFrame 是一个需要排序的组。\n", + "\n", + "NDCG 结果\n", + "{'ndcg@1': np.float64(0.4489795918367347), 'ndcg@3': np.float64(0.40668217598446815), 'ndcg@5': np.float64(0.45584495629735)}\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "def calculate_ndcg(df: pd.DataFrame, score_col: str, label_col: str, group_id: str = 'trade_date', k_values: list = [1, 3, 5, 10]):\n", + " \"\"\"\n", + " 计算 DataFrame 中 score 列和 label 列的 NDCG 值。\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 包含 score (排序学习预测分数) 和 label (相关性标签) 的 DataFrame。\n", + " 假设每个需要排序的组(例如,每天的股票)在 DataFrame 中是连续的。\n", + " score_col (str): 包含模型预测分数的列名。\n", + " label_col (str): 包含相关性标签的列名。标签值越高表示相关性越高。\n", + " k_values (list): 一个整数列表,表示计算 NDCG 的 top-k 值。\n", + " 例如,[1, 3, 5] 将计算 NDCG@1, NDCG@3 和 NDCG@5。\n", + "\n", + " Returns:\n", + " dict: 一个字典,包含每个 k 值对应的平均 NDCG 值。\n", + " 例如: {'ndcg@1': 0.85, 'ndcg@3': 0.78, 'ndcg@5': 0.72, 'ndcg@10': 0.65}\n", + " \"\"\"\n", + " ndcg_scores = {f'ndcg@{k}': [] for k in k_values}\n", + "\n", + " def dcg_at_k(r, k):\n", + " r = np.asarray(r)[:k] if len(r) > 0 else np.zeros(k)\n", + " return np.sum(r / np.log2(np.arange(2, r.size + 2)))\n", + "\n", + " def ndcg_at_k(r, k):\n", + " dcg_max = dcg_at_k(sorted(r, reverse=True), k)\n", + " if not dcg_max:\n", + " return 0.\n", + " return dcg_at_k(r, k) / dcg_max\n", + "\n", + " # 假设 DataFrame 已经按照需要排序的组(例如,'trade_date')进行了分组,\n", + " # 并且每个组内的顺序不重要,我们只需要计算每个组的 NDCG。\n", + " # 如果需要按特定组计算 NDCG,请先对 DataFrame 进行分组。\n", + " if group_id not in df.columns:\n", + " print(\"警告: DataFrame 中没有 'group_id' 列。假设整个 DataFrame 是一个需要排序的组。\")\n", + " group_df = df.sort_values(by=score_col, ascending=False)\n", + " relevant_labels = group_df[label_col].values\n", + " for k in k_values:\n", + " ndcg_scores[f'ndcg@{k}'].append(ndcg_at_k(relevant_labels, k))\n", + " else:\n", + " for _, group_df in df.groupby(group_id):\n", + " group_df_sorted = group_df.sort_values(by=score_col, ascending=False)\n", + " relevant_labels = group_df_sorted[label_col].values\n", + " for k in k_values:\n", + " ndcg_scores[f'ndcg@{k}'].append(ndcg_at_k(relevant_labels, k))\n", + "\n", + " avg_ndcg = {k: np.mean(v) if v else np.nan for k, v in ndcg_scores.items()}\n", + " return avg_ndcg\n", + "\n", + "\n", + "ndcg_results_single_group = calculate_ndcg(score_df, score_col='score', label_col='label', k_values=[1, 3, 5], group_id=None)\n", + "print(\"\\nNDCG 结果\")\n", + "print(ndcg_results_single_group)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44f64679", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ts_code trade_date open close high low vol pct_chg \\\n", + "1632028 002652.SZ 2019-01-02 19.59 19.64 19.89 19.28 20196.79 1.03 \n", + "1632029 002652.SZ 2019-01-03 19.74 19.44 19.84 19.33 15731.99 -1.02 \n", + "1632030 002652.SZ 2019-01-04 19.33 19.94 19.99 19.08 21099.93 2.57 \n", + "1632031 002652.SZ 2019-01-07 20.04 21.95 21.95 20.04 83534.19 10.08 \n", + "1632032 002652.SZ 2019-01-08 23.21 21.65 23.87 21.65 149377.97 -1.37 \n", + "... ... ... ... ... ... ... ... ... \n", + "1633576 002652.SZ 2025-05-26 14.75 14.85 15.11 14.55 99560.80 1.02 \n", + "1633577 002652.SZ 2025-05-27 14.90 15.00 15.11 14.70 101184.00 1.01 \n", + "1633578 002652.SZ 2025-05-28 15.11 14.85 15.16 14.80 75859.20 -1.00 \n", + "1633579 002652.SZ 2025-05-29 15.00 15.36 15.36 14.85 126044.40 3.43 \n", + "1633580 002652.SZ 2025-05-30 15.36 15.11 15.41 14.95 107732.00 -1.63 \n", + "\n", + " amount turnover_rate ... cs_rank_vol_x_profit_margin \\\n", + "1632028 7867.047 0.3964 ... 0.608839 \n", + "1632029 6121.460 0.3088 ... 0.586710 \n", + "1632030 8245.083 0.4141 ... 0.682847 \n", + "1632031 35514.117 1.6394 ... 0.987591 \n", + "1632032 67160.354 2.9317 ... 0.765693 \n", + "... ... ... ... ... \n", + "1633576 29428.560 1.9443 ... 0.652159 \n", + "1633577 30112.801 1.9760 ... 0.657694 \n", + "1633578 22507.876 1.4814 ... 0.664673 \n", + "1633579 38068.857 2.4615 ... 0.921236 \n", + "1633580 32385.927 2.1039 ... 0.702990 \n", + "\n", + " cs_rank_lg_flow_price_concordance cs_rank_turnover_per_winner \\\n", + "1632028 0.203142 0.864865 \n", + "1632029 0.156684 0.763417 \n", + "1632030 0.184009 0.660949 \n", + "1632031 0.734940 0.700000 \n", + "1632032 0.874042 0.914234 \n", + "... ... ... \n", + "1633576 0.122259 0.394684 \n", + "1633577 0.092722 0.414756 \n", + "1633578 0.684945 0.323363 \n", + "1633579 0.295779 0.390828 \n", + "1633580 0.705316 0.419934 \n", + "\n", + " cs_rank_ind_cap_neutral_pe cs_rank_volume_ratio \\\n", + "1632028 NaN 0.646930 \n", + "1632029 NaN 0.251279 \n", + "1632030 NaN 0.311724 \n", + "1632031 NaN 0.988313 \n", + "1632032 NaN 0.990142 \n", + "... ... ... \n", + "1633576 NaN 0.400997 \n", + "1633577 NaN 0.450150 \n", + "1633578 NaN 0.199236 \n", + "1633579 NaN 0.640744 \n", + "1633580 NaN 0.537542 \n", + "\n", + " cs_rank_elg_buy_sell_sm_ratio cs_rank_cost_dist_vol_ratio \\\n", + "1632028 0.341855 0.678941 \n", + "1632029 0.318912 0.402916 \n", + "1632030 0.260036 0.460713 \n", + "1632031 0.796350 0.988501 \n", + "1632032 0.598905 0.991571 \n", + "... ... ... \n", + "1633576 0.153987 0.620930 \n", + "1633577 0.156198 0.643403 \n", + "1633578 0.153373 0.484546 \n", + "1633579 0.623795 0.764374 \n", + "1633580 0.133056 0.703987 \n", + "\n", + " cs_rank_size future_return label \n", + "1632028 0.258948 0.158859 40.0 \n", + "1632029 0.258123 0.136831 37.0 \n", + "1632030 0.257664 0.106319 39.0 \n", + "1632031 0.290146 -0.072893 4.0 \n", + "1632032 0.282482 -0.057737 5.0 \n", + "... ... ... ... \n", + "1633576 0.032226 NaN NaN \n", + "1633577 0.032901 NaN NaN \n", + "1633578 0.032237 NaN NaN \n", + "1633579 0.034231 NaN NaN \n", + "1633580 0.033887 NaN NaN \n", + "\n", + "[1553 rows x 196 columns]\n" + ] + } + ], + "source": [ + "print(df[df['ts_code'] == '002652.SZ'])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "stock", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/main/utils/__pycache__/data_process.cpython-313.pyc b/main/utils/__pycache__/data_process.cpython-313.pyc new file mode 100644 index 0000000..8ba8266 Binary files /dev/null and b/main/utils/__pycache__/data_process.cpython-313.pyc differ diff --git a/main/utils/__pycache__/indicators.cpython-313.pyc b/main/utils/__pycache__/indicators.cpython-313.pyc new file mode 100644 index 0000000..e6ce69f Binary files /dev/null and b/main/utils/__pycache__/indicators.cpython-313.pyc differ diff --git a/main/utils/data_process.py b/main/utils/data_process.py new file mode 100644 index 0000000..9df9a2a --- /dev/null +++ b/main/utils/data_process.py @@ -0,0 +1,268 @@ +import pandas as pd +import numpy as np +import statsmodels.api as sm # 用于中性化回归 +from tqdm import tqdm + +epsilon = 1e-10 # 防止除零 + +def zscore_standardize(train_df: pd.DataFrame, test_df: pd.DataFrame, features: list, epsilon: float = 1e-10): + """ + 对指定特征列进行截面 Z-Score 标准化 (原地修改)。 + 方法: Z = (value - cross_sectional_mean) / (cross_sectional_std + epsilon) + + Args: + df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date' 和 features 列。 + features (list): 需要处理的特征列名列表。 + epsilon (float): 防止除以零的小常数。 + + WARNING: 此函数会原地修改输入的 DataFrame 'df'。 + """ + print("开始截面 Z-Score 标准化...") + if not all(col in train_df.columns for col in features): + missing = [col for col in features if col not in train_df.columns] + print(f"错误: DataFrame 中缺少以下特征列: {missing}。跳过标准化处理。") + return + + + for col in tqdm(features, desc="Standardizing"): + try: + # 使用 transform 计算截面均值和标准差 + mean = train_df[col].transform('mean') + std = train_df[col].transform('std') + + # 计算 Z-Score 并原地赋值 + train_df[col] = (train_df[col] - mean) / (std + epsilon) + test_df[col] = (test_df[col] - mean) / (std + epsilon) + + except KeyError: + print(f"警告: 列 '{col}' 可能不存在或在分组中出错,跳过此列的标准化处理。") + except Exception as e: + print(f"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的标准化处理。") + + print("截面 Z-Score 标准化完成。") + + +# --- 1. 中位数去极值 (MAD) --- + +def cs_mad_filter(df: pd.DataFrame, + features: list, + k: float = 3.0, + scale_factor: float = 1.4826): + """ + 对指定特征列进行截面 MAD 去极值处理 (原地修改)。 + + 方法: 对每日截面数据,计算 median 和 MAD, + 将超出 [median - k * scale * MAD, median + k * scale * MAD] 范围的值 + 替换为边界值 (Winsorization)。 + scale_factor=1.4826 使得 MAD 约等于正态分布的标准差。 + + Args: + df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date' 和 features 列。 + features (list): 需要处理的特征列名列表。 + k (float): MAD 的倍数,用于确定边界。默认为 3.0。 + scale_factor (float): MAD 的缩放因子。默认为 1.4826。 + + WARNING: 此函数会原地修改输入的 DataFrame 'df'。 + """ + print(f"开始截面 MAD 去极值处理 (k={k})...") + if not all(col in df.columns for col in features): + missing = [col for col in features if col not in df.columns] + print(f"错误: DataFrame 中缺少以下特征列: {missing}。跳过去极值处理。") + return + + grouped = df.groupby('trade_date') + + for col in tqdm(features, desc="MAD Filtering"): + try: + # 计算截面中位数 + median = grouped[col].transform('median') + # 计算截面 MAD (Median Absolute Deviation from Median) + mad = (df[col] - median).abs().groupby(df['trade_date']).transform('median') + + # 计算上下边界 + lower_bound = median - k * scale_factor * mad + upper_bound = median + k * scale_factor * mad + + # 原地应用 clip + df[col] = np.clip(df[col], lower_bound, upper_bound) + + except KeyError: + print(f"警告: 列 '{col}' 可能不存在或在分组中出错,跳过此列的 MAD 处理。") + except Exception as e: + print(f"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的 MAD 处理。") + + print("截面 MAD 去极值处理完成。") + + +# --- 2. 行业市值中性化 --- + +def cs_neutralize_industry_cap(df: pd.DataFrame, + features: list, + industry_col: str = 'cat_l2_code', + market_cap_col: str = 'circ_mv'): + """ + 对指定特征列进行截面行业和对数市值中性化 (原地修改)。 + 使用 OLS 回归: feature ~ 1 + log(market_cap) + C(industry) + 将回归残差写回原特征列。 + + Args: + df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date', features 列, + industry_col, market_cap_col。 + features (list): 需要处理的特征列名列表。 + industry_col (str): 行业分类列名。 + market_cap_col (str): 流通市值列名。 + + WARNING: 此函数会原地修改输入的 DataFrame 'df' 的 features 列。 + 计算量较大,可能耗时较长。 + 需要安装 statsmodels 库 (pip install statsmodels)。 + """ + print("开始截面行业市值中性化...") + required_cols = features + ['trade_date', industry_col, market_cap_col] + if not all(col in df.columns for col in required_cols): + missing = [col for col in required_cols if col not in df.columns] + print(f"错误: DataFrame 中缺少必需列: {missing}。无法进行中性化。") + return + + # 预处理:计算 log 市值,处理 industry code 可能的 NaN + log_cap_col = '_log_market_cap' + df[log_cap_col] = np.log1p(df[market_cap_col]) # log1p 处理 0 值 + # df[industry_col] = df[industry_col].cat.add_categories('UnknownIndustry') + # df[industry_col] = df[industry_col].fillna('UnknownIndustry') # 填充行业 NaN + # df[industry_col] = df[industry_col].astype('category') # 转为类别,ols 会自动处理 + + dates = df['trade_date'].unique() + all_residuals = [] # 用于收集所有日期的残差 + + for date in tqdm(dates, desc="Neutralizing"): + daily_data = df.loc[df['trade_date'] == date, features + [log_cap_col, industry_col]].copy() # 使用 .loc 获取副本 + + # 准备自变量 X (常数项 + log市值 + 行业哑变量) + X = daily_data[[log_cap_col]] + X = sm.add_constant(X, prepend=True) # 添加常数项 + # 创建行业哑变量 (drop_first=True 避免共线性) + industry_dummies = pd.get_dummies(daily_data[industry_col], prefix=industry_col, drop_first=True) + industry_dummies = industry_dummies.astype(int) + X = pd.concat([X, industry_dummies], axis=1) + + daily_residuals = daily_data[[col for col in features]].copy() # 创建用于存储残差的df + + for col in features: + Y = daily_data[col] + + # 处理 NaN 值,确保 X 和 Y 在相同位置有有效值 + valid_mask = Y.notna() & X.notna().all(axis=1) + if valid_mask.sum() < (X.shape[1] + 1): # 数据点不足以估计模型 + print(f"警告: 日期 {date}, 特征 {col} 有效数据不足 ({valid_mask.sum()}个),无法中性化,填充 NaN。") + daily_residuals[col] = np.nan + continue + + Y_valid = Y[valid_mask] + X_valid = X[valid_mask] + + # 执行 OLS 回归 + try: + model = sm.OLS(Y_valid.to_numpy(), X_valid.to_numpy()) + results = model.fit() + # 将残差填回对应位置 + daily_residuals.loc[valid_mask, col] = results.resid + daily_residuals.loc[~valid_mask, col] = np.nan # 原本无效的位置填充 NaN + except Exception as e: + print(f"警告: 日期 {date}, 特征 {col} 回归失败: {e},填充 NaN。") + daily_residuals[col] = np.nan + break + + all_residuals.append(daily_residuals) + + # 合并所有日期的残差结果 + if all_residuals: + residuals_df = pd.concat(all_residuals) + # 将残差结果更新回原始 df (原地修改) + # 使用 update 比 merge 更适合基于索引的原地更新 + # 确保 residuals_df 的索引与 df 中对应部分一致 + df.update(residuals_df) + else: + print("没有有效的残差结果可以合并。") + + + # 清理临时列 + df.drop(columns=[log_cap_col], inplace=True) + print("截面行业市值中性化完成。") + + +# --- 3. Z-Score 标准化 --- + +def cs_zscore_standardize(df: pd.DataFrame, features: list, epsilon: float = 1e-10): + """ + 对指定特征列进行截面 Z-Score 标准化 (原地修改)。 + 方法: Z = (value - cross_sectional_mean) / (cross_sectional_std + epsilon) + + Args: + df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date' 和 features 列。 + features (list): 需要处理的特征列名列表。 + epsilon (float): 防止除以零的小常数。 + + WARNING: 此函数会原地修改输入的 DataFrame 'df'。 + """ + print("开始截面 Z-Score 标准化...") + if not all(col in df.columns for col in features): + missing = [col for col in features if col not in df.columns] + print(f"错误: DataFrame 中缺少以下特征列: {missing}。跳过标准化处理。") + return + + grouped = df.groupby('trade_date') + + for col in tqdm(features, desc="Standardizing"): + try: + # 使用 transform 计算截面均值和标准差 + mean = grouped[col].transform('mean') + std = grouped[col].transform('std') + + # 计算 Z-Score 并原地赋值 + df[col] = (df[col] - mean) / (std + epsilon) + + except KeyError: + print(f"警告: 列 '{col}' 可能不存在或在分组中出错,跳过此列的标准化处理。") + except Exception as e: + print(f"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的标准化处理。") + + print("截面 Z-Score 标准化完成。") + +def fill_nan_with_daily_median(df: pd.DataFrame, feature_columns: list[str]) -> pd.DataFrame: + """ + 对指定特征列进行每日截面中位数填充缺失值 (NaN)。 + + 参数: + df (pd.DataFrame): 包含多日数据的DataFrame,需要包含 'trade_date' 和 feature_columns 中的列。 + feature_columns (list[str]): 需要进行缺失值填充的特征列名称列表。 + + 返回: + pd.DataFrame: 包含缺失值填充后特征列的DataFrame。在输入DataFrame的副本上操作。 + """ + processed_df = df.copy() # 在副本上操作,保留原始数据 + + # 确保 trade_date 是 datetime 类型以便正确分组 + processed_df['trade_date'] = pd.to_datetime(processed_df['trade_date']) + + def _fill_daily_nan(group): + # group 是某一个交易日的 DataFrame + + # 遍历指定的特征列 + for feature_col in feature_columns: + # 检查列是否存在于当前分组中 + if feature_col in group.columns: + # 计算当日该特征的中位数 + median_val = group[feature_col].median() + + # 使用当日中位数填充该特征列的 NaN 值 + # inplace=True 会直接修改 group DataFrame + group[feature_col].fillna(median_val, inplace=True) + # else: + # print(f"Warning: Feature column '{feature_col}' not found in daily group for {group['trade_date'].iloc[0]}. Skipping.") + + return group + + # 按交易日期分组,并应用每日填充函数 + # group_keys=False 避免将分组键添加到结果索引中 + filled_df = processed_df.groupby('trade_date', group_keys=False).apply(_fill_daily_nan) + + return filled_df \ No newline at end of file diff --git a/main/utils/indicators.py b/main/utils/indicators.py new file mode 100644 index 0000000..dfe3c13 --- /dev/null +++ b/main/utils/indicators.py @@ -0,0 +1,130 @@ +import pandas as pd +import numpy as np + +def calculate_sharpe_sortino_labels_efficient( + df: pd.DataFrame, + N_days: int = 5, # 未来考察的天数,用于计算收益率序列 + risk_free_rate_annual: float = 0.02, # 年化无风险利率 (例如 0.02 表示 2%) + annualization_factor: float = np.sqrt(252), # 年化因子,日数据通常用sqrt(252) + min_periods_for_std: int = 2 # 计算标准差所需的最小有效数据点数 +) -> pd.DataFrame: + """ + 高效计算每只股票在每个交易日未来 N 日的年化夏普比率和索提诺比率,作为训练的Label。 + 函数会获取未来 N 天的每日收益率序列,并基于此序列计算夏普/索提诺。 + + Args: + df (pd.DataFrame): 输入 DataFrame,需包含 'ts_code', 'trade_date', 'close' 列。 + 'close' 列必须是股票收盘价。 + N_days (int): 未来考察的天数。例如,N_days=5 表示考察未来5个交易日。 + risk_free_rate_annual (float): 年化无风险利率。 + annualization_factor (float): 用于将日收益率转化为年化收益率的因子 (例如 np.sqrt(252))。 + min_periods_for_std (int): 计算标准差所需的最小有效数据点数。 + 如果未来N天有效数据少于此值,则 Label 为 NaN。 + + Returns: + pd.DataFrame: 原始DataFrame,新增 'sharpe_ratio_label' 和 'sortino_ratio_label' 列。 + 注意:数据末尾 N_days 行的 Label 将为 NaN。 + """ + df_copy = df + + # 确保数据已按股票和日期排序,这对于高效计算至关重要 + df_copy = df_copy.sort_values(by=['ts_code', 'trade_date']) + + # # 计算每日收益率 + # df_copy['pct_chg'] = df_copy.groupby('ts_code')['close'].pct_change() + + # 将年化无风险利率转换为每日无风险利率 + daily_risk_free_rate = risk_free_rate_annual / 252 # 假设每年252个交易日 + + def _calculate_metrics_for_window(returns_series): + """ + 辅助函数:计算单个滚动窗口内的夏普和索提诺比率。 + 这个函数将被 apply 调用于每个 (N_days) 收益率序列。 + """ + if len(returns_series.dropna()) < min_periods_for_std: + return np.nan, np.nan # 数据不足,返回NaN + + excess_returns = returns_series - daily_risk_free_rate + + # --- 夏普比率 --- + mean_excess_return = excess_returns.mean() + std_dev_returns = returns_series.std() # 夏普比率使用总收益率的标准差 + + sharpe = np.nan + if std_dev_returns != 0: + sharpe = (mean_excess_return / std_dev_returns) * annualization_factor + + # --- 索提诺比率 --- + downside_returns = returns_series[returns_series < daily_risk_free_rate] + sortino = np.nan + if not downside_returns.empty: + downside_deviation = np.sqrt(np.mean((downside_returns - daily_risk_free_rate)**2)) + if downside_deviation != 0: + sortino = (mean_excess_return / downside_deviation) * annualization_factor + + return sharpe, sortino + + # 使用 groupby().rolling() 结合 apply 来高效计算 + # 注意: 这里使用 shift(-N_days) 来获取未来 N_days 的窗口 + # 同时 rolling 窗口需要是 N_days 大小,并对 pct_chg 序列进行操作 + # 结果会被放置在窗口的末尾,但我们实际上需要它对应到窗口的起始位置 + # 因此,我们先计算,然后将其向上 shift N_days + 1 (或者根据 rolling 的行为调整) + + # 获取未来 N_days 的每日收益率序列 + # 为了避免在每一行中循环,我们构造一个辅助的DataFrame,其中包含未来N天的收益率 + # 这里使用一个更高效的思路:对每只股票,生成一个N天的收益率列表 + + # 使用 groupby().apply() 和 list comprehension 来构建未来N天的收益率列表 + # 为了获得未来N天的收益率,需要对pct_chg进行shift(-N_days) + # 然后再对每个N_days的窗口进行处理 + + # 方法一:先获取未来N天的收益率列,然后进行滑动窗口计算 (更推荐,效率高) + # 创建一个辅助列,表示未来 N 天的每日收益率列表 + # 注意:这里需要 N_days 长度的窗口,且数据点至少为 min_periods_for_std + + # 对每只股票进行分组,然后计算未来 N 天的夏普/索提诺 + # 这仍然涉及到对每个时间点获取未来N天的收益序列,Pandas 的 rolling 默认是向后看的 + # 为了实现向后看 N_days (即从当前日期 t 预测 t+1 到 t+N_days),我们需要一些技巧 + + # 最直接且通常高效的方法是: + # 1. 计算日收益率。 + # 2. 对每个股票,对日收益率进行反向滚动,然后计算指标。 + # 或者更简单地,使用 shift(-N_days) 创建“未来的”日收益率列,然后进行滚动。 + + # 为了简化且保持效率,我们可以这样做: + # 1. 计算每个股票的每日收益率。 + # 2. 对于每个 (ts_code, trade_date) 行,我们将查看其未来的 N_days 每日收益率。 + # 这在 Pandas 中不直接通过 .rolling() 实现,因为 rolling 是“当前及之前”的窗口。 + # 我们可以用 groupby().apply() 配合自定义函数来模拟这个“未来窗口”的行为。 + + def _apply_metrics_per_stock(stock_df_group): + """ + 对单只股票的数据帧进行处理,计算其每个日期的未来 N 日夏普/索提诺比率。 + """ + sharpe_labels = [np.nan] * len(stock_df_group) + sortino_labels = [np.nan] * len(stock_df_group) + + # 遍历当前股票的每个日期,获取未来的 N_days 收益率序列 + for i in range(len(stock_df_group) - N_days): + # 获取未来 N_days 的每日收益率序列 + # 从当前日期 t 的下一天 (t+1) 开始,到 t+N_days + future_pct_chgs = stock_df_group['pct_chg'].iloc[i+1 : i+1+N_days].dropna() + + # 计算夏普和索提诺 + sharpe, sortino = _calculate_metrics_for_window(future_pct_chgs) + + # 赋值到对应日期 + sharpe_labels[i] = sharpe + sortino_labels[i] = sortino + + stock_df_group['sharpe_ratio_label'] = sharpe_labels + stock_df_group['sortino_ratio_label'] = sortino_labels + return stock_df_group + + # 对每个股票分组应用这个函数 + df_result = df_copy.groupby('ts_code', group_keys=False).apply(_apply_metrics_per_stock) + + # # 清理不再需要的中间列 + # df_result = df_result.drop(columns=['pct_chg']) + + return df_result diff --git a/my_catboost_model.cbm b/my_catboost_model.cbm new file mode 100644 index 0000000..9a2ab79 Binary files /dev/null and b/my_catboost_model.cbm differ diff --git a/predictions_test.tsv b/predictions_test.tsv index 32ae634..a53203a 100644 --- a/predictions_test.tsv +++ b/predictions_test.tsv @@ -1,1163 +1,1163 @@ trade_date,score,ts_code -2023-01-03,0.4684767428254628,600355.SH -2023-01-03,0.47384737888678313,002199.SZ -2023-01-04,0.479552808311038,600455.SH -2023-01-04,0.6357351396377157,000691.SZ -2023-01-05,0.45820197910998034,600455.SH -2023-01-05,0.47814801785119365,000691.SZ -2023-01-06,0.42187480002512184,603536.SH -2023-01-06,0.42810845687453797,000691.SZ -2023-01-09,0.39473321893727176,600898.SH -2023-01-09,0.5835408844426427,603499.SH -2023-01-10,0.39323622023281013,002828.SZ -2023-01-10,0.4879593126089789,603499.SH -2023-01-11,0.3509611259070293,600898.SH -2023-01-11,0.42157022866459304,603316.SH -2023-01-12,0.3302598839204471,000691.SZ -2023-01-12,0.3797066191062538,600898.SH -2023-01-13,0.3744056067591872,000691.SZ -2023-01-13,0.40365090838489764,603316.SH -2023-01-16,0.3456350624629914,000691.SZ -2023-01-16,0.3668974869774558,603316.SH -2023-01-17,0.3679727120763164,603316.SH -2023-01-17,0.4270670841744956,002209.SZ -2023-01-18,0.3714150857441048,600137.SH -2023-01-18,0.5038181668943964,002816.SZ -2023-01-19,0.3966901338922036,000691.SZ -2023-01-19,0.5107988820479804,600455.SH -2023-01-20,0.3804360736529549,600455.SH -2023-01-20,0.3829215801621981,000691.SZ -2023-01-30,0.4029837190764821,000691.SZ -2023-01-30,0.41112881457824846,603030.SH -2023-01-31,0.4431522287579181,600898.SH -2023-01-31,0.589902933711948,600768.SH -2023-02-01,0.49277361773196005,002899.SZ -2023-02-01,0.606540821119385,600768.SH -2023-02-02,0.51529702279335,600898.SH -2023-02-02,0.552382286480386,600768.SH -2023-02-03,0.46728391080866005,002830.SZ -2023-02-03,0.5473933822730597,600768.SH -2023-02-06,0.4382130602413888,600768.SH -2023-02-06,0.463057919835946,600355.SH -2023-02-07,0.4831068569434084,600898.SH -2023-02-07,0.48855246595385593,600768.SH -2023-02-08,0.38620648393287016,600768.SH -2023-02-08,0.38882706706390646,600898.SH -2023-02-09,0.43891639169688695,603269.SH -2023-02-09,0.48660535094742685,600768.SH -2023-02-10,0.4051123501437816,600355.SH -2023-02-10,0.4298253746940698,600768.SH -2023-02-13,0.3823371550100515,600355.SH -2023-02-13,0.4231657588905546,002199.SZ -2023-02-14,0.3815177291124314,603709.SH -2023-02-14,0.41074644791758563,600355.SH -2023-02-15,0.37503097729844054,603559.SH -2023-02-15,0.45752330296795635,600355.SH -2023-02-16,0.34903369377278615,603559.SH -2023-02-16,0.4340323151957717,603709.SH -2023-02-17,0.3105432211165304,600539.SH -2023-02-17,0.3886890242484185,002861.SZ -2023-02-20,0.32639104754395215,600355.SH -2023-02-20,0.34881228726828334,002861.SZ -2023-02-21,0.32410423974266517,002861.SZ -2023-02-21,0.36308133703601675,600355.SH -2023-02-22,0.29747141615954925,600355.SH -2023-02-22,0.3030477623528788,002780.SZ -2023-02-23,0.31642452431994095,600898.SH -2023-02-23,0.5708013395327826,000692.SZ -2023-02-24,0.3868620581994822,603269.SH -2023-02-24,0.5990443524926151,002633.SZ -2023-02-27,0.4370786066775669,002633.SZ -2023-02-27,0.47467531288388437,603559.SH -2023-02-28,0.3486195617019207,002633.SZ -2023-02-28,0.35135174030414285,600137.SH -2023-03-01,0.32924233349433585,000692.SZ -2023-03-01,0.34279780955083916,002633.SZ -2023-03-02,0.34637243374336085,002633.SZ -2023-03-02,0.6431840000068165,603860.SH -2023-03-03,0.3790588166624484,002848.SZ -2023-03-03,0.44821516310147763,002883.SZ -2023-03-06,0.3132502614301972,002883.SZ -2023-03-06,0.3532873721592686,002848.SZ -2023-03-07,0.3313278835001548,002856.SZ -2023-03-07,0.35129245562063094,002848.SZ -2023-03-08,0.33025002967062583,002856.SZ -2023-03-08,0.4498460817942037,603729.SH -2023-03-09,0.32877057169383417,002856.SZ -2023-03-09,0.33877335366117783,603316.SH -2023-03-10,0.3292897853040761,603729.SH -2023-03-10,0.35257491843833755,603269.SH -2023-03-13,0.3163289735087626,603559.SH -2023-03-13,0.31718158037858507,002856.SZ -2023-03-14,0.3784559786248677,002629.SZ -2023-03-14,0.3943434017871811,603269.SH -2023-03-15,0.29157596308223077,002856.SZ -2023-03-15,0.31231257072839147,603316.SH -2023-03-16,0.36002695458991324,002629.SZ -2023-03-16,0.37771316490810797,600768.SH -2023-03-17,0.3530452460421506,002830.SZ -2023-03-17,0.3706338200581902,603269.SH -2023-03-20,0.3764723473362952,002629.SZ -2023-03-20,0.42335556380853495,603269.SH -2023-03-21,0.3667023124236744,002629.SZ -2023-03-21,0.5612268615565896,600539.SH -2023-03-22,0.34682351197865285,603729.SH -2023-03-22,0.3565932971251102,002856.SZ -2023-03-23,0.34372636599935164,002830.SZ -2023-03-23,0.4701402405074129,600539.SH -2023-03-24,0.41905175316451554,000702.SZ -2023-03-24,0.42506118423687544,600539.SH -2023-03-27,0.39892199548843293,000702.SZ -2023-03-27,0.4038060027783929,600539.SH -2023-03-28,0.3698065225269796,600539.SH -2023-03-28,0.385826864260256,000702.SZ -2023-03-29,0.3666564149511846,600539.SH -2023-03-29,0.39660895186647527,000702.SZ -2023-03-30,0.30066798636120373,000702.SZ -2023-03-30,0.31125077564191916,600455.SH -2023-03-31,0.26582128594965737,002856.SZ -2023-03-31,0.3363084829702028,000702.SZ -2023-04-03,0.32891963652417416,000702.SZ -2023-04-03,0.3560139047226334,603030.SH -2023-04-04,0.32777798319086665,000702.SZ -2023-04-04,0.33111958299886324,603030.SH -2023-04-06,0.28447987402661107,603030.SH -2023-04-06,0.29331453464416746,002816.SZ -2023-04-07,0.29713937170464155,002633.SZ -2023-04-07,0.34918156604223327,000692.SZ -2023-04-10,0.35468622065722977,603030.SH -2023-04-10,0.36061662289601354,600539.SH -2023-04-11,0.29285693864508655,000702.SZ -2023-04-11,0.3394343222443783,603030.SH -2023-04-12,0.33584036896812325,002816.SZ -2023-04-12,0.33887689719685016,603030.SH -2023-04-13,0.3355145674197082,002816.SZ -2023-04-13,0.5619985375928641,603030.SH -2023-04-14,0.34141383032020256,600543.SH -2023-04-14,0.4668008584031016,603030.SH -2023-04-17,0.31511032760438856,603729.SH -2023-04-17,0.4415100350551732,603030.SH -2023-04-18,0.3730295667482556,603536.SH -2023-04-18,0.40526776402130577,603030.SH -2023-04-19,0.32979381914479855,603536.SH -2023-04-19,0.43999170646703323,603030.SH -2023-04-20,0.41856397968724973,000416.SZ -2023-04-20,0.44850884076506786,603030.SH -2023-04-21,0.5156894275917512,000416.SZ -2023-04-21,0.5282597671475073,603030.SH -2023-04-24,0.4115456644828437,000691.SZ -2023-04-24,0.5269711309394433,603030.SH -2023-04-25,0.4631376884092375,002816.SZ -2023-04-25,0.46833471320386705,000691.SZ -2023-04-26,0.4417729272779507,002652.SZ -2023-04-26,0.46799908023762093,603030.SH -2023-04-27,0.4513129570123227,002652.SZ -2023-04-27,0.48967820772645465,603030.SH -2023-04-28,0.39837180532914246,000691.SZ -2023-04-28,0.585951022500996,603030.SH -2023-05-04,0.4003567889187401,002652.SZ -2023-05-04,0.4525968709328638,000609.SZ -2023-05-05,0.39579631175173857,000609.SZ -2023-05-05,0.4354210100291241,603725.SH -2023-05-08,0.35166829855923565,002652.SZ -2023-05-08,0.3551036774170561,603729.SH -2023-05-09,0.3330989002506793,603729.SH -2023-05-09,0.3340227706021241,002652.SZ -2023-05-10,0.33914495902264863,002856.SZ -2023-05-10,0.35983361882579296,002652.SZ -2023-05-11,0.5720271934279302,603729.SH -2023-05-11,0.5953048139831573,603958.SH -2023-05-12,0.40591707594533954,600539.SH -2023-05-12,0.5126897618458598,603729.SH -2023-05-15,0.47884332772209404,603729.SH -2023-05-15,0.49168062496714315,603958.SH -2023-05-16,0.42011012047083374,002652.SZ -2023-05-16,0.43989103310659655,603729.SH -2023-05-17,0.4248494483845556,600539.SH -2023-05-17,0.45680994522090584,603729.SH -2023-05-18,0.3820603468258838,600355.SH -2023-05-18,0.49462834486335155,603958.SH -2023-05-19,0.37276701779723836,002316.SZ -2023-05-19,0.5148684808550619,603958.SH -2023-05-22,0.4274349393803791,002719.SZ -2023-05-22,0.44879022958641973,603958.SH -2023-05-23,0.5080589575196827,002316.SZ -2023-05-23,0.6297362666964937,603958.SH -2023-05-24,0.4369560547597469,002719.SZ -2023-05-24,0.5507526310051275,603958.SH -2023-05-25,0.4325378407187548,603958.SH -2023-05-25,0.4662815227521318,002719.SZ -2023-05-26,0.3625851070716006,603958.SH -2023-05-26,0.4490476681461897,002719.SZ -2023-05-29,0.45768046237631016,002719.SZ -2023-05-29,0.5863511256310384,603958.SH -2023-05-30,0.3610763736078537,002719.SZ -2023-05-30,0.5594134866722956,600083.SH -2023-05-31,0.49952167486191085,603608.SH -2023-05-31,0.5116589850708921,002316.SZ -2023-06-01,0.388944930835702,603608.SH -2023-06-01,0.49960211167203566,002719.SZ -2023-06-02,0.40748483607854413,000622.SZ -2023-06-02,0.45861701147169254,002719.SZ -2023-06-05,0.43800489257431485,000622.SZ -2023-06-05,0.4899347932628949,603729.SH -2023-06-06,0.43724569829961696,000622.SZ -2023-06-06,0.5253444241222907,600137.SH -2023-06-07,0.448454678195102,603389.SH -2023-06-07,0.4999685436689976,002652.SZ -2023-06-08,0.45350936243275736,002652.SZ -2023-06-08,0.49442610077807947,600137.SH -2023-06-09,0.4632467515482808,002652.SZ -2023-06-09,0.4635311185080169,600137.SH -2023-06-12,0.4088770473962469,002652.SZ -2023-06-12,0.6294289297406692,603286.SH -2023-06-13,0.4303649559999078,002652.SZ -2023-06-13,0.46674432218327117,603286.SH -2023-06-14,0.3930681589674619,002848.SZ -2023-06-14,0.43926832845306235,603286.SH -2023-06-15,0.42440487417264655,603286.SH -2023-06-15,0.4394551924832999,002848.SZ -2023-06-16,0.4065172512433582,603286.SH -2023-06-16,0.42820968853912905,002719.SZ -2023-06-19,0.34626325890237986,002058.SZ -2023-06-19,0.3593086552981787,002193.SZ -2023-06-20,0.37293980131113574,002719.SZ -2023-06-20,0.5198345382313487,002247.SZ -2023-06-21,0.41853517769935145,002211.SZ -2023-06-21,0.4711434680963475,002058.SZ -2023-06-26,0.5518093021711254,002247.SZ -2023-06-26,0.5702145554426296,000691.SZ -2023-06-27,0.4254666191693665,603389.SH -2023-06-27,0.4964977635906026,000609.SZ -2023-06-28,0.43537533521939076,002211.SZ -2023-06-28,0.6246555854173305,000609.SZ -2023-06-29,0.4406735710431816,002211.SZ -2023-06-29,0.44498509163646427,000609.SZ -2023-06-30,0.4106978878610447,603709.SH -2023-06-30,0.4436218991235617,002211.SZ -2023-07-03,0.3886983170659105,603389.SH -2023-07-03,0.6408949732514136,002211.SZ -2023-07-04,0.5078829177960569,002719.SZ -2023-07-04,0.6243017415918146,000691.SZ -2023-07-05,0.40701219869448335,002058.SZ -2023-07-05,0.487605821259066,000691.SZ -2023-07-06,0.437005412965068,002058.SZ -2023-07-06,0.6795792715788238,000691.SZ -2023-07-07,0.4003396289083599,000702.SZ -2023-07-07,0.5889382739849416,000691.SZ -2023-07-10,0.39396347635432205,000702.SZ -2023-07-10,0.48019701142654786,000691.SZ -2023-07-11,0.439687839630177,000691.SZ -2023-07-11,0.5612833803469844,600493.SH -2023-07-12,0.4108210680855395,000691.SZ -2023-07-12,0.4200881481195521,002211.SZ -2023-07-13,0.36973393413345096,605081.SH -2023-07-13,0.422459111425461,000691.SZ -2023-07-14,0.38272237899156397,000691.SZ -2023-07-14,0.6006353359325618,000609.SZ -2023-07-17,0.37612122065083364,603729.SH -2023-07-17,0.4944112855322408,000609.SZ -2023-07-18,0.4268167195789233,000609.SZ -2023-07-18,0.48629455942650146,603709.SH -2023-07-19,0.4149455161709598,603709.SH -2023-07-19,0.6451128354166313,000609.SZ -2023-07-20,0.5350579598474119,000691.SZ -2023-07-20,0.5927224932437802,000609.SZ -2023-07-21,0.5429662950503501,000691.SZ -2023-07-21,0.611046209297615,000609.SZ -2023-07-24,0.5025038772274522,000609.SZ -2023-07-24,0.5311048574518752,000691.SZ -2023-07-25,0.426322198551313,603709.SH -2023-07-25,0.5638621070607801,000609.SZ -2023-07-26,0.5564676423743886,000691.SZ -2023-07-26,0.6233663229589681,000609.SZ -2023-07-27,0.5093068260966046,000609.SZ -2023-07-27,0.5603627240061348,000691.SZ -2023-07-28,0.514665491953376,000691.SZ -2023-07-28,0.6711128202140186,000609.SZ -2023-07-31,0.4840425275009945,603729.SH -2023-07-31,0.6601433073930776,002652.SZ -2023-08-01,0.47149744739652116,002652.SZ -2023-08-01,0.5149810969398765,000609.SZ -2023-08-02,0.4654100581716852,002652.SZ -2023-08-02,0.5023121603351479,000609.SZ -2023-08-03,0.4695510928671745,002652.SZ -2023-08-03,0.5585017995536077,000609.SZ -2023-08-04,0.39556302723614617,600355.SH -2023-08-04,0.41479127639367713,002629.SZ -2023-08-07,0.40689165974956226,600355.SH -2023-08-07,0.5149190091339867,002652.SZ -2023-08-08,0.48630304292002374,002652.SZ -2023-08-08,0.5246312841710814,000609.SZ -2023-08-09,0.4356461849388642,002652.SZ -2023-08-09,0.4971682419642834,000609.SZ -2023-08-10,0.392163480479341,000691.SZ -2023-08-10,0.6228852910697377,002652.SZ -2023-08-11,0.4464726872140078,000609.SZ -2023-08-11,0.5805263648854881,002652.SZ -2023-08-14,0.42326075562477344,000691.SZ -2023-08-14,0.4861413707780896,002652.SZ -2023-08-15,0.3931068312847937,000691.SZ -2023-08-15,0.47011668184838296,002652.SZ -2023-08-16,0.42217411491295864,600355.SH -2023-08-16,0.6030760850906282,002652.SZ -2023-08-17,0.4936829518109262,000609.SZ -2023-08-17,0.5570834827001888,002652.SZ -2023-08-18,0.44902574349789526,603729.SH -2023-08-18,0.5239959693550043,002652.SZ -2023-08-21,0.49919719599664863,002652.SZ -2023-08-21,0.5150878501726485,600455.SH -2023-08-22,0.5293065504723666,002652.SZ -2023-08-22,0.5404153629940888,603139.SH -2023-08-23,0.5200109800186293,000609.SZ -2023-08-23,0.5574010740496559,002652.SZ -2023-08-24,0.5222451804064431,002193.SZ -2023-08-24,0.536391529550581,002652.SZ -2023-08-25,0.49886871170286584,002652.SZ -2023-08-25,0.5153343287209357,600455.SH -2023-08-28,0.488732175438176,002861.SZ -2023-08-28,0.4926203894010455,603860.SH -2023-08-29,0.4693488211008939,002652.SZ -2023-08-29,0.4758402572041758,603389.SH -2023-08-30,0.4739979536749841,002856.SZ -2023-08-30,0.5049080232907698,603389.SH -2023-08-31,0.4857836234240427,002856.SZ -2023-08-31,0.48910928523048874,603389.SH -2023-09-01,0.4428511176754367,002856.SZ -2023-09-01,0.5252129041233722,603389.SH -2023-09-04,0.41991588635158533,603729.SH -2023-09-04,0.4834638124287029,002058.SZ -2023-09-05,0.41332983405226675,603729.SH -2023-09-05,0.48849210425690764,603389.SH -2023-09-06,0.4292617119470653,603389.SH -2023-09-06,0.4358277786256054,603709.SH -2023-09-07,0.42675962483728735,002856.SZ -2023-09-07,0.4297207706553909,002652.SZ -2023-09-08,0.4106022739670407,002652.SZ -2023-09-08,0.4662774947627455,603389.SH -2023-09-11,0.4153458204874507,002652.SZ -2023-09-11,0.4626931720136992,603389.SH -2023-09-12,0.36757273771527765,002652.SZ -2023-09-12,0.43851411657552747,603389.SH -2023-09-13,0.4153807685933249,603389.SH -2023-09-13,0.41652643416395796,002652.SZ -2023-09-14,0.4277348591250908,002652.SZ -2023-09-14,0.4476047175097808,603389.SH -2023-09-15,0.3795433848784883,000609.SZ -2023-09-15,0.38025648492478137,600355.SH -2023-09-18,0.38748081118523386,600355.SH -2023-09-18,0.55840813852596,603389.SH -2023-09-19,0.40068528623936006,000609.SZ -2023-09-19,0.5169648631845276,603389.SH -2023-09-20,0.4577752780257088,600137.SH -2023-09-20,0.4786952124637164,603389.SH -2023-09-21,0.45912381583788886,002848.SZ -2023-09-21,0.5103891765474939,603389.SH -2023-09-22,0.5025060530599572,000622.SZ -2023-09-22,0.5127487812659581,603389.SH -2023-09-25,0.472944000771633,603389.SH -2023-09-25,0.5030845409354039,603286.SH -2023-09-26,0.4605705125432969,603389.SH -2023-09-26,0.46288451403874165,000609.SZ -2023-09-27,0.4583380435563769,002652.SZ -2023-09-27,0.49104855893234384,603389.SH -2023-09-28,0.4350023662146412,600615.SH -2023-09-28,0.5068185941634585,002652.SZ -2023-10-09,0.4606613502005412,000609.SZ -2023-10-09,0.49968363466304133,002652.SZ -2023-10-10,0.48970356125922193,002652.SZ -2023-10-10,0.514384457388318,600083.SH -2023-10-11,0.4636582413430633,603389.SH -2023-10-11,0.4703427739584826,600083.SH -2023-10-12,0.4682893234297492,002629.SZ -2023-10-12,0.4695903762069583,600083.SH -2023-10-13,0.4608086091095439,600083.SH -2023-10-13,0.46389247922004834,603286.SH -2023-10-16,0.44742679896229,603286.SH -2023-10-16,0.5487959953799241,002652.SZ -2023-10-17,0.5171239788231553,002652.SZ -2023-10-17,0.526908473188913,600493.SH -2023-10-18,0.49115113055971893,002652.SZ -2023-10-18,0.5196721993658843,600561.SH -2023-10-19,0.5104908590543645,002652.SZ -2023-10-19,0.5159379589024917,600083.SH -2023-10-20,0.4814136686603816,603729.SH -2023-10-20,0.48224511439263174,600083.SH -2023-10-23,0.4925995509133282,002652.SZ -2023-10-23,0.49848610044219027,603729.SH -2023-10-24,0.5036074764240301,000691.SZ -2023-10-24,0.5465003650419241,603729.SH -2023-10-25,0.49491333633709916,002193.SZ -2023-10-25,0.532442876108866,600137.SH -2023-10-26,0.5153740634663273,603389.SH -2023-10-26,0.5309007960274558,603729.SH -2023-10-27,0.5106775400149401,603729.SH -2023-10-27,0.525735787975933,603389.SH -2023-10-30,0.4952234608613525,001211.SZ -2023-10-30,0.5198920153023683,603729.SH -2023-10-31,0.488183670209298,603729.SH -2023-10-31,0.4922965620723825,002193.SZ -2023-11-01,0.4805073604179961,603729.SH -2023-11-01,0.4975172276546389,002652.SZ -2023-11-02,0.5436031208121467,001211.SZ -2023-11-02,0.545721307514884,002652.SZ -2023-11-03,0.4622552707761628,001211.SZ -2023-11-03,0.4855422606370615,002652.SZ -2023-11-06,0.38901786000296346,002719.SZ -2023-11-06,0.4409178091075256,600493.SH -2023-11-07,0.38553470534905143,002652.SZ -2023-11-07,0.5576119155774049,600493.SH -2023-11-08,0.3943331095785624,000609.SZ -2023-11-08,0.4099644763369139,600561.SH -2023-11-09,0.4124521648350319,002652.SZ -2023-11-09,0.41382834161110527,600561.SH -2023-11-10,0.4320277777220165,002652.SZ -2023-11-10,0.45437931386112695,600493.SH -2023-11-13,0.43320570499773176,600493.SH -2023-11-13,0.4454316704603774,603729.SH -2023-11-14,0.39646006147372403,002652.SZ -2023-11-14,0.4403579669068028,002193.SZ -2023-11-15,0.3769545567673307,002652.SZ -2023-11-15,0.3911076822113135,002193.SZ -2023-11-16,0.4090072524095311,002193.SZ -2023-11-16,0.4114162190315081,000609.SZ -2023-11-17,0.3915131229157055,002856.SZ -2023-11-17,0.39480240666443356,002652.SZ -2023-11-20,0.505519059725322,002856.SZ -2023-11-20,0.6506693393115545,600455.SH -2023-11-21,0.46304637896170797,002856.SZ -2023-11-21,0.4663162347724089,600539.SH -2023-11-22,0.41567124292827173,002856.SZ -2023-11-22,0.4737847361388891,603389.SH -2023-11-23,0.43011596084533993,600493.SH -2023-11-23,0.481304134929852,603021.SH -2023-11-24,0.42154620495450323,002193.SZ -2023-11-24,0.4600474976034803,603389.SH -2023-11-27,0.42871049092708324,603729.SH -2023-11-27,0.6890603852600709,002856.SZ -2023-11-28,0.4504352263544583,603021.SH -2023-11-28,0.6648811565734748,002856.SZ -2023-11-29,0.40838326945283293,002830.SZ -2023-11-29,0.6029774462457932,002856.SZ -2023-11-30,0.3965027839156219,603021.SH -2023-11-30,0.4848174118962506,002058.SZ -2023-12-01,0.45217793168634607,603729.SH -2023-12-01,0.5198526420078152,002193.SZ -2023-12-04,0.48077388290970074,002193.SZ -2023-12-04,0.4901009533832538,600493.SH -2023-12-05,0.4723004047505253,600561.SH -2023-12-05,0.6420838342865917,603272.SH -2023-12-06,0.544386947291199,600083.SH -2023-12-06,0.5782013820695902,600561.SH -2023-12-07,0.523394102013947,002856.SZ -2023-12-07,0.5524336720247588,600083.SH -2023-12-08,0.4496891544417189,600847.SH -2023-12-08,0.4750415712552314,600083.SH -2023-12-11,0.4608509001014652,002856.SZ -2023-12-11,0.48942371501539406,600561.SH -2023-12-12,0.46605320554765406,002856.SZ -2023-12-12,0.5049936594039381,600455.SH -2023-12-13,0.45631491005172536,002058.SZ -2023-12-13,0.5511825413155416,002856.SZ -2023-12-14,0.5368810240239815,002856.SZ -2023-12-14,0.5867223797526017,600561.SH -2023-12-15,0.5467389991279458,002856.SZ -2023-12-15,0.6110778319178128,600561.SH -2023-12-18,0.47573255991998264,000668.SZ -2023-12-18,0.5807127911678723,603389.SH -2023-12-19,0.4980810856669502,603813.SH -2023-12-19,0.5459770062546881,603389.SH -2023-12-20,0.5295056543479462,603813.SH -2023-12-20,0.6041955384701849,603389.SH -2023-12-21,0.5026988036211187,002719.SZ -2023-12-21,0.5048011866323707,600561.SH -2023-12-22,0.5192205046509942,603709.SH -2023-12-22,0.5292833035852067,002719.SZ -2023-12-25,0.4916807134666398,002591.SZ -2023-12-25,0.4945452636488737,603813.SH -2023-12-26,0.5489582063397035,600421.SH -2023-12-26,0.5711283152006268,603389.SH -2023-12-27,0.5259794591914981,600156.SH -2023-12-27,0.573614333251595,603389.SH -2023-12-28,0.4876357826326037,600847.SH -2023-12-28,0.5551919374272382,603389.SH -2023-12-29,0.534712274898589,603389.SH -2023-12-29,0.5899673842355048,002633.SZ -2024-01-02,0.5068467406651367,000691.SZ -2024-01-02,0.5248676963102874,600768.SH -2024-01-03,0.4126181103138262,002633.SZ -2024-01-03,0.4662710533696311,000691.SZ -2024-01-04,0.49221402688380256,002778.SZ -2024-01-04,0.6734633377634256,000691.SZ -2024-01-05,0.476643720874656,002633.SZ -2024-01-05,0.519848958989468,603389.SH -2024-01-08,0.5144994913807512,603389.SH -2024-01-08,0.5831658883622385,000691.SZ -2024-01-09,0.518182933367566,603709.SH -2024-01-09,0.541864573994551,000691.SZ -2024-01-10,0.5266270308342209,603709.SH -2024-01-10,0.5531604926145313,000691.SZ -2024-01-11,0.5305952515260536,000691.SZ -2024-01-11,0.6190758891287557,605081.SH -2024-01-12,0.5341444873442881,000691.SZ -2024-01-12,0.5641791080188807,605081.SH -2024-01-15,0.5515670767785422,605081.SH -2024-01-15,0.577205250295446,603389.SH -2024-01-16,0.5405100100447088,605081.SH -2024-01-16,0.5914951357765986,603389.SH -2024-01-17,0.6083425597737966,605081.SH -2024-01-17,0.6256829197997993,603389.SH -2024-01-18,0.5701457794295957,002652.SZ -2024-01-18,0.5824305642085295,605081.SH -2024-01-19,0.5333824277869109,603389.SH -2024-01-19,0.5544592123277327,002719.SZ -2024-01-22,0.5901799986790504,002629.SZ -2024-01-22,0.5979218430189353,002207.SZ -2024-01-23,0.5862477896959455,002856.SZ -2024-01-23,0.6071735122943055,002633.SZ -2024-01-24,0.5789660025926016,000691.SZ -2024-01-24,0.5811889482878452,002856.SZ -2024-01-25,0.527674898522184,002633.SZ -2024-01-25,0.5685526115905835,002193.SZ -2024-01-26,0.5367785322359124,002193.SZ -2024-01-26,0.5536636013600271,002629.SZ -2024-01-29,0.5318978571119934,603813.SH -2024-01-29,0.5330317477749473,000691.SZ -2024-01-30,0.5580127168380973,002633.SZ -2024-01-30,0.5913607390585287,603389.SH -2024-01-31,0.628660556478723,000691.SZ -2024-01-31,0.6308126198695576,002633.SZ -2024-02-01,0.5274748018719008,002890.SZ -2024-02-01,0.6398289187059143,600778.SH -2024-02-02,0.6005778961145768,002890.SZ -2024-02-02,0.606647840335194,600778.SH -2024-02-05,0.5669996991911749,600883.SH -2024-02-05,0.5994566603012911,002231.SZ -2024-02-06,0.4898154595046274,603021.SH -2024-02-06,0.4926687246006661,002861.SZ -2024-02-07,0.4887072837736352,002211.SZ -2024-02-07,0.49308681992355646,002719.SZ -2024-02-08,0.5256608089994137,600493.SH -2024-02-08,0.5668188910416511,600355.SH -2024-02-19,0.503507376824423,000622.SZ -2024-02-19,0.5098358071221475,600561.SH -2024-02-20,0.5049424722442044,002316.SZ -2024-02-20,0.5707611341162182,002231.SZ -2024-02-21,0.512673231321461,603389.SH -2024-02-21,0.524595549582356,600561.SH -2024-02-22,0.5203083435316965,603389.SH -2024-02-22,0.5303090947548564,600083.SH -2024-02-23,0.567858116724662,002633.SZ -2024-02-23,0.5724326593526766,002856.SZ -2024-02-26,0.5537037962007362,002633.SZ -2024-02-26,0.5785920156519323,002856.SZ -2024-02-27,0.53042558702208,002193.SZ -2024-02-27,0.5667714766775795,002856.SZ -2024-02-28,0.5732272053408788,002856.SZ -2024-02-28,0.5764790738128892,000691.SZ -2024-02-29,0.5372642609139974,002193.SZ -2024-02-29,0.5600454678316373,002856.SZ -2024-03-01,0.5447976864454863,002193.SZ -2024-03-01,0.5809359340644645,002856.SZ -2024-03-04,0.5679696430586119,002193.SZ -2024-03-04,0.580189614899258,002856.SZ -2024-03-05,0.5519733845064646,600539.SH -2024-03-05,0.594400379242349,002856.SZ -2024-03-06,0.5615712325834491,603316.SH -2024-03-06,0.567127878038158,002856.SZ -2024-03-07,0.5480357957857048,603389.SH -2024-03-07,0.5708069652196183,002856.SZ -2024-03-08,0.5197777269522734,002193.SZ -2024-03-08,0.5343059793912912,002856.SZ -2024-03-11,0.4994685157441846,603021.SH -2024-03-11,0.5022588083651929,603389.SH -2024-03-12,0.5409097714704745,000929.SZ -2024-03-12,0.5434345198756036,002211.SZ -2024-03-13,0.5490314838724504,603021.SH -2024-03-13,0.5929669820106193,600455.SH -2024-03-14,0.575353833046789,600455.SH -2024-03-14,0.5924467384770992,603021.SH -2024-03-15,0.6120217427171503,603021.SH -2024-03-15,0.6486474402319408,000691.SZ -2024-03-18,0.6040065311143488,002652.SZ -2024-03-18,0.6170417192347865,603021.SH -2024-03-19,0.5919611046065792,603021.SH -2024-03-19,0.6111817549177481,603389.SH -2024-03-20,0.5890176020598374,603389.SH -2024-03-20,0.6312894070089907,603021.SH -2024-03-21,0.6114201756562303,600847.SH -2024-03-21,0.6149056663057552,002193.SZ -2024-03-22,0.5758561370057376,002652.SZ -2024-03-22,0.5946481100211619,600455.SH -2024-03-25,0.6574370435595454,603709.SH -2024-03-25,0.6574508846765951,603813.SH -2024-03-26,0.5618347831802274,002856.SZ -2024-03-26,0.5767865192937004,000691.SZ -2024-03-27,0.6509609636216238,603813.SH -2024-03-27,0.6617845569790887,000691.SZ -2024-03-28,0.6400255120565453,603813.SH -2024-03-28,0.6735803786609409,000691.SZ -2024-03-29,0.5828267136775931,002652.SZ -2024-03-29,0.6467055978758175,000691.SZ -2024-04-01,0.571901051694786,000691.SZ -2024-04-01,0.5818746744780333,002856.SZ -2024-04-02,0.5854077686483244,600768.SH -2024-04-02,0.6778024381950073,000691.SZ -2024-04-03,0.5711982688317863,002856.SZ -2024-04-03,0.6354858416405852,002652.SZ -2024-04-08,0.5835843308670994,600539.SH -2024-04-08,0.5888732087004624,002856.SZ -2024-04-09,0.5810118012200136,600561.SH -2024-04-09,0.6402957783594821,603813.SH -2024-04-10,0.5693131669002004,002193.SZ -2024-04-10,0.5865671868003028,002856.SZ -2024-04-11,0.5753733994324953,600847.SH -2024-04-11,0.6211778962111548,600234.SH -2024-04-12,0.5848129848722808,002652.SZ -2024-04-12,0.6533763373708855,600234.SH -2024-04-15,0.6415239680945644,600539.SH -2024-04-15,0.6614420627854467,002856.SZ -2024-04-16,0.5154481639151626,000809.SZ -2024-04-16,0.61495331815502,000608.SZ -2024-04-17,0.618049491268676,002856.SZ -2024-04-17,0.6542804596591163,002633.SZ -2024-04-18,0.6332799207855258,002856.SZ -2024-04-18,0.656367532284007,002193.SZ -2024-04-19,0.6505949066313403,600539.SH -2024-04-19,0.651478781322584,002193.SZ -2024-04-22,0.5232676182745716,600234.SH -2024-04-22,0.5249770157145098,002633.SZ -2024-04-23,0.6294268496703359,002856.SZ -2024-04-23,0.7037745032889973,002193.SZ -2024-04-24,0.6546105815705417,002193.SZ -2024-04-24,0.6697880935048731,002856.SZ -2024-04-25,0.621242471859012,002856.SZ -2024-04-25,0.7092522110101562,002193.SZ -2024-04-26,0.6191136208820486,002633.SZ -2024-04-26,0.6408142006254229,002856.SZ -2024-04-29,0.5343274233695183,000668.SZ -2024-04-29,0.5940597754754929,002193.SZ -2024-04-30,0.5433355360248331,002629.SZ -2024-04-30,0.6387532380639741,002193.SZ -2024-05-06,0.5351852871786987,600847.SH -2024-05-06,0.6053210005378578,002193.SZ -2024-05-07,0.5667943284653308,002856.SZ -2024-05-07,0.5669867621665857,002193.SZ -2024-05-08,0.5351319037615132,002193.SZ -2024-05-08,0.553786941725976,002856.SZ -2024-05-09,0.5240388987876472,002193.SZ -2024-05-09,0.5932380748401277,600847.SH -2024-05-10,0.5561999239295996,002856.SZ -2024-05-10,0.5593663475195839,002193.SZ -2024-05-13,0.5587559901181927,002856.SZ -2024-05-13,0.5661970971289519,002193.SZ -2024-05-14,0.5362870108515626,002629.SZ -2024-05-14,0.5598997009657208,002193.SZ -2024-05-15,0.5361703868231884,002633.SZ -2024-05-15,0.5694071793732757,002193.SZ -2024-05-16,0.5584252328653154,600847.SH -2024-05-16,0.6138822987263063,002856.SZ -2024-05-17,0.5928372839900519,000668.SZ -2024-05-17,0.6258091781972408,002856.SZ -2024-05-20,0.5898855273181555,002193.SZ -2024-05-20,0.6091356669653759,002856.SZ -2024-05-21,0.567192685249407,002193.SZ -2024-05-21,0.5726792060953727,002856.SZ -2024-05-22,0.5738857759622407,002856.SZ -2024-05-22,0.585725385433901,002193.SZ -2024-05-23,0.5949141878063136,002193.SZ -2024-05-23,0.6137394463078546,002856.SZ -2024-05-24,0.5986789915104014,002856.SZ -2024-05-24,0.6215343129688194,600321.SH -2024-05-27,0.583810230501891,600539.SH -2024-05-27,0.6210096867220832,600321.SH -2024-05-28,0.5576059115377378,600321.SH -2024-05-28,0.5912149844745695,600539.SH -2024-05-29,0.5562457553608665,002629.SZ -2024-05-29,0.5614365417451934,600321.SH -2024-05-30,0.5504523292675331,600321.SH -2024-05-30,0.5864809491142532,002629.SZ -2024-05-31,0.52315310768662,600539.SH -2024-05-31,0.5810865550214601,002629.SZ -2024-06-03,0.5857695895486528,002193.SZ -2024-06-03,0.5983157541989956,002629.SZ -2024-06-04,0.6080003940801165,002193.SZ -2024-06-04,0.6632444973330485,002629.SZ -2024-06-05,0.6748442259219872,002193.SZ -2024-06-05,0.6836976961416175,002629.SZ -2024-06-06,0.5063004126034316,002629.SZ -2024-06-06,0.524171457095047,002713.SZ -2024-06-07,0.4995750016276255,002193.SZ -2024-06-07,0.5100198761387312,000679.SZ -2024-06-11,0.500907108640261,002713.SZ -2024-06-11,0.5376175077816711,603021.SH -2024-06-12,0.6325854407335458,002629.SZ -2024-06-12,0.6386302840258828,002193.SZ -2024-06-13,0.4690298354828865,002629.SZ -2024-06-13,0.48084767054582817,603021.SH -2024-06-14,0.4809278209986547,002629.SZ -2024-06-14,0.48156662367742437,000679.SZ -2024-06-17,0.4576613018564246,002629.SZ -2024-06-17,0.4685565907210213,603021.SH -2024-06-18,0.5532408702575496,002193.SZ -2024-06-18,0.6280736913133913,002629.SZ -2024-06-19,0.4591871351989234,000608.SZ -2024-06-19,0.4956228330651279,000679.SZ -2024-06-20,0.4767760379239134,002713.SZ -2024-06-20,0.49300428613836533,000679.SZ -2024-06-21,0.5001566266845358,002629.SZ -2024-06-21,0.5192385040795983,000679.SZ -2024-06-24,0.5021316880262505,002193.SZ -2024-06-24,0.5450470712521422,002629.SZ -2024-06-25,0.464183348918188,002193.SZ -2024-06-25,0.5180065112691368,002629.SZ -2024-06-26,0.548184344202523,603021.SH -2024-06-26,0.5606829133311847,002629.SZ -2024-06-27,0.501222574126512,002713.SZ -2024-06-27,0.5035484090735972,002629.SZ -2024-06-28,0.49305564564915266,000679.SZ -2024-06-28,0.5005547611853691,002629.SZ -2024-07-01,0.4969305814781882,002629.SZ -2024-07-01,0.5009579935068144,000679.SZ -2024-07-02,0.4739694221663164,603021.SH -2024-07-02,0.5166974779996243,002193.SZ -2024-07-03,0.4918635078364792,002193.SZ -2024-07-03,0.49530013751094626,002629.SZ -2024-07-04,0.4876198412385853,002193.SZ -2024-07-04,0.49069972083034286,002629.SZ -2024-07-05,0.506255341708395,002622.SZ -2024-07-05,0.576810808558059,002629.SZ -2024-07-08,0.500874033097128,002622.SZ -2024-07-08,0.535602342384967,002629.SZ -2024-07-09,0.4917832000843923,002193.SZ -2024-07-09,0.5226297315603977,002629.SZ -2024-07-10,0.48822550669985165,002629.SZ -2024-07-10,0.4979440581003213,603021.SH -2024-07-11,0.5088536223534624,603021.SH -2024-07-11,0.5310901755563194,002629.SZ -2024-07-12,0.4602472640927864,603021.SH -2024-07-12,0.48770222957950915,002629.SZ -2024-07-15,0.5124529180571545,603021.SH -2024-07-15,0.5145110007464542,002629.SZ -2024-07-16,0.5206338908793464,002193.SZ -2024-07-16,0.5359103181048379,002629.SZ -2024-07-17,0.473489448276116,002193.SZ -2024-07-17,0.4918478424174286,002629.SZ -2024-07-18,0.4749968723707166,002629.SZ -2024-07-18,0.525392889214367,002713.SZ -2024-07-19,0.45515631600323253,002629.SZ -2024-07-19,0.4982448117403452,002713.SZ -2024-07-22,0.4125029754156591,002629.SZ -2024-07-22,0.5770875767430027,002193.SZ -2024-07-23,0.47018030811323425,002193.SZ -2024-07-23,0.4937993508002025,002629.SZ -2024-07-24,0.46201297108037803,002629.SZ -2024-07-24,0.5039187498844055,002713.SZ -2024-07-25,0.4723176341948534,002193.SZ -2024-07-25,0.4954455862317738,002713.SZ -2024-07-26,0.45751400419002525,002193.SZ -2024-07-26,0.4971148914294246,002713.SZ -2024-07-29,0.5114185381779679,000608.SZ -2024-07-29,0.518626024112623,002713.SZ -2024-07-30,0.45309350445419727,002622.SZ -2024-07-30,0.5791015842138574,002629.SZ -2024-07-31,0.4552997789469659,000679.SZ -2024-07-31,0.490758326654418,002058.SZ -2024-08-01,0.4838405181347293,002629.SZ -2024-08-01,0.5085856814802225,002193.SZ -2024-08-02,0.5469871718965083,002633.SZ -2024-08-02,0.6641968098288946,002193.SZ -2024-08-05,0.5542261997720986,002193.SZ -2024-08-05,0.6554684511288179,002629.SZ -2024-08-06,0.602437847528946,002633.SZ -2024-08-06,0.6774489226470348,002193.SZ -2024-08-07,0.48524128744033324,002629.SZ -2024-08-07,0.49334089429342876,002193.SZ -2024-08-08,0.5359490866759176,002629.SZ -2024-08-08,0.5478235964544481,002633.SZ -2024-08-09,0.5769191196695214,000890.SZ -2024-08-09,0.592143816870311,002633.SZ -2024-08-12,0.47800500709053845,000890.SZ -2024-08-12,0.5216554141901838,000608.SZ -2024-08-13,0.5272399553840669,600768.SH -2024-08-13,0.6360854057038242,002629.SZ -2024-08-14,0.46370040920512,600768.SH -2024-08-14,0.5432583093865742,002629.SZ -2024-08-15,0.4486808916007576,002193.SZ -2024-08-15,0.5811441246347222,002629.SZ -2024-08-16,0.4880150164781186,002713.SZ -2024-08-16,0.5127634525645495,002629.SZ -2024-08-19,0.4994221056505771,002629.SZ -2024-08-19,0.509293329642522,000608.SZ -2024-08-20,0.46709537457605776,002629.SZ -2024-08-20,0.4814506638120075,000608.SZ -2024-08-21,0.45434508291229164,000890.SZ -2024-08-21,0.4685500100963178,000608.SZ -2024-08-22,0.48515662162977435,000608.SZ -2024-08-22,0.5737376200868238,002193.SZ -2024-08-23,0.49433850518813105,002193.SZ -2024-08-23,0.5101182264327718,000608.SZ -2024-08-26,0.45722145125260416,603021.SH -2024-08-26,0.4991962768666597,002629.SZ -2024-08-27,0.4957776666042425,603021.SH -2024-08-27,0.5323816190665347,000608.SZ -2024-08-28,0.47488232677008085,603316.SH -2024-08-28,0.5164443755003244,000608.SZ -2024-08-29,0.43102317100074367,002633.SZ -2024-08-29,0.4918630367387645,000608.SZ -2024-08-30,0.44897665098535594,002713.SZ -2024-08-30,0.5227651405278011,000679.SZ -2024-09-02,0.4434409868729454,000679.SZ -2024-09-02,0.4876648283384904,000608.SZ -2024-09-03,0.39725662333356965,002713.SZ -2024-09-03,0.45554624401609595,000608.SZ -2024-09-04,0.4347192064957309,002193.SZ -2024-09-04,0.5053308926189861,000608.SZ -2024-09-05,0.4744807779165658,000608.SZ -2024-09-05,0.5023973466439116,002193.SZ -2024-09-06,0.39263730044751594,002193.SZ -2024-09-06,0.40406598977253366,000679.SZ -2024-09-09,0.43051629052414286,002629.SZ -2024-09-09,0.4623141687395277,000608.SZ -2024-09-10,0.4364311305786881,002207.SZ -2024-09-10,0.5255216061266368,600539.SH -2024-09-11,0.382457798081239,603021.SH -2024-09-11,0.5751875611849466,000668.SZ -2024-09-12,0.4068234076393211,002629.SZ -2024-09-12,0.4280950991453465,000668.SZ -2024-09-13,0.405117254992803,002629.SZ -2024-09-13,0.4118672409363292,600193.SH -2024-09-18,0.4469189221401068,002629.SZ -2024-09-18,0.4557235552229207,000679.SZ -2024-09-19,0.49209538072745324,600193.SH -2024-09-19,0.6163410127596797,002856.SZ -2024-09-20,0.45668984159076514,002856.SZ -2024-09-20,0.4593979596914154,600193.SH -2024-09-23,0.4554351583079041,600193.SH -2024-09-23,0.49615865554245586,002856.SZ -2024-09-24,0.5020149954880005,000679.SZ -2024-09-24,0.5189277866681813,002193.SZ -2024-09-25,0.5074772252163499,002193.SZ -2024-09-25,0.5348197801012816,002058.SZ -2024-09-26,0.5560762764100831,002713.SZ -2024-09-26,0.6129288321204283,002856.SZ -2024-09-27,0.5904806770681329,603021.SH -2024-09-27,0.6044801433267253,002629.SZ -2024-09-30,0.5797641986414099,603880.SH -2024-09-30,0.5972034597960291,002856.SZ -2024-10-08,0.5666936469654609,603955.SH -2024-10-08,0.5928580832920408,603880.SH -2024-10-09,0.5416318199340464,002629.SZ -2024-10-09,0.5419678545398917,603880.SH -2024-10-10,0.5739719293100832,002629.SZ -2024-10-10,0.5938994551620502,000668.SZ -2024-10-11,0.5035760924125359,600768.SH -2024-10-11,0.5217823558542878,002629.SZ -2024-10-14,0.5247428624021013,002620.SZ -2024-10-14,0.5309388713081482,603880.SH -2024-10-15,0.5477048273043988,002620.SZ -2024-10-15,0.610571390517552,002193.SZ -2024-10-16,0.5984888294643671,002620.SZ -2024-10-16,0.6085247848902109,600455.SH -2024-10-17,0.5171265480909363,002629.SZ -2024-10-17,0.5294161099496105,002620.SZ -2024-10-18,0.5202274225809601,002620.SZ -2024-10-18,0.5851796744383599,603021.SH -2024-10-21,0.5533285492609823,600768.SH -2024-10-21,0.5718387001826628,600539.SH -2024-10-22,0.5499763754862853,002629.SZ -2024-10-22,0.5585730740883488,600539.SH -2024-10-23,0.5667947402880913,600539.SH -2024-10-23,0.605559839539957,002629.SZ -2024-10-24,0.5538159456594554,002193.SZ -2024-10-24,0.5709026443526699,600539.SH -2024-10-25,0.5660870687153161,600768.SH -2024-10-25,0.5885100336123548,600539.SH -2024-10-28,0.58348468448104,002629.SZ -2024-10-28,0.5895870726643077,603880.SH -2024-10-29,0.5387632463923646,000668.SZ -2024-10-29,0.5440363059107771,002719.SZ -2024-10-30,0.5382287375492156,600193.SH -2024-10-30,0.5773004367694596,605303.SH -2024-10-31,0.5365659002467259,002629.SZ -2024-10-31,0.5450385283190446,002856.SZ -2024-11-01,0.5177295486191564,002857.SZ -2024-11-01,0.5206080312604061,002629.SZ -2024-11-04,0.4877448583481612,000668.SZ -2024-11-04,0.5476595191224806,002629.SZ -2024-11-05,0.554452556154337,600539.SH -2024-11-05,0.580629230149577,002629.SZ -2024-11-06,0.5255418285163509,002629.SZ -2024-11-06,0.5263850316813586,002188.SZ -2024-11-07,0.5296422564515146,600539.SH -2024-11-07,0.5315117039230476,000890.SZ -2024-11-08,0.5398348256409757,605303.SH -2024-11-08,0.5433312277850862,002719.SZ -2024-11-11,0.577343915801866,002856.SZ -2024-11-11,0.5799235143853736,000668.SZ -2024-11-12,0.5372883526619091,605303.SH -2024-11-12,0.5476484873210192,603272.SH -2024-11-13,0.5302765029318761,000890.SZ -2024-11-13,0.5561890718326282,002629.SZ -2024-11-14,0.5110032356237769,603272.SH -2024-11-14,0.5202152077905219,002193.SZ -2024-11-15,0.5044166454446053,600768.SH -2024-11-15,0.519213363208455,002193.SZ -2024-11-18,0.5081526374422681,600768.SH -2024-11-18,0.5427833753040878,002193.SZ -2024-11-19,0.4842846511388819,603880.SH -2024-11-19,0.4848759862377114,002193.SZ -2024-11-20,0.49046836152034284,605303.SH -2024-11-20,0.4912855301623297,600539.SH -2024-11-21,0.5098204035403432,002856.SZ -2024-11-21,0.5209832570423325,603729.SH -2024-11-22,0.5357557084153544,603616.SH -2024-11-22,0.5438582385280837,603880.SH -2024-11-25,0.5531109121530012,600193.SH -2024-11-25,0.5580918974827301,600561.SH -2024-11-26,0.5768710971685107,600561.SH -2024-11-26,0.5769705376768313,603272.SH -2024-11-27,0.5514579075591943,002494.SZ -2024-11-27,0.5788857271009841,001211.SZ -2024-11-28,0.5621982995812409,002193.SZ -2024-11-28,0.5963011881639101,001211.SZ -2024-11-29,0.6058761257869284,001211.SZ -2024-11-29,0.6151741671886348,002193.SZ -2024-12-02,0.5610808461126814,600493.SH -2024-12-02,0.5796307343195098,603880.SH -2024-12-03,0.5617108081936681,603272.SH -2024-12-03,0.5659827439844977,000890.SZ -2024-12-04,0.5428178553912071,603316.SH -2024-12-04,0.6061113557840191,002629.SZ -2024-12-05,0.5141527803046726,603272.SH -2024-12-05,0.5526441071523486,002629.SZ -2024-12-06,0.5053839214722821,002620.SZ -2024-12-06,0.5608150394748377,002629.SZ -2024-12-09,0.5294268883617169,603272.SH -2024-12-09,0.5566326072821648,000890.SZ -2024-12-10,0.5283147391450074,603880.SH -2024-12-10,0.5531768261402814,603272.SH -2024-12-11,0.5112155047363589,000890.SZ -2024-12-11,0.5597356138693478,603880.SH -2024-12-12,0.548231667393632,603813.SH -2024-12-12,0.5950655383314178,603880.SH -2024-12-13,0.5501313702235476,605303.SH -2024-12-13,0.5612740812134472,002620.SZ -2024-12-16,0.5472589175647141,603709.SH -2024-12-16,0.5729950185328778,002856.SZ -2024-12-17,0.49123557585081934,002856.SZ -2024-12-17,0.511220534494992,603880.SH -2024-12-18,0.4980761726707782,002856.SZ -2024-12-18,0.551689950424863,600768.SH -2024-12-19,0.45394677195490973,603880.SH -2024-12-19,0.45693594811303995,002856.SZ -2024-12-20,0.4697105670351681,002620.SZ -2024-12-20,0.646187949455824,002856.SZ -2024-12-23,0.5109333941156472,605081.SH -2024-12-23,0.5181508404299133,603813.SH -2024-12-24,0.5053320023978426,000668.SZ -2024-12-24,0.5216903445804772,605081.SH -2024-12-25,0.5379076382762992,000691.SZ -2024-12-25,0.542860229157192,000668.SZ -2024-12-26,0.5265667237405621,000691.SZ -2024-12-26,0.5352005875426475,000668.SZ -2024-12-27,0.4477788484081396,000691.SZ -2024-12-27,0.502364691912312,605081.SH -2024-12-30,0.49174696117616973,000691.SZ -2024-12-30,0.5339511673481511,000668.SZ -2024-12-31,0.5103004475535443,000668.SZ -2024-12-31,0.5339222900623845,000691.SZ -2025-01-02,0.4946036082174513,000691.SZ -2025-01-02,0.5552506167413832,000668.SZ -2025-01-03,0.6006368359653035,000668.SZ -2025-01-03,0.6027999543998153,000691.SZ -2025-01-06,0.559899084007377,000668.SZ -2025-01-06,0.5795837845645619,000691.SZ -2025-01-07,0.515566874099722,000668.SZ -2025-01-07,0.5615116853437505,000691.SZ -2025-01-08,0.49931667332861757,603316.SH -2025-01-08,0.5659366922460924,000691.SZ -2025-01-09,0.5278062657042368,000668.SZ -2025-01-09,0.5446511405276259,000691.SZ -2025-01-10,0.5677219977031241,000691.SZ -2025-01-10,0.5783409509992758,002848.SZ -2025-01-13,0.5895501996231648,000691.SZ -2025-01-13,0.6112729018532156,002848.SZ -2025-01-14,0.5194273507474826,002848.SZ -2025-01-14,0.523703062363375,000691.SZ -2025-01-15,0.5376506867348088,002848.SZ -2025-01-15,0.5660413752014716,000890.SZ -2025-01-16,0.5191489911218367,002848.SZ -2025-01-16,0.5459940119990471,600421.SH -2025-01-17,0.5429216820265892,002848.SZ -2025-01-17,0.5643973592578087,600421.SH -2025-01-20,0.5364610944275656,002856.SZ -2025-01-20,0.5715336498115928,002848.SZ -2025-01-21,0.5530745158318197,603021.SH -2025-01-21,0.5625824024050877,002848.SZ -2025-01-22,0.5295527045596219,000691.SZ -2025-01-22,0.5501728634333789,600421.SH -2025-01-23,0.5381138132795721,600421.SH -2025-01-23,0.5644966066144262,002620.SZ -2025-01-24,0.5022697768595112,600421.SH -2025-01-24,0.5448504642510259,002789.SZ -2025-01-27,0.5109032896926358,605081.SH -2025-01-27,0.5376560498047893,000668.SZ -2025-02-05,0.5227775482146787,605081.SH -2025-02-05,0.5254103427053918,000668.SZ -2025-02-06,0.5075857631134818,600421.SH -2025-02-06,0.5276948763032684,002789.SZ -2025-02-07,0.47925956984732065,600753.SH -2025-02-07,0.5016241145548678,600421.SH -2025-02-10,0.5117541074760893,603021.SH -2025-02-10,0.5438465264300214,600421.SH -2025-02-11,0.49970620045023995,002848.SZ -2025-02-11,0.5065800090292322,002789.SZ -2025-02-12,0.4839164284686791,002848.SZ -2025-02-12,0.5134627353293566,603021.SH -2025-02-13,0.5007721936104674,603021.SH -2025-02-13,0.5044543051414732,002719.SZ -2025-02-14,0.4981518303753202,002789.SZ -2025-02-14,0.5003169999406966,002848.SZ -2025-02-17,0.5327309901117061,603021.SH -2025-02-17,0.6284012692085253,600421.SH -2025-02-18,0.5361108538138465,002719.SZ -2025-02-18,0.5395930916350984,002848.SZ -2025-02-19,0.49480780044179823,002848.SZ -2025-02-19,0.5548261162488035,603813.SH -2025-02-20,0.4852641561704775,002789.SZ -2025-02-20,0.6184093005210065,603813.SH -2025-02-21,0.48045192489231486,002848.SZ -2025-02-21,0.5042499871017748,002789.SZ -2025-02-24,0.5062513001546942,002848.SZ -2025-02-24,0.6150062422377711,603813.SH -2025-02-25,0.4844765227003948,002789.SZ -2025-02-25,0.5166030451413911,002848.SZ -2025-02-26,0.5023770903457476,603021.SH -2025-02-26,0.5574303475715232,603813.SH -2025-02-27,0.49236155540328125,002848.SZ -2025-02-27,0.5180883723584435,603813.SH -2025-02-28,0.521326655075013,600243.SH -2025-02-28,0.5302794202229549,002789.SZ -2025-03-03,0.4209711016534525,002848.SZ -2025-03-03,0.42208412771680764,002789.SZ -2025-03-04,0.46612335760711954,002620.SZ -2025-03-04,0.5453576565598474,605303.SH -2025-03-05,0.3793964149491973,002719.SZ -2025-03-05,0.4519339321777855,002789.SZ -2025-03-06,0.4068106918199979,002620.SZ -2025-03-06,0.4160128094062321,002789.SZ -2025-03-07,0.3756085790598387,002789.SZ -2025-03-07,0.44371157919966964,603813.SH -2025-03-10,0.4821204336751634,000668.SZ -2025-03-10,0.5518461770326154,605081.SH -2025-03-11,0.45602054331801456,002620.SZ -2025-03-11,0.5126734288265677,000929.SZ -2025-03-12,0.40867963475241903,000929.SZ -2025-03-12,0.46355927109098016,002620.SZ -2025-03-13,0.40647844734324173,002207.SZ -2025-03-13,0.45942735318186784,002620.SZ -2025-03-14,0.43158790376267764,000929.SZ -2025-03-14,0.5778329811638503,002719.SZ -2025-03-17,0.42820482690178746,605081.SH -2025-03-17,0.5850450117636978,002789.SZ -2025-03-18,0.4780283496663797,002719.SZ -2025-03-18,0.5867779467701226,002789.SZ -2025-03-19,0.5601862760926397,600243.SH -2025-03-19,0.6484981352588718,002789.SZ -2025-03-20,0.4537014876562799,002620.SZ -2025-03-20,0.525378788137904,002789.SZ -2025-03-21,0.4449121927791543,002620.SZ -2025-03-21,0.47312299706976774,002207.SZ -2025-03-24,0.3854611919240657,000668.SZ -2025-03-24,0.5873923220943436,605081.SH -2025-03-25,0.393282642754965,000668.SZ -2025-03-25,0.4808661516232899,605081.SH -2025-03-26,0.43001335295749976,000691.SZ -2025-03-26,0.5247941387302889,002856.SZ -2025-03-27,0.3719974665750594,002856.SZ -2025-03-27,0.3774761705871157,600753.SH -2025-03-28,0.34394815290708036,605081.SH -2025-03-28,0.37233601849429626,600753.SH -2025-03-31,0.3503863928429074,002848.SZ -2025-03-31,0.3570603561080764,000668.SZ -2025-04-01,0.3438362481983798,000691.SZ -2025-04-01,0.34510326644513845,000668.SZ -2025-04-02,0.3476045722872252,600243.SH -2025-04-02,0.3658782742668592,600753.SH -2025-04-03,0.34994666429651294,603389.SH -2025-04-03,0.3514717212377796,600355.SH -2025-04-07,0.43417852921027494,000668.SZ -2025-04-07,0.43510733647601435,600193.SH -2025-04-08,0.4548244475918582,000668.SZ -2025-04-08,0.4638116587611896,000691.SZ -2025-04-09,0.4499498907780134,000691.SZ -2025-04-09,0.4710871840275774,000668.SZ -2025-04-10,0.429600885217393,000668.SZ -2025-04-10,0.43463131766172824,002848.SZ -2025-04-11,0.3831515004377654,600421.SH -2025-04-11,0.3885871933347668,000691.SZ -2025-04-14,0.4190205646595782,600243.SH -2025-04-14,0.475820473881032,000668.SZ -2025-04-15,0.44160091785476496,000608.SZ -2025-04-15,0.5142413546702076,002848.SZ -2025-04-16,0.47656432990042097,002848.SZ -2025-04-16,0.5651474266342985,000668.SZ -2025-04-17,0.4940687848410305,002848.SZ -2025-04-17,0.5626061721198299,000668.SZ -2025-04-18,0.4796666895738385,002848.SZ -2025-04-18,0.5045361367094062,000668.SZ -2025-04-21,0.38304196430467713,000691.SZ -2025-04-21,0.4360946891518082,002848.SZ -2025-04-22,0.4251014468605595,002848.SZ -2025-04-22,0.5133255492113229,000691.SZ -2025-04-23,0.38563714410643896,000668.SZ -2025-04-23,0.42137005501584374,002848.SZ -2025-04-24,0.40602477711594154,000668.SZ -2025-04-24,0.45657659052533023,002848.SZ -2025-04-25,0.37659708833321126,600421.SH -2025-04-25,0.4701953874881278,000691.SZ -2025-04-28,0.3688633644833614,000638.SZ -2025-04-28,0.5897660866824628,000691.SZ -2025-04-29,0.38940116645383194,002193.SZ -2025-04-29,0.5967695592698524,002856.SZ -2025-04-30,0.4631251321597051,600768.SH -2025-04-30,0.48964944050868003,002856.SZ -2025-05-06,0.48976932085853997,600768.SH -2025-05-06,0.5366686449465924,002856.SZ -2025-05-07,0.4830897373795919,600847.SH -2025-05-07,0.5813064246697716,002856.SZ -2025-05-08,0.5386035722545206,603616.SH -2025-05-08,0.5579177651883649,002856.SZ -2025-05-09,0.5196089315528878,002856.SZ -2025-05-09,0.5562258132501385,603616.SH -2025-05-12,0.5413415390655797,002856.SZ -2025-05-12,0.5480367337576116,603616.SH -2025-05-13,0.49394754391674317,603616.SH -2025-05-13,0.5365105479376618,002856.SZ -2025-05-14,0.44883629331342584,002856.SZ -2025-05-14,0.4560955740133115,002193.SZ -2025-05-15,0.44612815705270736,002193.SZ -2025-05-15,0.5783707760147238,002856.SZ -2025-05-16,0.35370280858578523,002193.SZ -2025-05-16,0.5072854361287706,002856.SZ -2025-05-19,0.48873408302244303,603616.SH -2025-05-19,0.5368668966387351,002856.SZ -2025-05-20,0.474975039351168,002193.SZ -2025-05-20,0.5799434362215113,002856.SZ -2025-05-21,0.4632178576875343,603616.SH -2025-05-21,0.4887556104826177,002856.SZ -2025-05-22,0.45673866069540875,600671.SH -2025-05-22,0.4837373991370192,000890.SZ -2025-05-23,0.37800473521721567,002193.SZ -2025-05-23,0.4002679245702529,002856.SZ -2025-05-26,0.3933098334290615,600671.SH -2025-05-26,0.460726512659785,002856.SZ -2025-05-27,0.43077572647867113,603616.SH -2025-05-27,0.4724058369646811,000890.SZ -2025-05-28,0.4212661426980689,603616.SH -2025-05-28,0.4976248463737248,000890.SZ -2025-05-29,0.4009989360843923,002719.SZ -2025-05-29,0.5568479176659855,002856.SZ -2025-05-30,0.39111402622959696,600671.SH -2025-05-30,0.5615481433627119,002856.SZ +2023-01-03,0.35726081640385887,603536.SH +2023-01-03,0.43221477288307325,002494.SZ +2023-01-04,0.4226210124355705,600455.SH +2023-01-04,0.5362485980607439,000691.SZ +2023-01-05,0.36642805861386346,603499.SH +2023-01-05,0.3978273435377098,600455.SH +2023-01-06,0.35597389534256735,002848.SZ +2023-01-06,0.37244665041381336,002494.SZ +2023-01-09,0.3337650505939268,002828.SZ +2023-01-09,0.46647083949743645,603499.SH +2023-01-10,0.37832423334090093,002848.SZ +2023-01-10,0.44800160959436663,603499.SH +2023-01-11,0.29500144680920515,000691.SZ +2023-01-11,0.30537209805009846,002848.SZ +2023-01-12,0.32287057220336474,000023.SZ +2023-01-12,0.33879364348814156,600898.SH +2023-01-13,0.29660524011424,600455.SH +2023-01-13,0.32073714970960976,000691.SZ +2023-01-16,0.2908616817073321,000691.SZ +2023-01-16,0.37661040985283367,603316.SH +2023-01-17,0.288394839581443,000023.SZ +2023-01-17,0.38797082628900104,603316.SH +2023-01-18,0.34400258941316536,000691.SZ +2023-01-18,0.4005641235816332,002816.SZ +2023-01-19,0.38684134209268023,000691.SZ +2023-01-19,0.4652164898602952,600455.SH +2023-01-20,0.3309212380048035,600455.SH +2023-01-20,0.3551165260280218,000691.SZ +2023-01-30,0.3938271833097267,002199.SZ +2023-01-30,0.40852433030970664,600355.SH +2023-01-31,0.4162593228927832,600898.SH +2023-01-31,0.5128436296283219,600768.SH +2023-02-01,0.4989532605120924,002899.SZ +2023-02-01,0.5521969472898257,600768.SH +2023-02-02,0.41703014295716206,002830.SZ +2023-02-02,0.48845321223352894,600768.SH +2023-02-03,0.42882861597328,002830.SZ +2023-02-03,0.5402622330705296,600768.SH +2023-02-06,0.378184393212085,600768.SH +2023-02-06,0.39981469603778097,603316.SH +2023-02-07,0.44237286610460713,600898.SH +2023-02-07,0.499458275917118,600768.SH +2023-02-08,0.3713291968127906,600898.SH +2023-02-08,0.39645285732274654,600768.SH +2023-02-09,0.42205089014335134,603269.SH +2023-02-09,0.5318430182494814,600768.SH +2023-02-10,0.44390264153845377,600355.SH +2023-02-10,0.45764491024488,600768.SH +2023-02-13,0.39291294856963055,603685.SH +2023-02-13,0.4024428634154611,600768.SH +2023-02-14,0.34448811541065477,002848.SZ +2023-02-14,0.37181733673934997,603709.SH +2023-02-15,0.3582038571839546,002848.SZ +2023-02-15,0.39506600343674675,603559.SH +2023-02-16,0.3468428481924317,600898.SH +2023-02-16,0.38393783236147133,603709.SH +2023-02-17,0.31319777406590343,600898.SH +2023-02-17,0.3195057165275038,603559.SH +2023-02-20,0.31420837861908996,002848.SZ +2023-02-20,0.3676322056406766,600355.SH +2023-02-21,0.3645503739076372,600355.SH +2023-02-21,0.422564757701026,600243.SH +2023-02-22,0.30022185116533556,002780.SZ +2023-02-22,0.31407493338015097,600355.SH +2023-02-23,0.3121489714362923,600355.SH +2023-02-23,0.3172503728667497,600898.SH +2023-02-24,0.39402710587128986,603269.SH +2023-02-24,0.528275352696827,002633.SZ +2023-02-27,0.3863375025441781,002633.SZ +2023-02-27,0.43530805638007575,603559.SH +2023-02-28,0.32595824054466516,600898.SH +2023-02-28,0.3374530044835253,600137.SH +2023-03-01,0.33159547014914553,000692.SZ +2023-03-01,0.4587501168544292,002848.SZ +2023-03-02,0.3363620870738856,603958.SH +2023-03-02,0.3377778268178423,600898.SH +2023-03-03,0.3190733877104242,603958.SH +2023-03-03,0.32532681670409974,603685.SH +2023-03-06,0.3326216967109183,002848.SZ +2023-03-06,0.5233358415167998,603685.SH +2023-03-07,0.3454151393528935,002848.SZ +2023-03-07,0.37139273447694676,603559.SH +2023-03-08,0.3256570460779394,002856.SZ +2023-03-08,0.4119477734546329,603729.SH +2023-03-09,0.3065603959246641,002856.SZ +2023-03-09,0.3394835463887109,603729.SH +2023-03-10,0.3561371400055087,603269.SH +2023-03-10,0.37164473951081456,603729.SH +2023-03-13,0.2963501400526833,002856.SZ +2023-03-13,0.320470560013947,002848.SZ +2023-03-14,0.34521044919550353,002856.SZ +2023-03-14,0.35202911558457695,603813.SH +2023-03-15,0.27427440986027984,603316.SH +2023-03-15,0.30107647210060945,002848.SZ +2023-03-16,0.36683672735637873,002848.SZ +2023-03-16,0.39429896174863,600768.SH +2023-03-17,0.3081947249408559,002856.SZ +2023-03-17,0.3349574859404006,002830.SZ +2023-03-20,0.3256278822009417,603269.SH +2023-03-20,0.34718438970973403,600539.SH +2023-03-21,0.3071249076581682,002848.SZ +2023-03-21,0.5600454271845994,600539.SH +2023-03-22,0.3461102822830671,603729.SH +2023-03-22,0.34925801811564544,002856.SZ +2023-03-23,0.29830666775816733,600455.SH +2023-03-23,0.514460441669521,600539.SH +2023-03-24,0.30678333215450015,002856.SZ +2023-03-24,0.3436669281769977,000702.SZ +2023-03-27,0.3566880255464381,000702.SZ +2023-03-27,0.41726387796858244,600539.SH +2023-03-28,0.3637374442133049,000702.SZ +2023-03-28,0.3920424480170708,600539.SH +2023-03-29,0.3055579881121265,002856.SZ +2023-03-29,0.37480147411386794,000702.SZ +2023-03-30,0.28954388891789606,002856.SZ +2023-03-30,0.297462887366198,000702.SZ +2023-03-31,0.29644351351019876,002856.SZ +2023-03-31,0.334304641048563,000702.SZ +2023-04-03,0.3183919233604992,000702.SZ +2023-04-03,0.3294931894049502,603030.SH +2023-04-04,0.3225084650652502,000702.SZ +2023-04-04,0.326090427218833,603030.SH +2023-04-06,0.2758214303687139,603030.SH +2023-04-06,0.31351865840881626,600455.SH +2023-04-07,0.2673802629853239,002816.SZ +2023-04-07,0.27786214806970766,603030.SH +2023-04-10,0.2999000310960867,600539.SH +2023-04-10,0.3378770517715652,603030.SH +2023-04-11,0.27176341224286904,600355.SH +2023-04-11,0.35415920477246315,603030.SH +2023-04-12,0.32995108494245273,603030.SH +2023-04-12,0.3885537483805394,002633.SZ +2023-04-13,0.35475291968697115,600543.SH +2023-04-13,0.4951896047212965,603030.SH +2023-04-14,0.3392773289999914,600234.SH +2023-04-14,0.4687278197827219,603030.SH +2023-04-17,0.34113119468584835,600539.SH +2023-04-17,0.412649573804684,603030.SH +2023-04-18,0.3073971225811296,603536.SH +2023-04-18,0.370866131843945,603030.SH +2023-04-19,0.2891654169456959,603536.SH +2023-04-19,0.397876852430759,603030.SH +2023-04-20,0.27412344030352076,000609.SZ +2023-04-20,0.44025765229398967,603030.SH +2023-04-21,0.32851274958260984,000416.SZ +2023-04-21,0.41486198902714383,603030.SH +2023-04-24,0.3353364379656697,000609.SZ +2023-04-24,0.45173648948963774,603030.SH +2023-04-25,0.3594363945608729,000023.SZ +2023-04-25,0.38325432371027895,000691.SZ +2023-04-26,0.4198663817793944,002652.SZ +2023-04-26,0.4407914637638057,603030.SH +2023-04-27,0.4408972752304383,603030.SH +2023-04-27,0.4676115619404572,002652.SZ +2023-04-28,0.36693365550262763,002652.SZ +2023-04-28,0.5118973359864434,603030.SH +2023-05-04,0.3676932611542239,603958.SH +2023-05-04,0.4439090966596742,002652.SZ +2023-05-05,0.3384049690922327,002856.SZ +2023-05-05,0.40368091510416504,002652.SZ +2023-05-08,0.3361459596729393,000691.SZ +2023-05-08,0.37240383751215883,002652.SZ +2023-05-09,0.3578419473501524,002652.SZ +2023-05-09,0.3969636292182372,603725.SH +2023-05-10,0.33409450295644016,002856.SZ +2023-05-10,0.3471565072395677,002652.SZ +2023-05-11,0.5361245401139424,603729.SH +2023-05-11,0.5663809992811509,603958.SH +2023-05-12,0.4408880613611885,603729.SH +2023-05-12,0.5864981206698648,603958.SH +2023-05-15,0.43930796706090314,603729.SH +2023-05-15,0.48652986897245976,603958.SH +2023-05-16,0.44046587936133963,603729.SH +2023-05-16,0.4791301126757799,002652.SZ +2023-05-17,0.38484749750772307,002652.SZ +2023-05-17,0.4020866544763279,603729.SH +2023-05-18,0.4005974211717497,002316.SZ +2023-05-18,0.4729133958784151,603958.SH +2023-05-19,0.3669752632832702,002316.SZ +2023-05-19,0.5207545238495663,603958.SH +2023-05-22,0.32960033870283145,002652.SZ +2023-05-22,0.4551273304641436,603958.SH +2023-05-23,0.46486434198599497,002316.SZ +2023-05-23,0.6001050399309603,603958.SH +2023-05-24,0.42335882487458304,002719.SZ +2023-05-24,0.5447535258807863,603958.SH +2023-05-25,0.44711604015009204,002719.SZ +2023-05-25,0.4506204517716332,603958.SH +2023-05-26,0.39619858811009856,603958.SH +2023-05-26,0.47216354664877863,002719.SZ +2023-05-29,0.46403607716658524,002719.SZ +2023-05-29,0.5544097455232486,603958.SH +2023-05-30,0.3610427538331087,002719.SZ +2023-05-30,0.5169279439163714,600083.SH +2023-05-31,0.371112176474368,603958.SH +2023-05-31,0.40080403252619606,603608.SH +2023-06-01,0.3725923942057072,603958.SH +2023-06-01,0.432411278478421,002719.SZ +2023-06-02,0.35352086385528936,603958.SH +2023-06-02,0.4384649685026817,002719.SZ +2023-06-05,0.40614240579954136,000622.SZ +2023-06-05,0.41876694472982406,603729.SH +2023-06-06,0.37855454926633547,603389.SH +2023-06-06,0.44068756240837487,000622.SZ +2023-06-07,0.41287359166835996,603389.SH +2023-06-07,0.4162014914937149,002652.SZ +2023-06-08,0.40705695911254824,600137.SH +2023-06-08,0.42687067186585026,600083.SH +2023-06-09,0.3766457958119192,600137.SH +2023-06-09,0.4878055493543139,002719.SZ +2023-06-12,0.3842108609344165,600137.SH +2023-06-12,0.6050200029014063,603286.SH +2023-06-13,0.3744651379908239,002652.SZ +2023-06-13,0.4377286366983057,603286.SH +2023-06-14,0.343718952974977,002848.SZ +2023-06-14,0.45768511033440196,603286.SH +2023-06-15,0.36969620694319166,002848.SZ +2023-06-15,0.3880755057235187,603286.SH +2023-06-16,0.35273736498640806,603286.SH +2023-06-16,0.4054834168194157,002719.SZ +2023-06-19,0.352236365563895,002719.SZ +2023-06-19,0.5493146207063944,603286.SH +2023-06-20,0.3338212958353746,002719.SZ +2023-06-20,0.3599023234048522,002247.SZ +2023-06-21,0.34960376723927095,002211.SZ +2023-06-21,0.3938253224566695,002058.SZ +2023-06-26,0.4424642968709881,002247.SZ +2023-06-26,0.5176700072461707,000691.SZ +2023-06-27,0.37673690982944436,000609.SZ +2023-06-27,0.43379050589222656,002211.SZ +2023-06-28,0.39499675800628087,002211.SZ +2023-06-28,0.5662146587825085,000609.SZ +2023-06-29,0.38553680602726087,002211.SZ +2023-06-29,0.44569420753994626,000609.SZ +2023-06-30,0.36802316714329436,000609.SZ +2023-06-30,0.40526902515461644,603709.SH +2023-07-03,0.3821485445391597,603389.SH +2023-07-03,0.5512600433794577,002211.SZ +2023-07-04,0.38569583194975143,603709.SH +2023-07-04,0.5066283729148592,000691.SZ +2023-07-05,0.4359469434581425,000691.SZ +2023-07-05,0.5233751265164871,002211.SZ +2023-07-06,0.4412285806651102,000702.SZ +2023-07-06,0.584358215383938,000691.SZ +2023-07-07,0.37478071429054965,000702.SZ +2023-07-07,0.5199749893208312,000691.SZ +2023-07-10,0.39357968301221985,600493.SH +2023-07-10,0.44556609889742094,000691.SZ +2023-07-11,0.3723383211936993,000691.SZ +2023-07-11,0.5711524547591765,600493.SH +2023-07-12,0.38627786055521734,000691.SZ +2023-07-12,0.3886189098122659,002211.SZ +2023-07-13,0.35739960082236355,002211.SZ +2023-07-13,0.41797187585526485,000691.SZ +2023-07-14,0.39255073699592785,000691.SZ +2023-07-14,0.5462348084062562,000609.SZ +2023-07-17,0.36297630009308435,603729.SH +2023-07-17,0.4407513591950694,000609.SZ +2023-07-18,0.36119388013932646,000609.SZ +2023-07-18,0.44368269579092245,603709.SH +2023-07-19,0.3690792579068132,603709.SH +2023-07-19,0.583729458947063,000609.SZ +2023-07-20,0.519507674210736,000691.SZ +2023-07-20,0.5772321083122341,000609.SZ +2023-07-21,0.5125188655998161,000691.SZ +2023-07-21,0.577855182061274,000609.SZ +2023-07-24,0.4493669618270401,000609.SZ +2023-07-24,0.4819512560773986,000691.SZ +2023-07-25,0.540159859269286,000691.SZ +2023-07-25,0.5444338814653403,000609.SZ +2023-07-26,0.4839163725582595,000691.SZ +2023-07-26,0.5849228145847308,000609.SZ +2023-07-27,0.4506565068738397,000609.SZ +2023-07-27,0.46598618358995286,000691.SZ +2023-07-28,0.41895402529360865,000691.SZ +2023-07-28,0.6588890596011194,000609.SZ +2023-07-31,0.5014945375922131,000609.SZ +2023-07-31,0.5948409696146899,002652.SZ +2023-08-01,0.4417734507728101,002652.SZ +2023-08-01,0.461646631689399,000609.SZ +2023-08-02,0.41339971265772774,002652.SZ +2023-08-02,0.42953156837655754,000609.SZ +2023-08-03,0.39274691487507074,002652.SZ +2023-08-03,0.5331928475171237,000609.SZ +2023-08-04,0.38433245542686245,600355.SH +2023-08-04,0.41389204370322297,002629.SZ +2023-08-07,0.4088812031390068,002652.SZ +2023-08-07,0.41476219784824064,002629.SZ +2023-08-08,0.3875368004825115,002652.SZ +2023-08-08,0.4534324178916809,000609.SZ +2023-08-09,0.34469370390471166,002652.SZ +2023-08-09,0.39225353805138163,000609.SZ +2023-08-10,0.3985633639921791,000609.SZ +2023-08-10,0.5271573397755869,002652.SZ +2023-08-11,0.37348262671077115,000609.SZ +2023-08-11,0.4897399754620921,002652.SZ +2023-08-14,0.357525660543447,000691.SZ +2023-08-14,0.46028641947262344,002652.SZ +2023-08-15,0.3370068987949374,000609.SZ +2023-08-15,0.42793178746822974,002652.SZ +2023-08-16,0.49187129435090704,000609.SZ +2023-08-16,0.507331856978182,002652.SZ +2023-08-17,0.3684184546269192,002828.SZ +2023-08-17,0.4730649964835501,002652.SZ +2023-08-18,0.47756752486730375,000609.SZ +2023-08-18,0.501292950265176,002652.SZ +2023-08-21,0.4643935340653238,600455.SH +2023-08-21,0.5018744639208389,002652.SZ +2023-08-22,0.4650337957166985,600539.SH +2023-08-22,0.5027128788333687,002652.SZ +2023-08-23,0.4456956140398217,600455.SH +2023-08-23,0.4836539650144593,002652.SZ +2023-08-24,0.4290925496731398,002652.SZ +2023-08-24,0.44322725059192103,002856.SZ +2023-08-25,0.43514517005039516,002193.SZ +2023-08-25,0.4399510501518596,600455.SH +2023-08-28,0.4342143235826193,603860.SH +2023-08-28,0.4686603743046102,600561.SH +2023-08-29,0.4345045995437664,002856.SZ +2023-08-29,0.47780265080044976,001211.SZ +2023-08-30,0.4472422809550977,002856.SZ +2023-08-30,0.5087375418970789,603389.SH +2023-08-31,0.45915838369325657,002856.SZ +2023-08-31,0.4922234989783937,603389.SH +2023-09-01,0.4237060040329142,002652.SZ +2023-09-01,0.4465839223195657,002856.SZ +2023-09-04,0.4407235804970296,002058.SZ +2023-09-04,0.600538448189531,603389.SH +2023-09-05,0.36129544052707974,002848.SZ +2023-09-05,0.48060024060422496,603389.SH +2023-09-06,0.3903326799920437,603389.SH +2023-09-06,0.45279505632898764,002848.SZ +2023-09-07,0.3616102506813906,002856.SZ +2023-09-07,0.3643625819303366,603709.SH +2023-09-08,0.3330541409362595,002652.SZ +2023-09-08,0.41672577706047903,603389.SH +2023-09-11,0.3524887165118727,002652.SZ +2023-09-11,0.43066089623829873,603389.SH +2023-09-12,0.3399094133496281,002652.SZ +2023-09-12,0.4082251659274839,603389.SH +2023-09-13,0.3351702908375929,600355.SH +2023-09-13,0.3932622850210888,603389.SH +2023-09-14,0.3315192890819815,000609.SZ +2023-09-14,0.38988434305773045,603389.SH +2023-09-15,0.3295431197181067,600355.SH +2023-09-15,0.35584942428511723,603389.SH +2023-09-18,0.41895259851398575,002848.SZ +2023-09-18,0.5317898999184077,603389.SH +2023-09-19,0.36584049466121443,000609.SZ +2023-09-19,0.4976710029775008,603389.SH +2023-09-20,0.37057224403478994,600137.SH +2023-09-20,0.45140238773461194,603389.SH +2023-09-21,0.4194155543750161,000609.SZ +2023-09-21,0.46227268654714143,603389.SH +2023-09-22,0.41585154032010124,000609.SZ +2023-09-22,0.45194968396647894,603389.SH +2023-09-25,0.4102260091591797,603389.SH +2023-09-25,0.44403476613611903,603286.SH +2023-09-26,0.38201607689911415,000609.SZ +2023-09-26,0.3882637398847545,603389.SH +2023-09-27,0.3771439807259555,603389.SH +2023-09-27,0.3893555560488144,000609.SZ +2023-09-28,0.34836064141886514,603389.SH +2023-09-28,0.40516772031707327,002652.SZ +2023-10-09,0.372561016229351,002652.SZ +2023-10-09,0.3923549739072598,000609.SZ +2023-10-10,0.3833687747403422,002652.SZ +2023-10-10,0.4697191927983118,600083.SH +2023-10-11,0.38006061652284423,600083.SH +2023-10-11,0.548816601680105,002652.SZ +2023-10-12,0.3959183972891438,002629.SZ +2023-10-12,0.44368896465802987,600083.SH +2023-10-13,0.38447496696600847,603286.SH +2023-10-13,0.40023139085119713,600083.SH +2023-10-16,0.36039150618064963,603286.SH +2023-10-16,0.44770303448834115,002652.SZ +2023-10-17,0.46709192443925773,600083.SH +2023-10-17,0.48905103301497777,600493.SH +2023-10-18,0.37316163630465815,002652.SZ +2023-10-18,0.41322564331077444,600561.SH +2023-10-19,0.36143037752533813,002652.SZ +2023-10-19,0.44936325183811077,600083.SH +2023-10-20,0.4228560239836131,603729.SH +2023-10-20,0.46552694434270775,600083.SH +2023-10-23,0.4928060253208298,603729.SH +2023-10-23,0.4967117345693032,600083.SH +2023-10-24,0.47498681733075154,000691.SZ +2023-10-24,0.5444491054363607,603729.SH +2023-10-25,0.47765341798367783,002856.SZ +2023-10-25,0.4992851018903876,603729.SH +2023-10-26,0.5036384199265574,603389.SH +2023-10-26,0.5066887951726656,603729.SH +2023-10-27,0.4209832132815779,603729.SH +2023-10-27,0.4554955573355266,603389.SH +2023-10-30,0.42998247869766876,001211.SZ +2023-10-30,0.43724724677404075,603729.SH +2023-10-31,0.4083491756890464,603729.SH +2023-10-31,0.5366036725673622,600493.SH +2023-11-01,0.3859800693252396,002652.SZ +2023-11-01,0.41682698522288875,603729.SH +2023-11-02,0.43504186864527883,002652.SZ +2023-11-02,0.4571258777594968,001211.SZ +2023-11-03,0.3711258997180335,001211.SZ +2023-11-03,0.49381283289049394,600493.SH +2023-11-06,0.38966040895289766,002719.SZ +2023-11-06,0.4458892065377838,600493.SH +2023-11-07,0.3853664015880389,002719.SZ +2023-11-07,0.5432477485380661,600493.SH +2023-11-08,0.3491667116856182,600561.SH +2023-11-08,0.36009965378060244,002848.SZ +2023-11-09,0.35418313319264255,000890.SZ +2023-11-09,0.37952981938941555,600493.SH +2023-11-10,0.34670623889180235,002719.SZ +2023-11-10,0.3648460630101847,600493.SH +2023-11-13,0.3812137591972947,002247.SZ +2023-11-13,0.5450946314459363,002193.SZ +2023-11-14,0.36136352467536265,002193.SZ +2023-11-14,0.5178022934936923,002719.SZ +2023-11-15,0.3490192227565885,002193.SZ +2023-11-15,0.3952466533890034,603860.SH +2023-11-16,0.3642202354847784,000609.SZ +2023-11-16,0.3765843291990421,002193.SZ +2023-11-17,0.3538643771136443,600493.SH +2023-11-17,0.38436510500792065,603021.SH +2023-11-20,0.38260850290889453,002856.SZ +2023-11-20,0.5417905622805832,600455.SH +2023-11-21,0.42254861417276285,002856.SZ +2023-11-21,0.4335044857201329,600539.SH +2023-11-22,0.38938743741996434,603389.SH +2023-11-22,0.43067164956817094,600455.SH +2023-11-23,0.3840848081528446,600493.SH +2023-11-23,0.3860461329062914,603021.SH +2023-11-24,0.4109786394852127,002193.SZ +2023-11-24,0.41445947302209335,603389.SH +2023-11-27,0.5196915800272661,002058.SZ +2023-11-27,0.6036721976484097,002856.SZ +2023-11-28,0.4094449625839159,000609.SZ +2023-11-28,0.5983024397312956,002856.SZ +2023-11-29,0.37281146266235987,002652.SZ +2023-11-29,0.6063622315837472,002856.SZ +2023-11-30,0.39162859487301804,002058.SZ +2023-11-30,0.4132372698356889,002652.SZ +2023-12-01,0.4613693854139012,002193.SZ +2023-12-01,0.5863329680721765,002856.SZ +2023-12-04,0.4221365558497509,600493.SH +2023-12-04,0.4260051328236926,002193.SZ +2023-12-05,0.5886839707705082,002856.SZ +2023-12-05,0.6164855150018117,603272.SH +2023-12-06,0.5056050080957546,600083.SH +2023-12-06,0.516217207122131,600561.SH +2023-12-07,0.47979641364004916,002856.SZ +2023-12-07,0.5340920414810103,600083.SH +2023-12-08,0.42815645916790546,603389.SH +2023-12-08,0.46293068448307373,600083.SH +2023-12-11,0.4387951947875869,002856.SZ +2023-12-11,0.4513020902636649,600561.SH +2023-12-12,0.4454805323377451,002856.SZ +2023-12-12,0.4604149331448914,002883.SZ +2023-12-13,0.43326067501883386,002058.SZ +2023-12-13,0.5461458151951953,002856.SZ +2023-12-14,0.4814975361431844,002883.SZ +2023-12-14,0.5096389985956782,002856.SZ +2023-12-15,0.48835194379563335,002883.SZ +2023-12-15,0.511888582240823,002856.SZ +2023-12-18,0.46588152517792064,000668.SZ +2023-12-18,0.5541798609534324,603389.SH +2023-12-19,0.48564593721489485,600083.SH +2023-12-19,0.5287559554802186,603389.SH +2023-12-20,0.4997639448672349,600083.SH +2023-12-20,0.5968118372250492,603389.SH +2023-12-21,0.46152493585122173,600083.SH +2023-12-21,0.49916921888339394,000929.SZ +2023-12-22,0.44698070828142167,600083.SH +2023-12-22,0.47519305774055065,003017.SZ +2023-12-25,0.457181254326652,000668.SZ +2023-12-25,0.4716049810053938,600083.SH +2023-12-26,0.47113033190017933,600083.SH +2023-12-26,0.5954108267967207,603389.SH +2023-12-27,0.44082420082786233,000691.SZ +2023-12-27,0.5774992951309392,603389.SH +2023-12-28,0.4515651607948311,600083.SH +2023-12-28,0.5169645046274046,603389.SH +2023-12-29,0.5138766001675388,603389.SH +2023-12-29,0.5214575957988234,002633.SZ +2024-01-02,0.500896997417676,000691.SZ +2024-01-02,0.5450322628038244,600768.SH +2024-01-03,0.39994486418477754,600768.SH +2024-01-03,0.4955839581100504,000691.SZ +2024-01-04,0.4554944596222594,603389.SH +2024-01-04,0.638427370266253,000691.SZ +2024-01-05,0.5012847993215561,603389.SH +2024-01-05,0.5949146651561102,000691.SZ +2024-01-08,0.5176640538844896,603389.SH +2024-01-08,0.540620201009454,000691.SZ +2024-01-09,0.4635323831320932,002633.SZ +2024-01-09,0.498179042618492,000691.SZ +2024-01-10,0.45560275846216536,603356.SH +2024-01-10,0.4828347937187344,000691.SZ +2024-01-11,0.47499597057904047,000691.SZ +2024-01-11,0.6163078230899134,605081.SH +2024-01-12,0.4558163779415175,000691.SZ +2024-01-12,0.5522165719604587,605081.SH +2024-01-15,0.4852148468173289,605081.SH +2024-01-15,0.5303022996544235,603389.SH +2024-01-16,0.4534999212587099,000691.SZ +2024-01-16,0.48505942726366486,605081.SH +2024-01-17,0.4908563712482563,002629.SZ +2024-01-17,0.532161472446905,605081.SH +2024-01-18,0.4796681038454789,600083.SH +2024-01-18,0.5042030962641606,605081.SH +2024-01-19,0.47404537476585573,002629.SZ +2024-01-19,0.4929930975441956,002652.SZ +2024-01-22,0.5604734990549209,002856.SZ +2024-01-22,0.5741302584283895,002629.SZ +2024-01-23,0.5335081764120491,600539.SH +2024-01-23,0.5467462538939866,002652.SZ +2024-01-24,0.5713341979799247,002629.SZ +2024-01-24,0.5740690429416238,002856.SZ +2024-01-25,0.501801613828524,002856.SZ +2024-01-25,0.539547869218116,002629.SZ +2024-01-26,0.45506085401500634,002856.SZ +2024-01-26,0.4854164047478958,002211.SZ +2024-01-29,0.46730357493986896,603389.SH +2024-01-29,0.5354404140361934,002856.SZ +2024-01-30,0.5090598408773443,603389.SH +2024-01-30,0.5316314377870117,002856.SZ +2024-01-31,0.609580105370422,603389.SH +2024-01-31,0.6310522400767878,002193.SZ +2024-02-01,0.5372960470773132,002848.SZ +2024-02-01,0.538573866750923,603316.SH +2024-02-02,0.5514792854987307,600083.SH +2024-02-02,0.5648616893323936,603316.SH +2024-02-05,0.4968965089009746,002848.SZ +2024-02-05,0.5005361213589056,000929.SZ +2024-02-06,0.49791006549128347,600083.SH +2024-02-06,0.5118727412224509,002848.SZ +2024-02-07,0.4889440011909323,600083.SH +2024-02-07,0.5033533830257994,002652.SZ +2024-02-08,0.465544732040647,002856.SZ +2024-02-08,0.4814250648356407,002652.SZ +2024-02-19,0.46122265009600505,002856.SZ +2024-02-19,0.46452892768363446,600083.SH +2024-02-20,0.4417573086006209,002856.SZ +2024-02-20,0.5098950522553066,603389.SH +2024-02-21,0.44531441227657076,002856.SZ +2024-02-21,0.4847651593652633,603389.SH +2024-02-22,0.4214626366884127,002856.SZ +2024-02-22,0.42161988259903505,600847.SH +2024-02-23,0.48549910682509984,002633.SZ +2024-02-23,0.530617441154754,002856.SZ +2024-02-26,0.4943162452532369,002856.SZ +2024-02-26,0.5132785688895695,002633.SZ +2024-02-27,0.523289260073513,603389.SH +2024-02-27,0.5575691239036966,002856.SZ +2024-02-28,0.471714130612184,002652.SZ +2024-02-28,0.5386749374326517,002856.SZ +2024-02-29,0.46237582795804283,002719.SZ +2024-02-29,0.4999649106849217,002856.SZ +2024-03-01,0.4559572639954783,603389.SH +2024-03-01,0.510152150407962,002856.SZ +2024-03-04,0.4555111900768805,603389.SH +2024-03-04,0.5310224135279273,002856.SZ +2024-03-05,0.4651575687054748,000622.SZ +2024-03-05,0.49750948449579163,002856.SZ +2024-03-06,0.45137138896664475,002193.SZ +2024-03-06,0.5027730964484158,002856.SZ +2024-03-07,0.4613078906300015,002188.SZ +2024-03-07,0.5061987278842499,002856.SZ +2024-03-08,0.4672871416355282,603389.SH +2024-03-08,0.5032000971973568,002856.SZ +2024-03-11,0.4740487814746737,002719.SZ +2024-03-11,0.48432720215703595,603389.SH +2024-03-12,0.4715656433302067,603021.SH +2024-03-12,0.5179316224242551,002856.SZ +2024-03-13,0.4834771902188389,603389.SH +2024-03-13,0.5502426014207988,002856.SZ +2024-03-14,0.5027902198560026,603021.SH +2024-03-14,0.5227629849191893,002856.SZ +2024-03-15,0.5393591027694752,002856.SZ +2024-03-15,0.5446712688186304,605081.SH +2024-03-18,0.5329818682373242,000691.SZ +2024-03-18,0.5384402235178858,002856.SZ +2024-03-19,0.5197866842142731,002652.SZ +2024-03-19,0.5337020267964063,002207.SZ +2024-03-20,0.5638946609392158,603021.SH +2024-03-20,0.5665913730659988,002856.SZ +2024-03-21,0.5641160531954802,002719.SZ +2024-03-21,0.5742317633047151,002188.SZ +2024-03-22,0.48992232121447354,002652.SZ +2024-03-22,0.5106206273717022,603021.SH +2024-03-25,0.46016547723877005,000622.SZ +2024-03-25,0.5129507745398617,002247.SZ +2024-03-26,0.47992081775754275,002629.SZ +2024-03-26,0.48223633358199597,002856.SZ +2024-03-27,0.5483907666865003,002856.SZ +2024-03-27,0.6111505712222385,000691.SZ +2024-03-28,0.5710778189746,603813.SH +2024-03-28,0.6127743961751507,000691.SZ +2024-03-29,0.4974131859193182,000691.SZ +2024-03-29,0.5142715121972331,603021.SH +2024-04-01,0.4948652103273001,605081.SH +2024-04-01,0.5121311996212076,002856.SZ +2024-04-02,0.5733558328139784,603316.SH +2024-04-02,0.6095214996948118,000691.SZ +2024-04-03,0.5068140770694192,000691.SZ +2024-04-03,0.5277555546181578,002652.SZ +2024-04-08,0.49295832740622614,002856.SZ +2024-04-08,0.49581402876566194,600539.SH +2024-04-09,0.48979521036227974,600847.SH +2024-04-09,0.5232515436587156,600234.SH +2024-04-10,0.5155455488146155,600539.SH +2024-04-10,0.5522986384300281,002856.SZ +2024-04-11,0.5254930764812604,600539.SH +2024-04-11,0.534557786592593,600847.SH +2024-04-12,0.48921121368496995,600847.SH +2024-04-12,0.5596194452496196,600234.SH +2024-04-15,0.5255286224593527,002856.SZ +2024-04-15,0.5394740612657086,600539.SH +2024-04-16,0.47667150942978326,002247.SZ +2024-04-16,0.5181061423805683,002188.SZ +2024-04-17,0.5164269450236623,002633.SZ +2024-04-17,0.5350998490162358,002856.SZ +2024-04-18,0.510850453796069,002633.SZ +2024-04-18,0.5513484994776621,002856.SZ +2024-04-19,0.5411458119679431,600234.SH +2024-04-19,0.5465652458731091,002856.SZ +2024-04-22,0.45841417972924364,002629.SZ +2024-04-22,0.477058185687978,002856.SZ +2024-04-23,0.5527954297735369,002193.SZ +2024-04-23,0.5798562849224663,002856.SZ +2024-04-24,0.5141985128865386,002193.SZ +2024-04-24,0.5594626771799996,002856.SZ +2024-04-25,0.5081567322723957,002629.SZ +2024-04-25,0.5383463804402334,002193.SZ +2024-04-26,0.45925444081860406,002633.SZ +2024-04-26,0.48060638438073533,002856.SZ +2024-04-29,0.4574220850991771,002856.SZ +2024-04-29,0.4624548030927595,002193.SZ +2024-04-30,0.49281776317751397,002193.SZ +2024-04-30,0.5101443909412082,002856.SZ +2024-05-06,0.49268234537895583,002856.SZ +2024-05-06,0.534737252996966,002193.SZ +2024-05-07,0.536732478569144,002193.SZ +2024-05-07,0.5748822383055384,002856.SZ +2024-05-08,0.44307973591238636,002193.SZ +2024-05-08,0.46528547012168714,002856.SZ +2024-05-09,0.43036316546652065,603389.SH +2024-05-09,0.4808024174760762,002633.SZ +2024-05-10,0.452615742496933,002856.SZ +2024-05-10,0.484623301008297,603389.SH +2024-05-13,0.45989469130574284,002856.SZ +2024-05-13,0.49137461007175703,002629.SZ +2024-05-14,0.5058958338526436,002629.SZ +2024-05-14,0.5059515343597869,002193.SZ +2024-05-15,0.4897649410174628,002856.SZ +2024-05-15,0.5058611995626419,002629.SZ +2024-05-16,0.5223768951050697,600847.SH +2024-05-16,0.5992778884705088,002856.SZ +2024-05-17,0.5509714488477924,000668.SZ +2024-05-17,0.5665753829930431,002856.SZ +2024-05-20,0.4944196752474134,600847.SH +2024-05-20,0.5201136973912328,002856.SZ +2024-05-21,0.4977255196511664,002629.SZ +2024-05-21,0.5061251049071748,002856.SZ +2024-05-22,0.4916449448406998,002629.SZ +2024-05-22,0.5001606001306644,002856.SZ +2024-05-23,0.5259584191141293,002629.SZ +2024-05-23,0.5538220542451324,002193.SZ +2024-05-24,0.47252687761847506,002193.SZ +2024-05-24,0.5288788682137855,002629.SZ +2024-05-27,0.48033788825667634,002629.SZ +2024-05-27,0.49486315030414485,600321.SH +2024-05-28,0.46058437189628154,002629.SZ +2024-05-28,0.4662256106970867,002193.SZ +2024-05-29,0.503575297523497,002193.SZ +2024-05-29,0.5205850251817137,002629.SZ +2024-05-30,0.5006223135461858,600539.SH +2024-05-30,0.5606544462649362,002629.SZ +2024-05-31,0.5638691624485469,002629.SZ +2024-05-31,0.61268243286056,000679.SZ +2024-06-03,0.5138660596023488,002193.SZ +2024-06-03,0.5743963495448371,002629.SZ +2024-06-04,0.5384289328119315,002193.SZ +2024-06-04,0.5943832205969106,002629.SZ +2024-06-05,0.5731378768715826,002193.SZ +2024-06-05,0.6403427849732544,002629.SZ +2024-06-06,0.49253188949531646,603021.SH +2024-06-06,0.5026202364131026,002629.SZ +2024-06-07,0.5045864048934101,002193.SZ +2024-06-07,0.5233376882486036,002629.SZ +2024-06-11,0.5136331028216347,002193.SZ +2024-06-11,0.5211887038002959,002629.SZ +2024-06-12,0.5908607070922225,002193.SZ +2024-06-12,0.644438093207966,002629.SZ +2024-06-13,0.47853918602105194,002193.SZ +2024-06-13,0.5413704101595644,002629.SZ +2024-06-14,0.4385170274276377,002193.SZ +2024-06-14,0.4973975157002408,002629.SZ +2024-06-17,0.4379385414354567,002193.SZ +2024-06-17,0.46197147346094247,002629.SZ +2024-06-18,0.5115893457737228,002193.SZ +2024-06-18,0.5501430080636767,002629.SZ +2024-06-19,0.4518451815144305,002629.SZ +2024-06-19,0.4619134661038914,603021.SH +2024-06-20,0.43613753029230223,002193.SZ +2024-06-20,0.4595987338153078,002629.SZ +2024-06-21,0.48412575611921754,002193.SZ +2024-06-21,0.5123638012502826,002629.SZ +2024-06-24,0.556644127602212,002193.SZ +2024-06-24,0.5757882262948735,002629.SZ +2024-06-25,0.5746373168300702,002193.SZ +2024-06-25,0.6041825654219511,002629.SZ +2024-06-26,0.5336697434320142,002193.SZ +2024-06-26,0.580038013519278,002629.SZ +2024-06-27,0.5359822029210809,002193.SZ +2024-06-27,0.5871393994346774,002629.SZ +2024-06-28,0.47487121923094533,603021.SH +2024-06-28,0.5524762632453623,002629.SZ +2024-07-01,0.48355201457252694,002193.SZ +2024-07-01,0.5223407853431609,002629.SZ +2024-07-02,0.510319235818614,002193.SZ +2024-07-02,0.5290628890891916,002629.SZ +2024-07-03,0.5175106968188614,002193.SZ +2024-07-03,0.5510271356276079,002629.SZ +2024-07-04,0.5734902725735012,002629.SZ +2024-07-04,0.5841468658749411,002193.SZ +2024-07-05,0.6057878938133553,002193.SZ +2024-07-05,0.6212947237641901,002629.SZ +2024-07-08,0.5966938214988765,002193.SZ +2024-07-08,0.6213865405769714,002629.SZ +2024-07-09,0.5728034779455906,002193.SZ +2024-07-09,0.5872735187914452,002629.SZ +2024-07-10,0.5469690717631172,002193.SZ +2024-07-10,0.5921755837966591,002629.SZ +2024-07-11,0.5477538361120131,002193.SZ +2024-07-11,0.5646538319787018,002629.SZ +2024-07-12,0.5279610225568935,002193.SZ +2024-07-12,0.5888196096991656,002629.SZ +2024-07-15,0.5709233460678482,603021.SH +2024-07-15,0.598429824922204,002629.SZ +2024-07-16,0.49320464436636374,603021.SH +2024-07-16,0.5829687019712756,002629.SZ +2024-07-17,0.468457718312923,603021.SH +2024-07-17,0.530776609661177,002629.SZ +2024-07-18,0.4729846337935255,002193.SZ +2024-07-18,0.5228582344964554,002629.SZ +2024-07-19,0.38960563449998753,603021.SH +2024-07-19,0.49207870535976955,002629.SZ +2024-07-22,0.4556139305272769,002629.SZ +2024-07-22,0.5973586743030966,002193.SZ +2024-07-23,0.5233733310392514,002629.SZ +2024-07-23,0.5945466311275037,002193.SZ +2024-07-24,0.534664895391463,002629.SZ +2024-07-24,0.5472968261138994,002193.SZ +2024-07-25,0.4988395627727905,603021.SH +2024-07-25,0.5525115441349324,002629.SZ +2024-07-26,0.4758837189294187,002629.SZ +2024-07-26,0.5466631911773887,002193.SZ +2024-07-29,0.5120962753035645,002629.SZ +2024-07-29,0.5490791779166595,002193.SZ +2024-07-30,0.5521384821599222,002193.SZ +2024-07-30,0.5771626139282047,002629.SZ +2024-07-31,0.4865554964868741,002193.SZ +2024-07-31,0.5279437254535875,002629.SZ +2024-08-01,0.4639685745529125,603021.SH +2024-08-01,0.5502552872000549,002629.SZ +2024-08-02,0.43159977346882084,002629.SZ +2024-08-02,0.6254308264354548,002193.SZ +2024-08-05,0.4400450047677127,603021.SH +2024-08-05,0.6184194513026479,002629.SZ +2024-08-06,0.49406674139812345,603021.SH +2024-08-06,0.5017918760872548,002629.SZ +2024-08-07,0.5191783473015361,002193.SZ +2024-08-07,0.5394711395198324,002629.SZ +2024-08-08,0.5167893577996501,002193.SZ +2024-08-08,0.5889186944253852,002629.SZ +2024-08-09,0.46008029913434506,002193.SZ +2024-08-09,0.5038920680307849,002629.SZ +2024-08-12,0.44236156835276,002620.SZ +2024-08-12,0.4929066873852404,002629.SZ +2024-08-13,0.42916964455697054,002193.SZ +2024-08-13,0.6597500768397495,002629.SZ +2024-08-14,0.4339636685462237,002193.SZ +2024-08-14,0.6093932300185397,002629.SZ +2024-08-15,0.4326792884657761,002193.SZ +2024-08-15,0.6226976927725782,002629.SZ +2024-08-16,0.49145082959925407,002713.SZ +2024-08-16,0.5168307342519036,002629.SZ +2024-08-19,0.39203604838437645,002620.SZ +2024-08-19,0.4910324212005314,002629.SZ +2024-08-20,0.4259702341035624,002620.SZ +2024-08-20,0.5199077634886744,002629.SZ +2024-08-21,0.42216412630990935,002629.SZ +2024-08-21,0.4683958012884729,000890.SZ +2024-08-22,0.42927587933864125,000890.SZ +2024-08-22,0.5307858494615615,002193.SZ +2024-08-23,0.46636075147073547,002193.SZ +2024-08-23,0.508483028836047,002713.SZ +2024-08-26,0.47224751737654247,002193.SZ +2024-08-26,0.47927928990899527,002629.SZ +2024-08-27,0.47519434192442606,002629.SZ +2024-08-27,0.49542174867071154,603021.SH +2024-08-28,0.4760789613333906,002193.SZ +2024-08-28,0.506656544610403,603021.SH +2024-08-29,0.4253787314363904,002629.SZ +2024-08-29,0.4792571213081825,002193.SZ +2024-08-30,0.45829265913013695,002713.SZ +2024-08-30,0.46526032425546593,002193.SZ +2024-09-02,0.4183845986514357,002629.SZ +2024-09-02,0.478811489362282,002193.SZ +2024-09-03,0.40800571574897065,002629.SZ +2024-09-03,0.41927975656207517,002193.SZ +2024-09-04,0.4054341883392984,002629.SZ +2024-09-04,0.5316403259959273,002193.SZ +2024-09-05,0.4238338967868602,002629.SZ +2024-09-05,0.5599870302653962,002193.SZ +2024-09-06,0.40755530006004687,002629.SZ +2024-09-06,0.5040913419229001,002193.SZ +2024-09-09,0.46419240975337045,002193.SZ +2024-09-09,0.4739284767155661,002629.SZ +2024-09-10,0.45750612801174045,002629.SZ +2024-09-10,0.4770309399691048,600539.SH +2024-09-11,0.4111649197834303,002629.SZ +2024-09-11,0.4157526440011021,603021.SH +2024-09-12,0.39169412121539743,000668.SZ +2024-09-12,0.4585065253623485,002629.SZ +2024-09-13,0.4286958919908034,600193.SH +2024-09-13,0.48308365516070884,002629.SZ +2024-09-18,0.442057245225254,002193.SZ +2024-09-18,0.4508117176351204,002629.SZ +2024-09-19,0.43785872313498336,002629.SZ +2024-09-19,0.609447496156002,002856.SZ +2024-09-20,0.4177582976180097,600193.SH +2024-09-20,0.4843819412609458,002856.SZ +2024-09-23,0.4988515179920813,002816.SZ +2024-09-23,0.5777521438796014,002856.SZ +2024-09-24,0.497067562391089,002193.SZ +2024-09-24,0.5546065822442784,002856.SZ +2024-09-25,0.48902157032123683,002856.SZ +2024-09-25,0.5017383620646007,002713.SZ +2024-09-26,0.5401593184107141,002713.SZ +2024-09-26,0.5764452939064902,002856.SZ +2024-09-27,0.5792442345623544,002629.SZ +2024-09-27,0.5898331295995509,603021.SH +2024-09-30,0.5615035138261832,002629.SZ +2024-09-30,0.5796738470041934,603880.SH +2024-10-08,0.5446133848608333,002629.SZ +2024-10-08,0.5603905725911391,600539.SH +2024-10-09,0.5024138108964169,002629.SZ +2024-10-09,0.5512105603876312,603880.SH +2024-10-10,0.5373868651348223,603880.SH +2024-10-10,0.6173707549115912,002629.SZ +2024-10-11,0.487583388174928,002620.SZ +2024-10-11,0.5180468744587797,002629.SZ +2024-10-14,0.4828990111610105,000668.SZ +2024-10-14,0.5146490256425278,002629.SZ +2024-10-15,0.537228505970736,600539.SH +2024-10-15,0.5394707114960373,002629.SZ +2024-10-16,0.5063419124306722,002629.SZ +2024-10-16,0.5354598472087578,002620.SZ +2024-10-17,0.4777724264840001,002629.SZ +2024-10-17,0.47804560636873417,002620.SZ +2024-10-18,0.48066131360198877,002620.SZ +2024-10-18,0.5571100245256033,603021.SH +2024-10-21,0.474651254420061,002620.SZ +2024-10-21,0.500604408538039,600539.SH +2024-10-22,0.49661634578452457,600539.SH +2024-10-22,0.5026879782802417,002629.SZ +2024-10-23,0.49245510615771265,600539.SH +2024-10-23,0.5908921441579577,002629.SZ +2024-10-24,0.5108214804537402,002629.SZ +2024-10-24,0.5369691703896418,600539.SH +2024-10-25,0.504626298150113,002629.SZ +2024-10-25,0.5658400368882986,600539.SH +2024-10-28,0.5432735071486436,002629.SZ +2024-10-28,0.5728221636487993,600193.SH +2024-10-29,0.48271860143310524,002629.SZ +2024-10-29,0.5396826560216869,000668.SZ +2024-10-30,0.5025830490990483,600539.SH +2024-10-30,0.5096498823914171,002629.SZ +2024-10-31,0.5060501775396086,600193.SH +2024-10-31,0.5097256792369181,002629.SZ +2024-11-01,0.46164880452394946,600539.SH +2024-11-01,0.4935120844653517,002629.SZ +2024-11-04,0.46046073824015554,000668.SZ +2024-11-04,0.538549824250738,002629.SZ +2024-11-05,0.454341722823246,002620.SZ +2024-11-05,0.5952730167969214,002629.SZ +2024-11-06,0.48527088112994315,002620.SZ +2024-11-06,0.5860364212775783,002629.SZ +2024-11-07,0.5253475401939464,002620.SZ +2024-11-07,0.5399726672445344,600539.SH +2024-11-08,0.4855176645627103,002629.SZ +2024-11-08,0.48712981365256336,605303.SH +2024-11-11,0.5019038694413344,002620.SZ +2024-11-11,0.5153618487298584,000668.SZ +2024-11-12,0.5038347248596349,603139.SH +2024-11-12,0.5693650514993626,002629.SZ +2024-11-13,0.4892655962969912,002620.SZ +2024-11-13,0.5669145270088558,002629.SZ +2024-11-14,0.47341880759621446,002620.SZ +2024-11-14,0.4980316405123499,002193.SZ +2024-11-15,0.47952425348660427,002193.SZ +2024-11-15,0.512289303269779,002629.SZ +2024-11-18,0.4707922580976675,002629.SZ +2024-11-18,0.5228551237153095,002193.SZ +2024-11-19,0.4439014417845399,603272.SH +2024-11-19,0.4439673021981073,002193.SZ +2024-11-20,0.46488468835718105,002910.SZ +2024-11-20,0.465175880293392,002798.SZ +2024-11-21,0.47720588031511363,000890.SZ +2024-11-21,0.4850203298575876,002856.SZ +2024-11-22,0.46844269644319375,603616.SH +2024-11-22,0.4822308809766673,002193.SZ +2024-11-25,0.48306398710394693,603272.SH +2024-11-25,0.48891794545481304,002193.SZ +2024-11-26,0.47991611287223795,603616.SH +2024-11-26,0.4960510595197116,002193.SZ +2024-11-27,0.48520638320041304,002193.SZ +2024-11-27,0.5321741038472538,001211.SZ +2024-11-28,0.5243269195536991,001211.SZ +2024-11-28,0.5507927731484928,002193.SZ +2024-11-29,0.5187079165100716,001211.SZ +2024-11-29,0.553909084268593,002193.SZ +2024-12-02,0.49466279145696723,603272.SH +2024-12-02,0.5035779153205122,002719.SZ +2024-12-03,0.48030701380963164,000890.SZ +2024-12-03,0.5121635167342982,002620.SZ +2024-12-04,0.4598012120398618,002620.SZ +2024-12-04,0.5747788253533418,002629.SZ +2024-12-05,0.47411087809133706,600539.SH +2024-12-05,0.5390879144097279,002629.SZ +2024-12-06,0.49345561494037177,002620.SZ +2024-12-06,0.5201777883468092,002629.SZ +2024-12-09,0.47396546726938193,603272.SH +2024-12-09,0.5242229055234979,000890.SZ +2024-12-10,0.45664325144161416,002207.SZ +2024-12-10,0.4941569776095162,603880.SH +2024-12-11,0.4793449943573095,002620.SZ +2024-12-11,0.5141754856513198,000890.SZ +2024-12-12,0.5318507935946868,603880.SH +2024-12-12,0.5486937388370633,002620.SZ +2024-12-13,0.5133097494734119,000929.SZ +2024-12-13,0.533619904268085,002620.SZ +2024-12-16,0.5232601196311837,002856.SZ +2024-12-16,0.5779718760716945,002620.SZ +2024-12-17,0.46765014676549876,002856.SZ +2024-12-17,0.473036828104399,605081.SH +2024-12-18,0.4628335580117025,605081.SH +2024-12-18,0.48588338582474777,600768.SH +2024-12-19,0.43344796837915034,605081.SH +2024-12-19,0.4398843523295312,002856.SZ +2024-12-20,0.427950745477856,603709.SH +2024-12-20,0.45283946060768276,002207.SZ +2024-12-23,0.47680262402209234,603880.SH +2024-12-23,0.4974650423432299,605081.SH +2024-12-24,0.428070275536146,000668.SZ +2024-12-24,0.5152868540186485,605081.SH +2024-12-25,0.4786084822656993,000668.SZ +2024-12-25,0.4941607602497769,000691.SZ +2024-12-26,0.47295630159137825,000668.SZ +2024-12-26,0.5102306862690663,000691.SZ +2024-12-27,0.39958632576444714,000668.SZ +2024-12-27,0.42619237834447826,000691.SZ +2024-12-30,0.43850447935705616,000691.SZ +2024-12-30,0.4689457457785772,000668.SZ +2024-12-31,0.4686811132731067,000691.SZ +2024-12-31,0.4835805304161789,000668.SZ +2025-01-02,0.46160231141850955,002856.SZ +2025-01-02,0.5069284908011281,000668.SZ +2025-01-03,0.4800260370452462,000691.SZ +2025-01-03,0.4962964926142141,000668.SZ +2025-01-06,0.4691312176245538,000668.SZ +2025-01-06,0.5175381211322023,000691.SZ +2025-01-07,0.46980182622261335,000668.SZ +2025-01-07,0.5100400613423126,000691.SZ +2025-01-08,0.49537886808875004,000691.SZ +2025-01-08,0.500179745608366,000668.SZ +2025-01-09,0.5059422232273915,000668.SZ +2025-01-09,0.5099754520112634,000691.SZ +2025-01-10,0.49668639482755633,000668.SZ +2025-01-10,0.5205816558270149,000691.SZ +2025-01-13,0.4470172463807549,002856.SZ +2025-01-13,0.4912887572397996,000691.SZ +2025-01-14,0.4584599813789997,603021.SH +2025-01-14,0.4746581798368744,002620.SZ +2025-01-15,0.47654708264654266,002620.SZ +2025-01-15,0.49474949129636375,600421.SH +2025-01-16,0.47424767212639984,002620.SZ +2025-01-16,0.5144195055586247,600421.SH +2025-01-17,0.4547291297386137,002848.SZ +2025-01-17,0.4871835430677534,002620.SZ +2025-01-20,0.44890772084376357,002620.SZ +2025-01-20,0.4650822797063398,002848.SZ +2025-01-21,0.4407196373784764,000668.SZ +2025-01-21,0.4526111918202131,600421.SH +2025-01-22,0.48930818976269835,600421.SH +2025-01-22,0.5007376689922157,002620.SZ +2025-01-23,0.43176518595393054,000668.SZ +2025-01-23,0.4389094504016049,600421.SH +2025-01-24,0.41995115924904425,600421.SH +2025-01-24,0.44981806404657204,002789.SZ +2025-01-27,0.45857214206033775,002848.SZ +2025-01-27,0.4901782357474386,002789.SZ +2025-02-05,0.4218214267015131,605081.SH +2025-02-05,0.48471866170887506,002848.SZ +2025-02-06,0.40091449211658914,002848.SZ +2025-02-06,0.413590275728046,600421.SH +2025-02-07,0.44519726310050317,600421.SH +2025-02-07,0.4654077829639653,603021.SH +2025-02-10,0.5351623782773727,600421.SH +2025-02-10,0.5384299516201853,603021.SH +2025-02-11,0.44830340163378385,002789.SZ +2025-02-11,0.4621212564425763,002848.SZ +2025-02-12,0.41380283355704794,002789.SZ +2025-02-12,0.42456385784145617,002848.SZ +2025-02-13,0.4549158102974481,603021.SH +2025-02-13,0.46701907682582433,002719.SZ +2025-02-14,0.3842462126067682,000691.SZ +2025-02-14,0.3910086749987119,002789.SZ +2025-02-17,0.46939117776216643,002789.SZ +2025-02-17,0.5397347208690072,603021.SH +2025-02-18,0.43570750437983724,002789.SZ +2025-02-18,0.5019918179345443,002848.SZ +2025-02-19,0.4518950372371528,002848.SZ +2025-02-19,0.5138860918900293,603813.SH +2025-02-20,0.458272320670867,002789.SZ +2025-02-20,0.5368884569083294,603813.SH +2025-02-21,0.4571533295221773,002789.SZ +2025-02-21,0.45752098003309144,603813.SH +2025-02-24,0.45786290455695206,605081.SH +2025-02-24,0.4750248349097079,002789.SZ +2025-02-25,0.47384102263931704,002848.SZ +2025-02-25,0.4799334969427696,002789.SZ +2025-02-26,0.46375240988769395,002789.SZ +2025-02-26,0.4681345223192118,603021.SH +2025-02-27,0.48872310539765224,002789.SZ +2025-02-27,0.5416668997951761,603021.SH +2025-02-28,0.5206332642766595,002789.SZ +2025-02-28,0.5219874262402011,600243.SH +2025-03-03,0.4554530826294565,002789.SZ +2025-03-03,0.4686041586543227,600243.SH +2025-03-04,0.4493413243042671,002620.SZ +2025-03-04,0.48377422328347747,605303.SH +2025-03-05,0.37973195856888176,002719.SZ +2025-03-05,0.4869094685019132,002789.SZ +2025-03-06,0.408968812467252,600243.SH +2025-03-06,0.462975896026885,002789.SZ +2025-03-07,0.43006683773590976,600243.SH +2025-03-07,0.44717658936904237,002789.SZ +2025-03-10,0.45665050579576044,000668.SZ +2025-03-10,0.5373392483921202,605081.SH +2025-03-11,0.5132183132016358,002620.SZ +2025-03-11,0.5493675244688019,000929.SZ +2025-03-12,0.4553592458584076,000929.SZ +2025-03-12,0.5024023835552489,002620.SZ +2025-03-13,0.4502777054965203,002207.SZ +2025-03-13,0.48495546519544014,002620.SZ +2025-03-14,0.44977757044220124,000929.SZ +2025-03-14,0.5543022088712621,002719.SZ +2025-03-17,0.4589614839771147,605081.SH +2025-03-17,0.5536012027903368,002789.SZ +2025-03-18,0.43507981419931163,605081.SH +2025-03-18,0.5512496638371078,002789.SZ +2025-03-19,0.440818882270268,002719.SZ +2025-03-19,0.5356969410344875,600243.SH +2025-03-20,0.4781273145530344,002620.SZ +2025-03-20,0.5402736488446227,002789.SZ +2025-03-21,0.4563661662962195,002620.SZ +2025-03-21,0.5003422456105202,002207.SZ +2025-03-24,0.40676417854583413,002856.SZ +2025-03-24,0.41392226832464746,002848.SZ +2025-03-25,0.47594949406651715,002848.SZ +2025-03-25,0.5052655810496312,605081.SH +2025-03-26,0.43350833718910087,605081.SH +2025-03-26,0.43697658055367355,002848.SZ +2025-03-27,0.42837121504805403,002848.SZ +2025-03-27,0.4419214617944006,000691.SZ +2025-03-28,0.3861874334941253,000691.SZ +2025-03-28,0.435610874502092,002848.SZ +2025-03-31,0.37717279524082853,000668.SZ +2025-03-31,0.38077080393752144,000691.SZ +2025-04-01,0.37873675299329346,000691.SZ +2025-04-01,0.44776747869389877,002848.SZ +2025-04-02,0.3981375749825808,600243.SH +2025-04-02,0.42554419695377216,002848.SZ +2025-04-03,0.39360100468834464,600243.SH +2025-04-03,0.4157276356861151,002848.SZ +2025-04-07,0.3729395662845247,002856.SZ +2025-04-07,0.39773973939688734,002848.SZ +2025-04-08,0.4158181237400514,000691.SZ +2025-04-08,0.41782040042083224,000668.SZ +2025-04-09,0.4321529160987159,000691.SZ +2025-04-09,0.4669451620914217,002848.SZ +2025-04-10,0.41349397138362176,600421.SH +2025-04-10,0.4578263942715963,002848.SZ +2025-04-11,0.4092307974280305,002789.SZ +2025-04-11,0.44914340775428463,002848.SZ +2025-04-14,0.38021107048294667,000668.SZ +2025-04-14,0.42479252673218343,002848.SZ +2025-04-15,0.4172724492320692,000668.SZ +2025-04-15,0.44620484206182925,002848.SZ +2025-04-16,0.461829733231696,002848.SZ +2025-04-16,0.4888822939273894,000668.SZ +2025-04-17,0.4684064204357487,002848.SZ +2025-04-17,0.48430718370261194,000668.SZ +2025-04-18,0.469877210290373,002848.SZ +2025-04-18,0.511138899774495,000668.SZ +2025-04-21,0.3858333572047621,000691.SZ +2025-04-21,0.4183841624478164,002848.SZ +2025-04-22,0.4425804238387135,002848.SZ +2025-04-22,0.4933770418155291,000691.SZ +2025-04-23,0.3821465257455845,000668.SZ +2025-04-23,0.39296706984431395,002848.SZ +2025-04-24,0.384654924017269,000691.SZ +2025-04-24,0.463674377548063,000668.SZ +2025-04-25,0.38893604872370424,000668.SZ +2025-04-25,0.40310873597244656,000691.SZ +2025-04-28,0.3706860215184485,000638.SZ +2025-04-28,0.3843003371581723,000668.SZ +2025-04-29,0.38553446935879754,002193.SZ +2025-04-29,0.4805803131535408,002856.SZ +2025-04-30,0.365909609832286,002193.SZ +2025-04-30,0.4509008223646073,002856.SZ +2025-05-06,0.4619165437971181,002193.SZ +2025-05-06,0.4752592751325061,002856.SZ +2025-05-07,0.47026380507896176,002193.SZ +2025-05-07,0.4930168171408047,002856.SZ +2025-05-08,0.4788651061023257,002193.SZ +2025-05-08,0.49322048929128265,002856.SZ +2025-05-09,0.43711508879337047,002193.SZ +2025-05-09,0.4371917010691003,002856.SZ +2025-05-12,0.4428537581314355,002193.SZ +2025-05-12,0.44736639145297397,002856.SZ +2025-05-13,0.4533479415630084,603616.SH +2025-05-13,0.4548183334519294,002856.SZ +2025-05-14,0.39119500578474725,002719.SZ +2025-05-14,0.48058270504898437,002193.SZ +2025-05-15,0.4817999801018728,002856.SZ +2025-05-15,0.4989888455301082,002193.SZ +2025-05-16,0.403956971556964,002193.SZ +2025-05-16,0.4341109382292942,002856.SZ +2025-05-19,0.42610803298048217,002193.SZ +2025-05-19,0.45526810556375363,000890.SZ +2025-05-20,0.4384932644797136,002856.SZ +2025-05-20,0.44977169939872813,002193.SZ +2025-05-21,0.42549515586142017,002193.SZ +2025-05-21,0.43604389632137075,000890.SZ +2025-05-22,0.3950657136878587,002193.SZ +2025-05-22,0.41840000772465546,600671.SH +2025-05-23,0.3579378260434529,600671.SH +2025-05-23,0.38618652063691317,002193.SZ +2025-05-26,0.44927128702797814,000890.SZ +2025-05-26,0.46887990463891943,002856.SZ +2025-05-27,0.3903506792686102,002193.SZ +2025-05-27,0.4031973949611227,002719.SZ +2025-05-28,0.414758327885498,600543.SH +2025-05-28,0.486951115769117,000890.SZ +2025-05-29,0.41823995773588807,002719.SZ +2025-05-29,0.43125894905906204,002856.SZ +2025-05-30,0.3743503232508537,002719.SZ +2025-05-30,0.4884100737564768,002856.SZ