{"id":27730,"date":"2026-08-15T04:42:46","date_gmt":"2026-08-15T04:42:46","guid":{"rendered":"https:\/\/umang.pk\/2026\/08\/15\/%d9%84%db%8c%d9%86%da%af-%da%86%db%8c%d9%86-%da%88%db%8c%d9%be-%d8%a7%db%8c%d8%ac%d9%86%d9%b9%d8%b3-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6\/"},"modified":"2026-08-15T04:42:49","modified_gmt":"2026-08-15T04:42:49","slug":"%d9%84%db%8c%d9%86%da%af-%da%86%db%8c%d9%86-%da%88%db%8c%d9%be-%d8%a7%db%8c%d8%ac%d9%86%d9%b9%d8%b3-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/08\/15\/%d9%84%db%8c%d9%86%da%af-%da%86%db%8c%d9%86-%da%88%db%8c%d9%be-%d8%a7%db%8c%d8%ac%d9%86%d9%b9%d8%b3-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6\/","title":{"rendered":"\u0644\u06cc\u0646\u06af \u0686\u06cc\u0646 \u0688\u06cc\u067e \u0627\u06cc\u062c\u0646\u0679\u0633 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0645\u0644\u0679\u06cc \u0627\u06cc\u062c\u0646\u0679 \u0679\u0631\u0627\u0646\u0632\u06cc\u06a9\u0634\u0646 \u0627\u0646\u0648\u06cc\u0633\u0679\u06cc \u06af\u06cc\u0634\u0646 \u0633\u0633\u0679\u0645 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4 [Full Handbook]"},"content":{"rendered":"\n<div id=\"\">\n<p>\u062a\u062c\u0627\u0631\u062a\u06cc \u062a\u062d\u0642\u06cc\u0642\u06cc \u0627\u06cc\u062c\u0646\u0679 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648\u0688 \u0644\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0628\u06cc\u06a9 \u0679\u06cc\u0633\u0679 \u0686\u0644\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0646\u062a\u0627\u0626\u062c \u06a9\u0627 \u0645\u0639\u0627\u0626\u0646\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u0646\u0627 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0634\u06a9\u0644 \u0645\u0633\u0626\u0644\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0646\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0644\u0648\u067e \u06a9\u0633\u06cc \u067e\u0631\u06a9\u0634\u0634 \u0628\u06cc\u06a9 \u0679\u06cc\u0633\u0679 \u06a9\u06cc \u0628\u06d2 \u0642\u0627\u0628\u0648 \u062a\u0644\u0627\u0634 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1 \u06c1\u0648\u06d4<\/p>\n<p>\u0627\u0633 \u06c1\u06cc\u0646\u0688 \u0628\u06a9 \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u0627\u06cc\u06a9 \u0645\u0644\u0679\u06cc \u0627\u06cc\u062c\u0646\u0679 \u0679\u0631\u06cc\u0688\u0646\u06af \u0631\u06cc\u0633\u0631\u0686 \u0633\u0633\u0679\u0645 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 LangChain \u0688\u06cc\u067e \u0627\u06cc\u062c\u0646\u0679\u0633 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4 EODHD \u062a\u0627\u0631\u06cc\u062e\u06cc \u0645\u0627\u0631\u06a9\u06cc\u0679 \u06a9\u0627 \u0688\u06cc\u0679\u0627 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0645\u062a\u0639\u06cc\u0646 Python \u067e\u0631\u062a \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u062a\u0642\u0633\u06cc\u0645\u060c \u0628\u06cc\u06a9 \u0679\u06cc\u0633\u0679\u0646\u06af \u0645\u0646\u0637\u0642\u060c \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9\u0633\u060c \u062a\u062c\u0631\u0628\u0627\u062a\u06cc \u062a\u0627\u0631\u06cc\u062e\u060c \u0627\u0648\u0631 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06d2 \u0642\u0648\u0627\u0639\u062f \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631\u060c \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u060c \u0627\u0648\u0631 \u062a\u062d\u0642\u06cc\u0642\u06cc \u0646\u0642\u0627\u062f \u067e\u06be\u0631 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u062a\u06cc\u0646 \u0648\u0631\u0698\u0646 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u062c\u0627\u0646\u0686\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0646 \u062d\u062f\u0648\u062f \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0642\u0635\u062f \u06cc\u06c1 \u062b\u0627\u0628\u062a \u06a9\u0631\u0646\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 AI \u0627\u06cc\u062c\u0646\u0679 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0645\u0646\u0627\u0641\u0639 \u0628\u062e\u0634 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u062e\u06cc\u0627\u0644 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 \u062a\u062d\u0642\u06cc\u0642\u06cc \u06a9\u0627\u0645 \u06a9\u0627 \u0641\u0644\u0648 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u062c\u06c1\u0627\u06ba \u0627\u06cc\u062c\u0646\u0679 \u0627\u0646 \u06a9\u0627 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0634\u0648\u0627\u06c1\u062f \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0622\u0626\u06cc\u0688\u06cc\u0627\u0632 \u062a\u06cc\u0627\u0631 \u0627\u0648\u0631 \u0686\u06cc\u0644\u0646\u062c \u06a9\u0631 \u0633\u06a9\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-prerequisites\">\u0634\u0631\u0637\u06cc\u06ba<\/h2>\n<p>\u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p>Python 3.11 \u06cc\u0627 \u0627\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1<\/p>\n<\/li>\n<li>\n<p>\u0627\u0632\u06af\u0631\u060c \u067e\u0627\u0646\u0688\u0648\u06ba\u060c \u0627\u0648\u0631 \u0645\u0642\u062f\u0627\u0631\u06cc \u0628\u06cc\u06a9 \u0679\u06cc\u0633\u0679\u0646\u06af \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f\u06cc \u062a\u0641\u06c1\u06cc\u0645<\/p>\n<\/li>\n<li>\n<p>\u062a\u0627\u0631\u06cc\u062e\u06cc \u0645\u0627\u0631\u06a9\u06cc\u0679 \u0688\u06cc\u0679\u0627 \u06a9\u06d2 \u0644\u06cc\u06d2 EODHD API \u06a9\u0644\u06cc\u062f<\/p>\n<\/li>\n<li>\n<p>\u0688\u06cc\u067e \u0627\u06cc\u062c\u0646\u0679\u0633 \u0645\u0627\u0688\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 OpenAI API \u06a9\u06cc\u0632<\/p>\n<\/li>\n<li>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0679\u0631\u06cc\u06a9\u0646\u06af \u06a9\u0648 \u0641\u0639\u0627\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 LangSmith API \u06a9\u0644\u06cc\u062f<\/p>\n<\/li>\n<li>\n<p>\u0645\u0637\u0644\u0648\u0628\u06c1 \u0627\u0632\u06af\u0631 \u067e\u06cc\u06a9\u062c\u0632 \u0627\u0646\u0633\u0679\u0627\u0644 \u06c1\u06cc\u06ba\u060c \u0628\u0634\u0645\u0648\u0644: <code>pandas<\/code>\u060c <code>numpy<\/code>\u060c <code>matplotlib<\/code>\u060c <code>requests<\/code>\u060c <code>python-dotenv<\/code>\u060c <code>langchain<\/code>\u060c <code>langgraph<\/code>\u0627\u0648\u0631 <code>deepagents<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0622\u067e \u06a9\u0648 \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 Python \u06a9\u0648\u0688 \u06a9\u0648 \u0686\u0644\u0627\u0646\u06d2 \u0645\u06cc\u06ba \u0628\u06be\u06cc \u0645\u0627\u06c1\u0631 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2 \u062c\u0648 \u0645\u0642\u0627\u0645\u06cc \u0641\u0627\u0626\u0644\u0648\u06ba \u0627\u0648\u0631 \u0630\u06cc\u0644\u06cc \u0639\u0645\u0644 \u06a9\u0648 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-design-the-research-workflow\">\u0631\u06cc\u0633\u0631\u0686 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0688\u06cc\u0632\u0627\u0626\u0646<\/h2>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648\u0688 \u0644\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u062c\u0646\u0679 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u06a9\u0645\u0644 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<p>\u0648\u0631\u0698\u0646 \u06a9\u0627 \u0628\u06c1\u0627\u0624 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u0648\u0627\u0631 \u06c1\u06d2\u06d4 <code>v1<\/code> \u0627\u0646\u06c1\u06cc\u06ba \u067e\u06c1\u0644\u06d2 \u0644\u0627\u06af\u0648 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062a\u062c\u0631\u0628\u06c1 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u067e\u06be\u0631 \u062a\u062d\u0642\u06cc\u0642\u06cc \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0646\u06d2 \u0648\u0627\u0644\u0648\u06ba \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0627\u0646 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u0686\u06cc\u0645\u067e\u0626\u0646 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u06cc\u0646\u0648\u06ba \u0645\u0631\u0627\u062d\u0644 \u0645\u06a9\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f <code>v2<\/code> \u0634\u0631\u0648\u0639 \u0627\u06cc\u06a9 \u06c1\u06cc \u0686\u06a9\u0631 \u062f\u06c1\u0631\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>v2<\/code>: \u0627\u0646\u062c\u06cc\u0646\u0626\u0631 \u0646\u0638\u0631\u062b\u0627\u0646\u06cc \u06a9\u0648 \u0644\u0627\u06af\u0648 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u062c\u0627\u0646\u0686\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0646\u0627\u0642\u062f\u06cc\u0646 \u0634\u0648\u0627\u06c1\u062f \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0631\u0627\u0628\u0637\u06c1 \u06a9\u0627\u0631 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06d2 \u0642\u0648\u0627\u0639\u062f \u06a9\u0648 \u0644\u0627\u06af\u0648 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0644\u0627\u06af\u0648 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>v3<\/code> \u0622\u067e \u0634\u0631\u0648\u0639 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0628\u0639\u062f \u0645\u06cc\u06ba <code>v3<\/code> \u062c\u0627\u0646\u0686 \u0627\u0648\u0631 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u062d\u062a\u0645\u06cc \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0645\u0646\u062c\u0645\u062f \u0686\u06cc\u0645\u067e\u0626\u0646 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0622\u067e \u06a9\u06cc \u0628\u0642\u0627 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0627\u0648\u0631 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u06c1\u06cc \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u062d\u062a\u0645\u06cc \u062a\u0634\u062e\u06cc\u0635 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06be\u0648\u0644 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0646\u062a\u0627\u0626\u062c \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u062a\u0631\u0645\u06cc\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc \u062c\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u067e\u0648\u0631\u06d2 \u0627\u0633\u0679\u0688\u06cc \u0679\u0631\u06cc\u0644 \u06a9\u06d2 \u0645\u0646\u062c\u0645\u062f \u0627\u0648\u0631 \u0686\u0644\u0627\u0626\u06d2 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0622\u0688\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062e\u062a\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-set-up-the-python-research-environment\">\u0627\u0632\u06af\u0631 \u06a9\u06d2 \u062a\u062d\u0642\u06cc\u0642\u06cc \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0646\u0627<\/h2>\n<p>\u0622\u0626\u06cc\u06d2 \u067e\u0648\u0631\u06d2 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u067e\u06cc\u06a9\u062c\u0648\u06ba \u06a9\u0648 \u062f\u0631\u0622\u0645\u062f \u06a9\u0631\u06a9\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4 \u0688\u06cc\u0679\u0631\u0645\u0646\u0633\u0679\u06a9 \u0631\u06cc\u0633\u0631\u0686 \u067e\u0631\u062a \u0628\u0646\u06cc\u0627\u062f\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062d\u0633\u0627\u0628 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0627\u0646\u0688\u0648\u06ba \u0627\u0648\u0631 NumPy \u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 <code>requests<\/code> EODHD \u0688\u06cc\u0679\u0627 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0686\u0627\u0631\u0679\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 Matplotlib\u060c Python \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0641\u0627\u0626\u0644 \u0633\u0633\u0679\u0645\u060c \u0627\u0648\u0631 \u0631\u06cc\u0633\u0631\u0686 \u0622\u0624\u0679 \u067e\u0679 \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648\u0688 \u06a9\u0648 \u0627\u0644\u06af \u0633\u06d2 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0630\u06cc\u0644\u06cc \u0639\u0645\u0644 \u06a9\u06cc \u0627\u0641\u0627\u062f\u06cc\u062a\u06d4<\/p>\n<pre><code class=\"language-python\">import os, json, time, shutil, tempfile, subprocess, sys, traceback\nimport importlib.util\nfrom pathlib import Path\nimport requests, numpy as np, pandas as pd\nimport matplotlib.pyplot as plt\nfrom dotenv import load_dotenv\nfrom IPython.display import Markdown, display\nimport getpass\n<\/code><\/pre>\n<p>\u0627\u0633 \u062a\u0639\u0645\u06cc\u0631 \u0645\u06cc\u06ba \u062a\u06cc\u0646 \u0627\u0633\u0646\u0627\u062f \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2: \u062a\u0627\u0631\u06cc\u062e\u06cc \u0645\u0627\u0631\u06a9\u06cc\u0679 \u0688\u06cc\u0679\u0627 \u06a9\u06d2 \u0644\u06cc\u06d2 EODHD\u060c \u0627\u06cc\u062c\u0646\u0679 \u0645\u0627\u0688\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 OpenAI\u060c \u0627\u0648\u0631 \u062a\u0631\u0642\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u06d2 \u0644\u06cc\u06d2 LangSmith \u0679\u0631\u06cc\u0633\u06d4 \u0645\u06cc\u06ba \u0627\u0633\u06d2 \u0627\u0633 \u0633\u06d2 \u0644\u0648\u0688 \u06a9\u0631\u0648\u06ba \u06af\u0627: <code>.env<\/code> \u0627\u067e\u0646\u06cc \u0627\u0633\u0646\u0627\u062f \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0627\u067e\u0646\u06d2 \u06a9\u0648\u0688 \u0645\u06cc\u06ba \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0627\u06cc\u06a9 \u0641\u0627\u0626\u0644 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631 \u0645\u06cc\u06ba \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u06c1\u06cc \u0648\u0642\u062a \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u0627\u0646 \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0648 \u0627\u0644\u06af \u06a9\u0631\u06cc\u06ba \u06af\u06d2 \u062c\u0646\u06c1\u06cc\u06ba \u0645\u062d\u0642\u0642\u06cc\u0646 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u062c\u0646 \u062a\u06a9 \u0648\u06c1 \u0631\u0633\u0627\u0626\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2\u06d4 <code>workspace<\/code> \u062a\u0631\u0642\u06cc \u0627\u0648\u0631 \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0627 \u0688\u06cc\u0679\u0627\u060c \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06cc \u0641\u0627\u0626\u0644\u06cc\u06ba\u060c \u0646\u062a\u0627\u0626\u062c \u0627\u0648\u0631 \u062c\u0627\u0626\u0632\u06d2 \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba\u06d4 <code>private<\/code> \u0648\u06c1 \u0688\u06cc\u0679\u0627 \u062c\u0648 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u06a9\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u06cc\u06ba \u062f\u0627\u062e\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u060c \u0627\u0648\u0631 \u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u0628\u0627\u062a\u060c \u062d\u062a\u0645\u06cc \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062d\u0641\u0648\u0638 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">load_dotenv(override=True)\nfor k in [\"EODHD_API_KEY\", \"OPENAI_API_KEY\", \"LANGSMITH_API_KEY\"]:\n    assert os.environ.get(k), f\"missing env var: {k}\"\nos.environ[\"EODHD_API_KEY\"] = os.environ[\"EODHD_API_KEY\"].strip()\nos.environ[\"LANGSMITH_TRACING\"] = \"true\"\nLS_PROJECT = \"trading-deep-agent\"\nos.environ[\"LANGSMITH_PROJECT\"] = LS_PROJECT\n\nROOT = Path(\"project\").resolve()\nRAW = Path(\"raw_cache\").resolve()   \nWS = ROOT \/ \"workspace\"\nPRIVATE = ROOT \/ \"private\"\nfor p in [RAW, PRIVATE, WS\/\"data\", WS\/\"strategies\", WS\/\"results\", WS\/\"reviews\"]:\n    p.mkdir(parents=True, exist_ok=True)\nprint(\"workspace:\", WS)\n<\/code><\/pre>\n<p>\u06cc\u06c1\u0627\u06ba \u0627\u06c1\u0645 \u0641\u0631\u0642 \u0641\u0648\u0644\u0688\u0631 \u06a9\u0627 \u0646\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06cc\u062c\u0646\u0679 \u0633\u0627\u0626\u0688 \u0641\u0627\u0626\u0644 \u0633\u0633\u0679\u0645 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0631\u0648\u0679 \u0628\u0646 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 <code>workspace<\/code>\u062a\u062d\u0642\u06cc\u0642\u06cc \u0639\u0645\u0644 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u062a\u06a9 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0631\u06c1\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0627\u06af\u0631 <code>.env<\/code> \u0627\u06af\u0631 \u06cc\u06c1 \u062f\u0633\u062a\u06cc\u0627\u0628 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06cc\u0627 \u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06cc \u0627\u0633\u0646\u0627\u062f \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e \u0627\u0633 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u0627\u0646\u0679\u0631\u0627\u06cc\u06a9\u0679\u0648 \u06a9\u0644\u06cc\u062f \u062f\u0627\u062e\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>getpass<\/code> \u062c\u0628 \u0622\u067e \u0679\u0627\u0626\u067e \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u0633\u06d2 \u0686\u06be\u067e\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">for k in [\"EODHD_API_KEY\", \"OPENAI_API_KEY\", \"LANGSMITH_API_KEY\"]:\n    os.environ[k] = getpass.getpass(f\"{k}: \").strip()\n\nPath(\".env\").write_text(\"n\".join(f\"{k}={os.environ[k]}\" for k in\n    [\"EODHD_API_KEY\",\"OPENAI_API_KEY\",\"LANGSMITH_API_KEY\"]) + \"n\")\n\nprint(\"openai looks right:\", os.environ[\"OPENAI_API_KEY\"].startswith(\"sk-\"),\n      len(os.environ[\"OPENAI_API_KEY\"]))\n<\/code><\/pre>\n<p>\u06a9\u0644\u06cc\u062f \u062e\u0648\u062f \u0622\u0624\u0679 \u067e\u0679 \u0645\u06cc\u06ba \u0638\u0627\u06c1\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768965_333_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"\u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 API \u06a9\u0644\u06cc\u062f\" style=\"display:block;margin:0 auto\" width=\"647\" height=\"165\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u06a9\u0627 \u0645\u0627\u062d\u0648\u0644 \u062a\u06cc\u0627\u0631 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u062a\u0648\u060c \u0622\u067e \u0645\u0627\u0631\u06a9\u06cc\u0679 \u0688\u06cc\u0679\u0627\u0633\u06cc\u0679 \u0628\u0646\u0627\u0646\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0633 \u067e\u0631 \u0622\u067e \u06a9\u0627 \u0631\u06cc\u0633\u0631\u0686 \u0633\u0633\u0679\u0645 \u06a9\u0627\u0645 \u06a9\u0631\u06d2 \u06af\u0627\u06d4<\/p>\n<h2 id=\"heading-prepare-the-eodhd-research-data\">EODHD \u0645\u0637\u0627\u0644\u0639\u06c1 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u062a\u06cc\u0627\u0631\u06cc<\/h2>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0627\u0645\u0639\u0646\u06cc \u0645\u062e\u062a\u0635 \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u0679\u0688\u06cc \u0644\u0648\u067e \u0645\u06cc\u06ba \u06a9\u0627\u0641\u06cc \u062a\u063a\u06cc\u0631\u0627\u062a \u06c1\u0648\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06a9\u0627\u0626\u0646\u0627\u062a \u06a9\u0648 \u067e\u0648\u0631\u06d2 \u062a\u062c\u0631\u0628\u06d2 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0645\u0633\u062a\u0642\u0644 \u0631\u06c1\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u0645\u06cc\u06ba 9 \u0627\u0645\u0631\u06cc\u06a9\u06cc \u0627\u0633\u0679\u0627\u06a9 \u0627\u06cc \u0679\u06cc \u0627\u06cc\u0641 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0648\u06ba \u06af\u0627:<\/p>\n<pre><code class=\"language-python\">TICKERS = [\"SPY\",\"QQQ\",\"IWM\",\"XLE\",\"XLF\",\"XLK\",\"XLV\",\"XLP\",\"XLY\"]\nSTART, END = \"2004-01-01\", \"2025-12-31\"\n<\/code><\/pre>\n<p>SPY\u060c QQQ\u060c \u0627\u0648\u0631 IWM \u0645\u0627\u0631\u06a9\u06cc\u0679 \u06a9\u06cc \u0648\u0633\u06cc\u0639 \u0646\u0645\u0627\u0626\u0634 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062c\u0628\u06a9\u06c1 \u0628\u0627\u0642\u06cc ETFs \u0627\u0633\u0679\u0627\u06a9 \u06a9\u06d2 \u06a9\u0626\u06cc \u0628\u0691\u06d2 \u0634\u0639\u0628\u0648\u06ba \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>EODHD \u06a9\u06d2 \u062a\u0627\u0631\u06cc\u062e\u06cc EOD \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679 \u0633\u06d2 \u0631\u0648\u0632\u0627\u0646\u06c1 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u062d\u0627\u0635\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u0635\u0644 \u062a\u0631\u0642\u06cc \u06a9\u0627 \u062f\u0648\u0631\u0627\u0646\u06cc\u06c1 2005 \u0645\u06cc\u06ba \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0688\u0627\u0624\u0646 \u0644\u0648\u0688\u0632 2004 \u0645\u06cc\u06ba \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u0628\u0639\u062f \u0645\u06cc\u06ba \u06af\u0631\u062f\u0634\u06cc \u0631\u0641\u062a\u0627\u0631 \u0627\u0648\u0631 \u062d\u062c\u0645 \u06a9\u06d2 \u062d\u0633\u0627\u0628\u0627\u062a \u06a9\u0648 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u0645\u0634\u0627\u06c1\u062f\u0627\u062a \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">def fetch_eod(symbol, start=START, end=END):\n    params = {\"api_token\": os.environ[\"EODHD_API_KEY\"], \"from\": start, \"to\": end, \"period\": \"d\", \"fmt\": \"json\"}\n    r = requests.get(f\"https:\/\/eodhd.com\/api\/eod\/{symbol}.US\", params=params, timeout=60)\n    return r.json()\n\nfor s in TICKERS:\n    f = RAW \/ f\"{s}.json\"\n    if not f.exists():\n        f.write_text(json.dumps(fetch_eod(s))); time.sleep(0.3)\n\npd.DataFrame([{\"symbol\": s, \"rows\": len(j := json.loads((RAW\/f\"{s}.json\").read_text())),\n               \"first\": j[0][\"date\"], \"last\": j[-1][\"date\"]} for s in TICKERS])\n<\/code><\/pre>\n<p>\u06c1\u0631 \u063a\u06cc\u0631 \u062a\u0631\u0645\u06cc\u0645 \u0634\u062f\u06c1 \u062c\u0648\u0627\u0628 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644\u06cc \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u062d\u0641\u0648\u0638 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u062e\u0627\u0645 \u0641\u0627\u0626\u0644 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2 \u062a\u0648\u060c \u06a9\u0648\u0688 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0648\u06c1\u06cc API \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u0633\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u062a\u0645\u0627\u0645 \u0646\u0648 ETFs \u0645\u06cc\u06ba \u0645\u0633\u0627\u0648\u06cc \u06a9\u0648\u0631\u06cc\u062c \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768965_818_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"ETF \u062a\u0627\u0631\u06cc\u062e\u06cc \u0688\u06cc\u0679\u0627 \u0631\u06cc\u0646\u062c\" style=\"display:block;margin:0 auto\" width=\"678\" height=\"638\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0627\u0633 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0631 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0633\u06d2 \u062a\u06cc\u0646 \u0634\u0639\u0628\u0648\u06ba \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 <code>adjusted_close<\/code> \u06cc\u06c1 \u0631\u0641\u062a\u0627\u0631 \u0627\u0648\u0631 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u06a9\u06cc \u0648\u0627\u067e\u0633\u06cc \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u0626\u06d2 \u06af\u0627\u06d4 <code>close<\/code> \u0627\u0648\u0631 <code>volume<\/code> \u0688\u0627\u0644\u0631 \u06a9\u06cc \u0631\u0642\u0645 \u06a9\u0627 \u062d\u0633\u0627\u0628 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0646\u06c1\u06cc\u06ba \u0628\u0639\u062f \u0645\u06cc\u06ba \u06cc\u06a9\u062c\u0627 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u067e\u0646\u06d2 \u062a\u062d\u0642\u06cc\u0642\u06cc \u067e\u06cc\u0646\u0644 \u06a9\u0648 \u0628\u0646\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u0626\u06cc\u06d2 \u06c1\u0631 \u062c\u0648\u0627\u0628 \u06a9\u0648 \u062a\u0627\u0631\u06cc\u062e \u06a9\u06d2 \u062d\u0633\u0627\u0628 \u0633\u06d2 \u0688\u06cc\u0679\u0627 \u0641\u0631\u06cc\u0645 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646 \u0645\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u062e\u0627\u0645\u0648\u0634\u06cc \u0633\u06d2 \u06c1\u0645\u0627\u0631\u06d2 \u0628\u06cc\u06a9 \u0679\u06cc\u0633\u0679 \u06a9\u0648 \u0631\u0648\u06a9 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">def to_frame(symbol):\n    df = pd.DataFrame(json.loads((RAW \/ f\"{symbol}.json\").read_text()))\n    df[\"date\"] = pd.to_datetime(df[\"date\"])\n    return df.set_index(\"date\").sort_index()[[\"close\",\"adjusted_close\",\"volume\"]].astype(float)\n\nframes, report = {}, []\nfor s in TICKERS:\n    d = to_frame(s)\n    report.append({\"symbol\": s, \"rows\": len(d),\n                   \"duplicate_dates\": int(d.index.duplicated().sum()),\n                   \"missing\": int(d.isna().sum().sum()),\n                   \"nonpositive_price\": int((d[[\"close\",\"adjusted_close\"]] <= 0).sum().sum()),\n                   \"zero_volume_days\": int((d[\"volume\"] <= 0).sum())})\n    frames[s] = d[~d.index.duplicated(keep=\"last\")]\npd.DataFrame(report)\n<\/code><\/pre>\n<p>\u0686\u06cc\u06a9 \u0645\u06cc\u06ba \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679 \u062a\u062c\u0627\u0631\u062a\u06cc \u062f\u0646\u060c \u063a\u0627\u0626\u0628 \u0645\u0634\u0627\u06c1\u062f\u0627\u062a\u060c \u063a\u0644\u0637 \u0642\u06cc\u0645\u062a\u06cc\u06ba\u060c \u0627\u0648\u0631 \u063a\u06cc\u0631 \u0645\u062b\u0628\u062a \u0648\u0627\u0644\u06cc\u0648\u0645 \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768965_495_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"\u062a\u0627\u0631\u06cc\u062e\u06cc \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642\" style=\"display:block;margin:0 auto\" width=\"1200\" height=\"611\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u062a\u0645\u0627\u0645 \u0646\u0648 \u0628\u06cc\u0627\u0646\u0627\u062a \u06c1\u0645\u0627\u0631\u06d2 \u0645\u0639\u0627\u0626\u0646\u06c1 \u06a9\u0648 \u067e\u0627\u0633 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06c1\u0630\u0627 \u06c1\u0645 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06cc \u062a\u0627\u0631\u06cc\u062e \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06d2 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0645\u0637\u0627\u0644\u0639\u06c1 \u06a9\u06d2 \u062a\u06cc\u0646 \u0627\u062f\u0648\u0627\u0631 \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">def panel(field):\n    return pd.concat({s: frames[s][field] for s in TICKERS}, axis=1)[TICKERS]\n\nadj_close = panel(\"adjusted_close\").dropna()\nclose = panel(\"close\").loc[adj_close.index]\nvolume = panel(\"volume\").loc[adj_close.index]\nreturns = adj_close.pct_change().fillna(0.0)\n\nSPLITS = {\"dev\": (\"2005-01-01\",\"2017-12-31\"), \"val\": (\"2018-01-01\",\"2021-12-31\"),\n          \"holdout\": (\"2022-01-01\",\"2025-12-31\")}\nWARMUP = 250\n\ndef make_split(name):\n    lo, hi = SPLITS[name]; idx = adj_close.index\n    first = idx[max(0, idx.searchsorted(pd.Timestamp(lo)) - WARMUP)]\n    keep = (idx >= first) & (idx <= pd.Timestamp(hi))\n    return {\"adj_close\": adj_close[keep], \"close\": close[keep], \"volume\": volume[keep],\n            \"returns\": returns[keep], \"eval_start\": pd.Timestamp(lo)}\n\nDATA = {name: make_split(name) for name in SPLITS}\n\nfor name in [\"dev\", \"val\"]:\n    for field in [\"adj_close\",\"close\",\"volume\"]:\n        DATA[name][field].to_parquet(WS\/\"data\"\/f\"{name}_{field}.parquet\")\njson.dump({k: v[0] for k, v in SPLITS.items()}, open(WS\/\"data\"\/\"splits.json\",\"w\"))\n\nDELETE_RAW_CACHE = False  \nif DELETE_RAW_CACHE:\n    shutil.rmtree(RAW, ignore_errors=True)\n\nprint(\"holdout files on disk:\", list(ROOT.rglob(\"holdout*\")) or \"NONE\")\npd.DataFrame({n: {\"rows\": len(DATA[n][\"adj_close\"]), \"eval_start\": DATA[n][\"eval_start\"].date(),\n                  \"end\": DATA[n][\"adj_close\"].index[-1].date()} for n in SPLITS}).T\n<\/code><\/pre>\n<p>\u062a\u06cc\u0646\u0648\u06ba \u0627\u062f\u0648\u0627\u0631 \u0645\u06cc\u06ba \u0645\u062e\u062a\u0644\u0641 \u067e\u06cc\u0634\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062a\u0631\u0642\u06cc \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0628\u0646\u0627\u0626\u06cc \u0627\u0648\u0631 \u0646\u0638\u0631 \u062b\u0627\u0646\u06cc \u06a9\u06cc \u062c\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u062a\u0648\u062b\u06cc\u0642 \u0648\u06c1 \u0645\u0631\u062d\u0644\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u067e\u0631\u0648\u0645\u0648\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u062a\u0644\u0641 \u0648\u0631\u0698\u0646 \u0645\u0642\u0627\u0628\u0644\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0686\u06cc\u0645\u067e\u06cc\u0626\u0646 \u06a9\u0648 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u067e\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0627\u06cc\u06a9 \u062d\u062a\u0645\u06cc \u062a\u0634\u062e\u06cc\u0635 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062d\u0641\u0648\u0638 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06c1\u0631 \u0627\u0633\u067e\u0644\u0679 \u0645\u06cc\u06ba \u0627\u0633\u0679\u06cc\u062c\u0646\u06af \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 250 \u067e\u0686\u06be\u0644\u06d2 \u062a\u062c\u0627\u0631\u062a\u06cc \u0633\u06cc\u0634\u0646\u0632 \u0628\u06be\u06cc \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0642\u0637\u0627\u0631\u06cc\u06ba \u062a\u0634\u062e\u06cc\u0635 \u06a9\u06cc \u0645\u062f\u062a \u06a9\u06d2 \u0622\u063a\u0627\u0632 \u0633\u06d2 \u06c1\u06cc \u0631\u0648\u0644\u0646\u06af \u0627\u0634\u0627\u0631\u06d2 \u0645\u0648\u062c\u0648\u062f \u0631\u06c1\u0646\u06d2 \u062f\u06cc\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 <code>eval_start<\/code> \u06cc\u06c1 \u0628\u06cc\u06a9\u0679\u06cc\u0633\u0679\u0631 \u06a9\u0648 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u06a9\u06cc \u067e\u06cc\u0645\u0627\u0626\u0634 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06a9\u0628 \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0646\u062a\u06cc\u062c\u06d2 \u0645\u06cc\u06ba \u062a\u0642\u0633\u06cc\u0645 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768966_43_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"\u062a\u0627\u0631\u06cc\u062e\u06cc \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u062a\u0642\u0633\u06cc\u0645\" style=\"display:block;margin:0 auto\" width=\"598\" height=\"357\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u0627\u06c1\u0645 \u0644\u0627\u0626\u0646 \u06c1\u06d2 <code>holdout files on disk: NONE<\/code>. \u0627\u06af\u0631\u0686\u06c1 \u062a\u062d\u0642\u06cc\u0642\u06cc \u06a9\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u06cc\u06ba \u062a\u0631\u0642\u06cc \u0627\u0648\u0631 \u062a\u0648\u062b\u06cc\u0642 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u06cc \u06af\u0626\u06cc \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 2022-2025 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0627\u0628 \u0628\u06be\u06cc \u0635\u0631\u0641 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0639\u0645\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4 \u0644\u06c1\u0630\u0627\u060c \u0645\u0633\u062a\u0642\u0628\u0644 \u06a9\u06d2 \u0627\u06cc\u062c\u0646\u0679 \u0635\u0631\u0641 \u0641\u0627\u0626\u0644 \u0633\u0633\u0679\u0645 \u06a9\u0648 \u0628\u0631\u0627\u0624\u0632 \u06a9\u0631\u06a9\u06d2 \u0627\u0633\u06d2 \u062f\u0631\u06cc\u0627\u0641\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0637\u0627\u0644\u0639\u06c1 \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06c1\u0645 \u067e\u0686\u06be\u0644\u06d2 \u0631\u0646\u0632 \u0633\u06d2 \u0628\u0686 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u060c \u0646\u062a\u0627\u0626\u062c\u060c \u062c\u0627\u0626\u0632\u06d2\u060c \u06cc\u0627 \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u06d2 \u0646\u0645\u0648\u0646\u06d2 \u0628\u06be\u06cc \u0635\u0627\u0641 \u06a9\u0631 \u062f\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">for d in [WS\/\"strategies\", WS\/\"results\", WS\/\"reviews\", PRIVATE]:\n    shutil.rmtree(d, ignore_errors=True)\n    d.mkdir(parents=True, exist_ok=True)\nfor f in [WS\/\"registry.csv\", WS\/\"decisions.jsonl\", WS\/\"report.md\", WS\/\"frozen.json\",\n          WS\/\"strategies\"\/\"frozen.json\"]:\n    f.unlink(missing_ok=True)\nfor f in WS.glob(\"data\/holdout_*.parquet\"):\n    f.unlink()\nprint(\"private:\", list(PRIVATE.iterdir()) or \"empty\")\nprint(\"holdout on disk:\", list(ROOT.rglob('holdout*')) or \"NONE\")\nprint(\"workspace reset\")\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768966_28_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"\u0648\u0631\u06a9 \u0627\u0633\u067e\u06cc\u0633 \u06a9\u0648 \u0631\u06cc \u0633\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u06d4\" style=\"display:block;margin:0 auto\" width=\"327\" height=\"75\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u06c1\u0645\u0627\u0631\u06d2 \u067e\u0627\u0633 \u0627\u0628 \u0627\u06cc\u06a9 \u0635\u0627\u0641 \u062a\u062d\u0642\u06cc\u0642\u06cc \u062d\u0627\u0644\u062a\u060c \u0645\u0646\u0633\u0644\u06a9 EODHD \u0688\u06cc\u0679\u0627\u060c \u0627\u0648\u0631 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0628\u0627\u0624\u0646\u0688\u0631\u06cc\u0632 \u06c1\u06cc\u06ba \u062c\u0648 \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u0648 \u06c1\u062f\u0627\u06cc\u0627\u062a \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0633\u0633\u0679\u0645 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-build-a-deterministic-strategy-evaluation-layer\">\u0627\u06cc\u06a9 \u062a\u0639\u06cc\u06cc\u0646\u0627\u062a\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06cc \u062a\u0634\u062e\u06cc\u0635 \u06a9\u06d2 \u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631<\/h2>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u0628\u0627\u0644\u0622\u062e\u0631 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06cc \u0645\u0646\u0637\u0642 \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0646\u06c1\u06cc\u06ba \u0627\u0633 \u0628\u0627\u062a \u067e\u0631 \u0642\u0627\u0628\u0648 \u0646\u06c1\u06cc\u06ba \u0631\u06a9\u06be\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u06a9\u06c1 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0639\u0645\u0644 \u0645\u06cc\u06ba \u0644\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u06cc\u0627 \u0627\u0633\u06a9\u0648\u0631 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06c1\u0631 \u0646\u0638\u0631 \u062b\u0627\u0646\u06cc \u0627\u067e\u0646\u06d2 \u0645\u0646\u0627\u0641\u0639\u060c \u0679\u0631\u0646 \u0627\u0648\u0648\u0631\u060c \u06cc\u0627 \u062a\u06cc\u0632 \u062a\u0646\u0627\u0633\u0628 \u06a9\u0627 \u062d\u0633\u0627\u0628 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u0632\u0627\u062f \u062a\u06be\u06cc\u060c \u062a\u0648 \u0648\u0631\u0698\u0646\u0648\u06ba \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u0646\u0627 \u0645\u0632\u06cc\u062f \u0645\u0639\u0646\u06cc \u062e\u06cc\u0632 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<p>\u0644\u06c1\u0630\u0627\u060c \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u06cc \u0627\u06cc\u06a9 \u0679\u06cc\u0645 \u0628\u0646\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06c1\u0645 \u0627\u06cc\u06a9 \u062a\u0634\u062e\u06cc\u0635\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0628\u0646\u0627\u0626\u06cc\u06ba \u06af\u06d2 \u062c\u0648 \u067e\u0648\u0631\u06d2 \u062a\u062c\u0631\u0628\u06d2 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0637\u06d2 \u0631\u06c1\u06d2 \u06af\u0627\u06d4 \u062a\u0645\u0627\u0645 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u0648\u0632\u0646 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0648\u06c1\u06cc \u067e\u0627\u0626\u062a\u06be\u0648\u0646 \u0627\u0646\u062c\u0646 \u0639\u0645\u0644\u062f\u0631\u0622\u0645\u062f \u06a9\u06d2 \u0648\u0642\u062a\u060c \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u0627\u06a9\u0627\u0624\u0646\u0679\u0646\u06af\u060c \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0627\u062e\u0631\u0627\u062c\u0627\u062a\u060c \u0627\u0648\u0631 \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u06a9\u06d2 \u0645\u06cc\u0679\u0631\u06a9\u0633 \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-1-create-the-shared-backtesting-engine\">1. \u0627\u06cc\u06a9 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0628\u06cc\u06a9 \u0679\u06cc\u0633\u0679\u0646\u06af \u0627\u0646\u062c\u0646 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h3>\n<p>\u0645\u0634\u062a\u0631\u06a9\u06c1 \u0627\u0646\u062c\u0646 \u0627\u0633 \u067e\u0631 \u0648\u0627\u0642\u0639 \u06c1\u06d2: <code>engine.py<\/code>. \u062f\u0648\u0646\u0648\u06ba \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06cc \u062a\u0634\u062e\u06cc\u0635 \u0627\u0648\u0631 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0627 \u0631\u0627\u0633\u062a\u06c1 \u062c\u0648 \u06c1\u0645 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u0628\u0639\u062f \u0645\u06cc\u06ba \u0627\u0633\u06cc \u0641\u0627\u0626\u0644 \u06a9\u0648 \u062f\u0631\u0622\u0645\u062f \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06c1\u0630\u0627 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0627\u06a9\u0627\u0624\u0646\u0679\u0646\u06af \u0645\u0646\u0637\u0642 \u06a9\u0648 \u0644\u0627\u06af\u0648 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">ENGINE = '''\n\"\"\"Fixed backtest engine and standard metrics. Imported by the notebook AND by the\nisolated runner, so both compute identical numbers from identical code.\"\"\"\nimport json\nimport numpy as np, pandas as pd\nfrom pathlib import Path\n\nPERIODS, RF_ANNUAL, MAR_ANNUAL = 252, 0.0, 0.0\n\ndef backtest(weights, returns, cost_bps=10.0):\n    scheduled = pd.Series(returns.index.isin(weights.index), index=returns.index, dtype=bool)\n    w = weights.reindex(returns.index).ffill().shift(1).fillna(0.0)\n    is_rebal = scheduled.shift(1, fill_value=False)\n\n    held = pd.Series(0.0, index=returns.columns)\n    rows = []\n\n    for d in returns.index:\n        target = w.loc[d] if is_rebal.loc[d] else held\n\n        traded = float((target - held).abs().sum())\n        cost = traded * cost_bps \/ 1e4\n\n        r = returns.loc[d]\n        gross = float((target * r).sum())\n        net = gross - cost\n\n        rows.append((net, traded, cost, float(1.0 - target.sum())))\n\n        denominator = 1.0 + gross\n        if denominator <= 0:\n            raise RuntimeError(f\"Gross portfolio value became non-positive on {d}: gross return={gross}\")\n\n        held = (target * (1.0 + r)) \/ denominator\n\n    return pd.DataFrame(rows, index=returns.index, columns=[\"ret\", \"turnover\", \"cost\", \"cash\"],)\n\ndef metrics(bt, benchmark=None, rf_annual=RF_ANNUAL, mar_annual=MAR_ANNUAL):\n    r = bt[\"ret\"]\n    rf_d = (1 + rf_annual) ** (1\/PERIODS) - 1\n    mar_d = (1 + mar_annual) ** (1\/PERIODS) - 1\n    ex = r - rf_d\n    eq = (1 + r).cumprod(); yrs = len(r)\/PERIODS\n    sd = ex.std(ddof=1)\n    dd = np.sqrt((np.minimum(r - mar_d, 0.0) ** 2).mean()) * np.sqrt(PERIODS)\n    m = {\"cagr\": eq.iloc[-1] ** (1\/yrs) - 1,\n         \"ann_ret\": r.mean() * PERIODS,\n         \"vol\": r.std(ddof=1) * np.sqrt(PERIODS),\n         \"sharpe\": (ex.mean()\/sd) * np.sqrt(PERIODS) if sd > 0 else 0.0,\n         \"sortino\": (r.mean()*PERIODS - mar_annual)\/dd if dd > 0 else 0.0,\n         \"max_dd\": (eq\/eq.cummax() - 1).min(),\n         \"ann_turnover\": bt[\"turnover\"].sum()\/yrs,\n         \"ann_cost\": bt[\"cost\"].sum()\/yrs,\n         \"avg_cash\": bt[\"cash\"].mean()}\n    if benchmark is not None:\n        m[\"bench_cagr\"] = (1+benchmark).cumprod().iloc[-1] ** (1\/yrs) - 1\n    return {k: round(float(v), 4) for k, v in m.items()}\n\ndef load_split(data_dir, split):\n    p = Path(data_dir)\n    d = {f: pd.read_parquet(p\/f\"{split}_{f}.parquet\") for f in [\"adj_close\",\"close\",\"volume\"]}\n    d[\"returns\"] = d[\"adj_close\"].pct_change().fillna(0.0)\n    d[\"eval_start\"] = pd.Timestamp(json.load(open(p\/\"splits.json\"))[split])\n    return d\n'''\n(ROOT\/\"engine.py\").write_text(ENGINE)\nif str(ROOT) not in sys.path:\n    sys.path.insert(0, str(ROOT))\nimport engine\nimportlib.reload(engine)\nfrom engine import backtest, metrics\nprint(\"engine.py written\")\n<\/code><\/pre>\n<pre><code class=\"language-plaintext\">engine.py written\n<\/code><\/pre>\n<p>\u0627\u0628\u060c \u06c1\u0631 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06cc \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc \u0628\u06c1\u062a \u06a9\u0645 \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0648 \u0635\u0631\u0641 \u0679\u0627\u0631\u06af\u0679 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u0648\u0632\u0646 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 <code>engine.py<\/code> \u062c\u0628 \u0648\u06c1 \u0648\u0632\u0646 \u062a\u0634\u062e\u06cc\u0635\u06cc \u067e\u0631\u062a \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0627\u0646\u06c1\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u062a\u0641\u0635\u06cc\u0644 \u06cc\u06c1\u0627\u06ba \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4 \u06c1\u062f\u0641 \u06a9\u06d2 \u0648\u0632\u0646 \u06a9\u0648 \u0627\u06cc\u06a9 \u062a\u062c\u0627\u0631\u062a\u06cc \u0633\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u0648\u06c1 \u0645\u0646\u0627\u0641\u0639 \u06a9\u0648 \u0645\u062a\u0627\u062b\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u062f\u0646 \u06a9\u06cc \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0642\u06cc\u0645\u062a \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 <code>t<\/code> \u0622\u067e \u06a9\u0648 \u0633\u06af\u0646\u0644 \u06a9\u0627 \u062d\u0633\u0627\u0628 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u062f\u0646 \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u0645\u0644 \u0633\u06a9\u062a\u0627\u06d4 <code>t<\/code> \u0648\u06c1 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0648\u0627\u067e\u0633 \u0622 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0646\u062c\u0646 \u0645\u0648\u062c\u0648\u062f\u06c1 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u06a9\u06d2 \u0648\u0632\u0646 \u0627\u0648\u0631 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0631\u06cc \u0628\u06cc\u0644\u0646\u0633\u0646\u06af \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0628\u06be\u06cc \u0641\u0631\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0631\u06cc \u0628\u06cc\u0644\u0646\u0633\u0646\u06af \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646\u060c \u0622\u067e \u06a9\u06cc \u06c1\u0648\u0644\u0688\u0646\u06af\u0632 \u0642\u062f\u0631\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u062b\u0627\u062b\u06c1 \u062c\u0627\u062a \u06a9\u06cc \u0648\u0627\u067e\u0633\u06cc \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u0628\u0691\u06be \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0628\u062c\u0627\u0626\u06d2 \u0627\u0633 \u06a9\u06d2 \u06a9\u06c1 \u06c1\u0631 \u0631\u0648\u0632 \u0627\u067e\u0646\u06cc \u0679\u0627\u0631\u06af\u0679 \u0648\u06cc\u0644\u06cc\u0648 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4 \u062c\u0628 \u0627\u06af\u0644\u0627 \u062a\u0648\u0627\u0632\u0646 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0641\u0631\u0648\u062e\u062a \u06a9\u0627 \u062d\u0633\u0627\u0628 \u0627\u0633 \u0648\u0642\u062a \u06a9\u06d2 \u0627\u0635\u0644 \u0630\u062e\u0627\u0626\u0631 \u0633\u06d2 \u0646\u0626\u06d2 \u06c1\u062f\u0641 \u062a\u06a9 \u0644\u06af\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0622\u0645\u062f\u0646\u06cc\u060c \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0627\u062e\u0631\u0627\u062c\u0627\u062a\u060c \u0679\u0631\u0646 \u0627\u0648\u0648\u0631\u060c \u06a9\u06cc\u0634 \u0627\u06cc\u06a9\u0633\u067e\u0648\u0698\u0631\u060c \u0634\u0627\u0631\u067e\u060c \u0633\u0648\u0631\u0679\u06cc\u0646\u0648\u060c \u0627\u0648\u0631 \u0628\u0639\u062f \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u062a\u062c\u0631\u0628\u0627\u062a \u0645\u06cc\u06ba \u0646\u0642\u0635\u0627\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06cc \u062a\u0639\u0631\u06cc\u0641\u06cc\u06ba \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-2-verify-the-portfolio-accounting\">2. \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u0627\u06a9\u0627\u0624\u0646\u0679\u0646\u06af \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u062f\u0631\u062c\u0646\u0648\u06ba \u062a\u062c\u0631\u0628\u0627\u062a \u067e\u0631 \u062d\u0633\u0627\u0628\u0627\u062a \u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u067e \u0627\u06cc\u06a9 \u0633\u0627\u062f\u06c1 \u06a9\u06cc\u0633 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u06c1\u0627\u06ba \u0645\u062a\u0648\u0642\u0639 \u062c\u0648\u0627\u0628 \u0648\u0627\u0636\u062d \u06c1\u0648\u06d4<\/p>\n<p>\u0641\u0631\u0636 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0648\u0632\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0627\u062b\u0627\u062b\u06c1 \u062e\u0631\u06cc\u062f\u062a\u0627 \u06c1\u06d2: <code>1.0<\/code> \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0628\u06be\u06cc \u0627\u06cc\u0688\u062c\u0633\u0679 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06cc \u06a9\u0644 \u062a\u0635\u0648\u0631\u0627\u062a\u06cc \u0631\u0642\u0645 \u0628\u0627\u0644\u06a9\u0644 \u06c1\u0648\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2: <code>1.0<\/code>: \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u062e\u0631\u06cc\u062f\u0627\u0631\u06cc \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u06c1\u0648\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0648\u0626\u06cc \u0641\u0627\u0644\u0648 \u0627\u067e \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627\u06d4<\/p>\n<pre><code class=\"language-python\">w = pd.DataFrame(0.0, index=[DATA[\"dev\"][\"adj_close\"].index[0]], columns=TICKERS)\nw.iloc[0, 0] = 1.0\nassert round(backtest(w, DATA[\"dev\"][\"returns\"]).turnover.sum(), 4) == 1.0\nprint(\"turnover check ok\")\n<\/code><\/pre>\n<pre><code class=\"language-plaintext\">turnover check ok\n<\/code><\/pre>\n<p>\u0627\u0633 \u0686\u06be\u0648\u0679\u06d2 \u0633\u06d2 \u062f\u0639\u0648\u06d2 \u06a9\u06d2 \u0627\u06c1\u0645 \u06c1\u0648\u0646\u06d2 \u06a9\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1\u0627\u06ba \u0627\u06a9\u0627\u0624\u0646\u0679\u0646\u06af \u06a9\u06cc \u0628\u0627\u0631\u06cc\u06a9 \u062e\u0631\u0627\u0628\u06cc \u0628\u0639\u062f \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0645\u0648\u0627\u0632\u0646\u06c1\u0648\u06ba \u06a9\u0648 \u0645\u062a\u0627\u062b\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u0627\u06af\u0631 \u0639\u0627\u0645 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u0688\u0631\u0641\u0679 \u06a9\u0648 \u06c1\u0631 \u0631\u0648\u0632 \u0627\u06cc\u06a9 \u0646\u0626\u06d2 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0634\u0645\u0627\u0631 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u06d2 \u062a\u062d\u0642\u06cc\u0642 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0679\u0631\u0646 \u0627\u0648\u0648\u0631 \u0627\u0648\u0631 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0627\u062e\u0631\u0627\u062c\u0627\u062a \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0628\u0691\u06be\u0627 \u0686\u0691\u06be\u0627 \u06a9\u0631 \u067e\u06cc\u0634 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<h3 id=\"heading-3-establish-fixed-benchmarks\">3. \u0627\u06cc\u06a9 \u0645\u0642\u0631\u0631\u06c1 \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9 \u0633\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0686\u06cc\u0644\u0646\u062c\u0631\u0632 \u06a9\u0648 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u067e\u0686\u06be\u0644\u06d2 \u0648\u0631\u0698\u0646 \u0633\u06d2 \u0645\u0642\u0627\u0628\u0644\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0686\u06be \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0639\u0646\u06cc \u062e\u06cc\u0632 \u0628\u06be\u06cc \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0686\u0627\u0631 \u062d\u0648\u0627\u0644\u06c1 \u062c\u0627\u062a \u06a9\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0642\u0627\u0626\u0645 \u06a9\u0631\u06cc\u06ba \u06af\u06d2: SPY Buy and Hold\u060c Equal Weight Buy and Hold for 9 ETFs\u060c \u062c\u0646\u0631\u0644 \u06a9\u0631\u0627\u0633 \u0633\u06cc\u06a9\u0634\u0646 \u0645\u0648\u0645\u0646\u0679\u0645\u060c \u0688\u0627\u0644\u0631 \u06a9\u06d2 \u0633\u0627\u0626\u0632 \u06a9\u06d2 \u0627\u06c1\u0644\u06cc\u062a \u06a9\u06d2 \u0641\u0644\u0679\u0631 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0648\u06c1\u06cc \u0631\u0641\u062a\u0627\u0631 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u062c\u0648 \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u062a\u062d\u0642\u06cc\u0642\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0645\u06cc\u06ba \u0638\u0627\u06c1\u0631 \u06c1\u0648\u06af\u06cc\u06d4<\/p>\n<pre><code class=\"language-python\">def bh_weights(data, tickers):\n    w = pd.DataFrame(0.0, index=[data[\"adj_close\"].index[0]], columns=data[\"adj_close\"].columns)\n    w.loc[w.index[0], tickers] = 1.0\/len(tickers)\n    return w\n\ndef plain_momentum(data, mom_window=126, top_n=3):\n    adj = data[\"adj_close\"]; mom = adj.pct_change(mom_window)\n    dates = pd.DatetimeIndex(adj.index.to_series().resample(\"ME\").last().dropna())\n    w = pd.DataFrame(0.0, index=dates, columns=adj.columns)\n    for dt in dates:\n        picks = mom.loc[dt][mom.loc[dt] > 0].dropna().nlargest(top_n).index\n        if len(picks): w.loc[dt, picks] = 1.0\/len(picks)\n    return w\n\ndef volume_momentum(data, mom_window=126, top_n=3, vol_short=20, vol_long=120, vol_ratio_min=1.0):\n    adj, cls, vol = data[\"adj_close\"], data[\"close\"], data[\"volume\"]\n    mom = adj.pct_change(mom_window); dv = cls*vol\n    ratio = dv.rolling(vol_short).mean()\/dv.rolling(vol_long).mean()\n    ok = (mom > 0) & (ratio > vol_ratio_min)\n    dates = pd.DatetimeIndex(adj.index.to_series().resample(\"ME\").last().dropna())\n    w = pd.DataFrame(0.0, index=dates, columns=adj.columns)\n    for dt in dates:\n        picks = mom.loc[dt][ok.loc[dt]].dropna().nlargest(top_n).index\n        if len(picks): w.loc[dt, picks] = 1.0\/len(picks)\n    return w\n\nBENCHMARKS = {\"spy_bh\": lambda d: bh_weights(d, [\"SPY\"]),\n              \"ew_bh\": lambda d: bh_weights(d, TICKERS),\n              \"plain_mom\": plain_momentum, \"volume_mom\": volume_momentum}\n\ndef benchmark_table(split):\n    d = DATA[split]; rows = {}\n    for name, fn in BENCHMARKS.items():\n        bt = backtest(fn(d), d[\"returns\"])\n        rows[name] = metrics(bt.loc[d[\"eval_start\"]:], d[\"returns\"][\"SPY\"].loc[d[\"eval_start\"]:])\n    return pd.DataFrame(rows).T\n\nCOLS_B = [\"cagr\",\"sharpe\",\"sortino\",\"max_dd\",\"ann_turnover\"]\nBENCH = {s: benchmark_table(s) for s in [\"dev\",\"val\"]}\nBENCH_TEXT = (\"DEVELOPMENTn\" + BENCH[\"dev\"][COLS_B].to_string() +\n              \"nnVALIDATIONn\" + BENCH[\"val\"][COLS_B].to_string())\n(WS\/\"BENCHMARKS.md\").write_text(\"# Fixed benchmarksnn```n\" + BENCH_TEXT + \"n```n\")\n\nab = BENCH[\"dev\"].loc[\"volume_mom\"] - BENCH[\"dev\"].loc[\"plain_mom\"]\nprint(BENCH[\"dev\"][COLS_B])\nprint(f\"nvolume filter effect on dev: sharpe {ab['sharpe']:+.4f}, \"\n      f\"cagr {ab['cagr']:+.4f}, turnover {ab['ann_turnover']:+.2f}\")\n<\/code><\/pre>\n<p>\u067e\u06cc\u0634 \u0631\u0641\u062a \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u0627\u06cc\u06a9 \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u062d\u0642\u06cc\u0642\u062a \u06a9\u06cc \u062c\u0627\u0646\u0686 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768966_176_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"\u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9 \u0645\u0648\u0627\u0632\u0646\u06c1\" style=\"display:block;margin:0 auto\" width=\"1217\" height=\"268\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u062d\u062c\u0645 \u06a9\u06d2 \u0641\u0644\u0679\u0631\u0632 \u0645\u0639\u0645\u0648\u0644 \u06a9\u06cc \u0631\u0641\u062a\u0627\u0631 \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0645\u06cc \u06a9\u0648 \u0642\u062f\u0631\u06d2 \u0628\u06c1\u062a\u0631 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u062a\u062c\u0627\u0631\u062a \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u067e\u0631\u06a9\u0634\u0634 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062a\u0631\u0642\u06cc \u06a9\u06cc \u0631\u0641\u062a\u0627\u0631 \u0645\u06cc\u06ba \u06a9\u0645\u06cc <code>0.0976<\/code>CAGR \u0645\u06cc\u06ba \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 2 \u0641\u06cc\u0635\u062f \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u06a9\u06cc \u06a9\u0645\u06cc \u06c1\u0648\u06af\u06cc \u0627\u0648\u0631 \u0633\u0627\u0644\u0627\u0646\u06c1 \u0641\u0631\u0648\u062e\u062a \u0645\u06cc\u06ba \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 2 \u0641\u06cc\u0635\u062f \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u06a9\u06cc \u06a9\u0645\u06cc \u06c1\u0648\u06af\u06cc\u06d4 <code>4.38<\/code>.<\/p>\n<p>\u06cc\u06c1 \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0641\u06cc\u062f \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u06c1\u06d2 \u06a9\u06c1 \u0648\u06c1 \u0628\u06c1\u062a\u0631\u06cc \u06a9\u06cc \u062a\u062c\u0648\u06cc\u0632 \u067e\u06cc\u0634 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0642\u0627\u0626\u0645 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0627\u0646 \u06a9\u06d2 \u0633\u0627\u0645\u0646\u06d2 \u0627\u06cc\u06a9 \u0645\u0636\u0628\u0648\u0637 \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u067e\u06cc\u0634 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc \u062c\u0627\u062a\u06cc \u062c\u0633 \u0645\u06cc\u06ba \u0635\u0631\u0641 \u06a9\u0686\u06be \u062a\u0637\u06c1\u06cc\u0631 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0648\u0627\u0636\u062d \u06a9\u0645\u0632\u0648\u0631\u06cc\u0627\u06ba \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u0627 \u0627\u0646\u06c1\u06cc\u06ba \u0633\u0627\u0645\u0646\u0627 \u06a9\u0631\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<p>\u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9\u0633 \u06a9\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u0633\u06cc\u0679 \u06a9\u0648 \u062a\u0648\u062b\u06cc\u0642 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0634\u0645\u0627\u0631 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062a\u0631\u0642\u06cc \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u06cc\u0627\u0631 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>BENCHMARKS.md<\/code>. \u0627\u0633 \u0633\u06d2 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u0648 \u0627\u067e\u0646\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u0627\u06cc\u06a9 \u0645\u0642\u0631\u0631\u06c1 \u062d\u0648\u0627\u0644\u06c1 \u062c\u0627\u062a\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0633\u06d2 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0628\u062c\u0627\u0626\u06d2 \u0627\u0633 \u06a9\u06d2 \u06a9\u06c1 \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u06a9\u0627 \u0641\u06cc\u0635\u0644\u06c1 \u0635\u0631\u0641 \u0627\u0633 \u0648\u0631\u0698\u0646 \u06a9\u06d2 \u062e\u0644\u0627\u0641 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u062c\u0648 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0686\u06cc\u0645\u067e\u0626\u0646 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-4-run-every-strategy-in-an-isolated-subprocess\">4. \u062a\u0645\u0627\u0645 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u0630\u06cc\u0644\u06cc \u0639\u0645\u0644 \u0645\u06cc\u06ba \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/h3>\n<p>\u0645\u0634\u062a\u0631\u06a9\u06c1 \u0627\u0646\u062c\u0646 \u0627\u0633 \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u06a9\u0627 \u062d\u0633\u0627\u0628 \u06a9\u06cc\u0633\u06d2 \u0644\u06af\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648\u0688 \u06a9\u0648 \u0627\u0628\u06be\u06cc \u0628\u06be\u06cc \u06a9\u06c1\u06cc\u06ba \u0686\u0644\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u0648\u0688 \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0645\u0631\u06a9\u0632\u06cc \u062a\u062d\u0642\u06cc\u0642\u06cc \u0639\u0645\u0644 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0686\u0644\u0627\u0646\u06d2 \u0633\u06d2 \u0622\u067e \u06a9\u0648 \u06c1\u0631 \u0627\u0633 \u0686\u06cc\u0632 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u0645\u0644\u062a\u06cc \u06c1\u06d2 \u062c\u0648 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0628\u06be\u0631\u06cc \u06c1\u0648\u0626\u06cc \u06c1\u06d2\u060c \u0628\u0634\u0645\u0648\u0644 API \u0627\u0633\u0646\u0627\u062f \u0627\u0648\u0631 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0688\u06cc\u0679\u0627 \u0633\u06cc\u0679\u0633 \u062c\u0646\u06c1\u06cc\u06ba \u0622\u067e \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u062a\u062d\u0642\u06cc\u0642\u06cc \u0644\u0648\u067e \u0633\u06d2 \u062f\u0648\u0631 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u06c1\u0631 \u062a\u062c\u0631\u0628\u06c1 \u0635\u0631\u0641 \u0627\u0633 \u0645\u062e\u0635\u0648\u0635 \u062a\u0634\u062e\u06cc\u0635 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u06a9\u0627\u0631 \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u067e\u0646\u06d2 \u0627\u06cc\u0688\u06c1\u0627\u06a9 \u0639\u0645\u0644 \u0645\u06cc\u06ba \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06c1\u0645 \u0627\u06cc\u06a9 \u0627\u06cc\u06af\u0632\u06cc\u06a9\u06cc\u0679\u0631 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u0627\u0633 \u0639\u0645\u0644 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">RUNNER = '''\n\"\"\"Isolated strategy runner. Own process, temp sandbox, scrubbed environment.\"\"\"\nimport sys, json, importlib.util, traceback\n\ndef main():\n    strat, params_json, data_dir, split, cost_bps = sys.argv[1:6]\n    import engine\n    d = engine.load_split(data_dir, split)\n    spec = importlib.util.spec_from_file_location(\"strategy\", strat)\n    mod = importlib.util.module_from_spec(spec); spec.loader.exec_module(mod)\n    w = mod.target_weights(d, **json.loads(params_json))\n    bt = engine.backtest(w, d[\"returns\"], cost_bps=float(cost_bps))\n    ev = bt.loc[d[\"eval_start\"]:]\n    bench = d[\"returns\"][\"SPY\"].loc[d[\"eval_start\"]:] if \"SPY\" in d[\"returns\"] else None\n    print(json.dumps({\"ok\": True, \"metrics\": engine.metrics(ev, bench),\n                      \"equity\": [round(float(x), 6) for x in (1+ev[\"ret\"]).cumprod().tolist()],\n                      \"dates\": [str(x.date()) for x in ev.index]}))\n\nif __name__ == \"__main__\":\n    try: main()\n    except Exception: print(json.dumps({\"ok\": False, \"error\": traceback.format_exc(limit=3)}))\n'''\n(ROOT\/\"runner.py\").write_text(RUNNER)\n\ndef isolated_environment(sandbox):\n\n    required = [\"PATH\",\"SYSTEMROOT\",\"WINDIR\",\"COMSPEC\",\"PATHEXT\",\"VIRTUAL_ENV\",\"CONDA_PREFIX\",\"CONDA_DEFAULT_ENV\",\"LD_LIBRARY_PATH\",\n                \"DYLD_LIBRARY_PATH\",\"LANG\",\"LC_ALL\"]\n\n    env = {name: os.environ[name] for name in required if name in os.environ}\n\n    env.update({\n        \"HOME\": str(sandbox),\n        \"USERPROFILE\": str(sandbox),\n        \"TEMP\": str(sandbox),\n        \"TMP\": str(sandbox),\n        \"TMPDIR\": str(sandbox),\n        \"PYTHONHASHSEED\": \"1\",\n        \"PYTHONUTF8\": \"1\",\n    })\n\n    return env\n\ndef run_isolated(strategy_path, params, split, cost_bps=10.0, timeout=600):\n    sandbox = Path(tempfile.mkdtemp(prefix=\"strat_\"))\n    (sandbox\/\"data\").mkdir()\n    for f in [\"adj_close\",\"close\",\"volume\"]:\n        shutil.copy(WS\/\"data\"\/f\"{split}_{f}.parquet\", sandbox\/\"data\")\n    shutil.copy(WS\/\"data\"\/\"splits.json\", sandbox\/\"data\")\n    shutil.copy(ROOT\/\"engine.py\", sandbox); shutil.copy(ROOT\/\"runner.py\", sandbox)\n    shutil.copy(strategy_path, sandbox\/\"strategy.py\")\n    try:\n        p = subprocess.run([sys.executable, \"runner.py\", \"strategy.py\", json.dumps(params),\n                            \"data\", split, str(cost_bps)],\n                           capture_output=True, text=True, cwd=sandbox, timeout=timeout,\n                           env=isolated_environment(sandbox))\n        if not p.stdout.strip():\n            return {\"ok\": False, \"error\": (p.stderr or \"no output\")[-400:]}\n        return json.loads(p.stdout)\n    except subprocess.TimeoutExpired:\n        return {\"ok\": False, \"error\": f\"timeout after {timeout}s\"}\n    finally:\n        shutil.rmtree(sandbox, ignore_errors=True)\n<\/code><\/pre>\n<p>\u06c1\u0631 \u0631\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c <code>run_isolated()<\/code> \u0627\u06cc\u06a9 \u0639\u0627\u0631\u0636\u06cc \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0635\u0631\u0641 \u0645\u0637\u0644\u0648\u0628\u06c1 \u0688\u06cc\u0648\u0644\u067e\u0645\u0646\u0679 \u06cc\u0627 \u062a\u0648\u062b\u06cc\u0642 \u06a9\u06cc \u0641\u0627\u0626\u0644\u06cc\u06ba \u062a\u06cc\u0627\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 <code>engine.py<\/code>\u060c <code>runner.py<\/code>\u0627\u0648\u0631 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0627\u06d4 \u0645\u0632\u06cc\u062f \u0628\u0631\u0622\u06ba\u060c \u0648\u0627\u0644\u062f\u06cc\u0646 \u06a9\u06d2 \u0639\u0645\u0644 \u06a9\u06d2 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0646\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u06cc\u06c1 \u0628\u0686\u06d2 \u06a9\u06d2 \u0639\u0645\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a \u0686\u06be\u0648\u0679\u0627 \u0645\u0627\u062d\u0648\u0644 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u0648\u0632\u0646 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u06a9\u0627\u0631 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 EODHD\u060c OpenAI\u060c LangSmith\u060c \u06cc\u0627 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0688\u06cc\u0679\u0627 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0622\u067e\u0631\u06cc\u0679\u0646\u06af \u0633\u0633\u0679\u0645 \u0633\u06cc\u06a9\u06cc\u0648\u0631\u0679\u06cc \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u062a\u062d\u0642\u06cc\u0642\u06cc \u0639\u0645\u0644 \u06a9\u06cc \u062a\u0646\u06c1\u0627\u0626\u06cc \u06a9\u06cc \u062d\u062f \u06c1\u06d2\u06d4 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u06a9\u0648\u0688 \u0627\u0628 \u0628\u06be\u06cc \u0627\u06cc\u06a9 \u0639\u0627\u0645 Python \u0639\u0645\u0644 \u06c1\u06d2 \u062c\u0648 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0635\u0627\u0631\u0641 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06d2 \u062a\u062d\u062a \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1\u0627\u06ba \u0645\u0642\u0635\u062f \u062f\u0634\u0645\u0646\u06cc \u06a9\u0648\u0688 \u0633\u06d2 \u062a\u062d\u0641\u0638 \u06a9\u0627 \u062f\u0639\u0648\u06cc \u06a9\u0631\u0646\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0628\u0644\u06a9\u06c1 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u06d2 \u0631\u0627\u0633\u062a\u06d2 \u0645\u06cc\u06ba \u0627\u0633\u0646\u0627\u062f \u0627\u0648\u0631 \u063a\u06cc\u0631 \u0645\u0631\u062a\u0628 \u0634\u062f\u06c1 \u062a\u062d\u0642\u06cc\u0642\u06cc \u0688\u06cc\u0679\u0627 \u062a\u06a9 \u062d\u0627\u062f\u062b\u0627\u062a\u06cc \u0631\u0633\u0627\u0626\u06cc \u06a9\u0648 \u0631\u0648\u06a9\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-5-verify-execution-parity-and-data-boundaries\">5. \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u06cc \u0628\u0631\u0627\u0628\u0631\u06cc \u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u062d\u062f\u0648\u062f \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u067e\u06be\u0627\u0646\u0633\u06cc \u06a9\u06d2 \u0627\u0633 \u0631\u0627\u0633\u062a\u06d2 \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062c\u0627\u0646\u0686 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u062f\u0648 \u0686\u06cc\u0632\u06cc\u06ba \u06c1\u06cc\u06ba:<\/p>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0627\u06cc\u06a9 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u0639\u0645\u0644 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u062c\u0627\u0646\u0686 \u06a9\u06cc \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u0646\u062a\u0627\u0626\u062c \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba \u062c\u0633 \u0637\u0631\u062d \u0627\u0633\u06cc \u0645\u0646\u0637\u0642 \u06a9\u0627 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>engine.py<\/code>. \u0648\u0631\u0646\u06c1 \u06c1\u0645 \u0646\u06d2 \u067e\u06cc\u0645\u0627\u0626\u0634 \u06a9\u06d2 \u062f\u0648 \u0645\u062e\u062a\u0644\u0641 \u0646\u0638\u0627\u0645 \u0645\u062a\u0639\u0627\u0631\u0641 \u06a9\u0631\u0627\u0626\u06d2 \u06c1\u0648\u062a\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0628\u0631\u0627\u0628\u0631\u06cc \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0648\u0627\u0644\u06cc\u0648\u0645 \u0645\u0648\u0645\u06cc\u0646\u0679\u0645 \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u062f\u0648\u0633\u0631\u0627\u060c \u06c1\u0645 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u062a\u062d\u0642\u06cc\u0642\u0627\u062a \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u0627\u0633\u0646\u0627\u062f \u062c\u06cc\u0633\u06d2 \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u0627\u0648\u0631 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679\u0633 \u06cc\u0627 \u0630\u0627\u062a\u06cc \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0648 \u062a\u0644\u0627\u0634 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">(WS\/\"strategies\"\/\"parity_check.py\").write_text('''import pandas as pd\ndef target_weights(data, mom_window=126, top_n=3, vol_short=20, vol_long=120, vol_ratio_min=1.0):\n    adj, cls, vol = data[\"adj_close\"], data[\"close\"], data[\"volume\"]\n    mom = adj.pct_change(mom_window); dv = cls*vol\n    ratio = dv.rolling(vol_short).mean()\/dv.rolling(vol_long).mean()\n    ok = (mom>0)&(ratio>vol_ratio_min)\n    dates = pd.DatetimeIndex(adj.index.to_series().resample(\"ME\").last().dropna())\n    w = pd.DataFrame(0.0, index=dates, columns=adj.columns)\n    for d in dates:\n        picks = mom.loc[d][ok.loc[d]].dropna().nlargest(top_n).index\n        if len(picks): w.loc[d,picks]=1.0\/len(picks)\n    return w\n''')\niso = run_isolated(WS\/\"strategies\"\/\"parity_check.py\", {\"mom_window\":126,\"top_n\":3}, \"dev\")\nd = DATA[\"dev\"]\ninp = metrics(backtest(volume_momentum(d, 126, 3), d[\"returns\"]).loc[d[\"eval_start\"]:],\n              d[\"returns\"][\"SPY\"].loc[d[\"eval_start\"]:])\nassert iso[\"metrics\"][\"sharpe\"] == inp[\"sharpe\"], \"isolated and in-process disagree\"\nprint(\"parity ok:\", iso[\"metrics\"][\"sharpe\"])\n\nPROBE = f'''import os, glob\ndef target_weights(data, **k):\n    keys = [x for x in os.environ if any(t in x for t in (\"KEY\",\"TOKEN\",\"SECRET\"))]\n    files = glob.glob(r\"{PRIVATE}\/*\") + glob.glob(r\"{WS}\/data\/holdout_*\")\n    raise RuntimeError(f\"KEYS={{keys}} REACHABLE_SENSITIVE_FILES={{len(files)}}\")\n'''\n(WS\/\"strategies\"\/\"probe.py\").write_text(PROBE)\nmsg = run_isolated(WS\/\"strategies\"\/\"probe.py\", {}, \"dev\")[\"error\"].strip().split(\"n\")[-1]\nprint(\"probe:\", msg)\nassert \"KEYS=[]\" in msg, \"credentials reachable from the sandbox\"\nassert \"REACHABLE_SENSITIVE_FILES=0\" in msg, \"holdout or private files reachable from the sandbox\"\n<\/code><\/pre>\n<p>\u0645\u0639\u0627\u0626\u0646\u06c1 \u06af\u0632\u0631 \u0686\u06a9\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">parity ok: 0.4387\nprobe: RuntimeError: KEYS=[] REACHABLE_SENSITIVE_FILES=0\n<\/code><\/pre>\n<p>\u0627\u0644\u06af \u062a\u06be\u0644\u06af \u0631\u0627\u0633\u062a\u06c1 \u0627\u0648\u0631 \u0633\u06cc\u062f\u06be\u0627 \u0631\u0627\u0633\u062a\u06c1 \u062f\u0648\u0646\u0648\u06ba \u0628\u0631\u0627\u0628\u0631 \u06c1\u06cc\u06ba\u06d4 <code>0.4387<\/code> \u0686\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0634\u0627\u0631\u067e \u06c1\u06d2\u060c \u0645\u06cc\u06ba \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u0633\u06d2 \u0645\u062a\u0641\u0642 \u06c1\u0648\u06ba\u06d4 \u0645\u0632\u06cc\u062f \u0628\u0631\u0622\u06ba\u060c \u062a\u062d\u0642\u06cc\u0642\u0627\u062a \u06a9\u0648 \u0630\u06cc\u0644\u06cc \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u0627\u0633\u0646\u0627\u062f\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u0646\u06c1\u06cc\u06ba \u0645\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0646\u06c1 \u06c1\u06cc \u0627\u0633 \u0645\u06cc\u06ba \u0627\u0633\u0679\u06cc\u062c\u0688 \u067e\u0631\u0627\u0626\u06cc\u0648\u06cc\u0679 \u06cc\u0627 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0641\u0627\u0626\u0644\u06cc\u06ba \u0645\u0644\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-create-the-experiment-and-decision-layer\">\u062a\u062c\u0631\u0628\u06c1 \u0627\u0648\u0631 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u06cc \u062a\u06c1\u06cc\u06ba \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h2>\n<p>\u0628\u06cc\u06a9 \u0679\u06cc\u0633\u0679\u0646\u06af \u0627\u0646\u062c\u0646 \u0627\u0628 \u062a\u0645\u0627\u0645 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u062a\u0634\u062e\u06cc\u0635\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u06c1\u0645\u06cc\u06ba \u0628\u0627\u0631 \u0628\u0627\u0631 \u062a\u062c\u0631\u0628\u0627\u062a \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0627\u0633 \u067e\u0631 \u0642\u0627\u0628\u0648 \u067e\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0627\u06cc\u062c\u0646\u0679 \u063a\u06cc\u0631 \u0645\u0639\u06cc\u0646\u06c1 \u0645\u062f\u062a \u062a\u06a9 \u0646\u0626\u06cc \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u0627 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0646\u0627\u06a9\u0627\u0645 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0648 \u0646\u0638\u0631 \u0627\u0646\u062f\u0627\u0632 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u06cc\u0627 \u067e\u0686\u06be\u0644\u06d2 \u0627\u06cc\u06a9 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0633\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u0646\u0626\u06d2 \u0648\u0631\u0698\u0646 \u067e\u0631 \u0645\u0646\u062a\u0642\u0644 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u062a\u062d\u0642\u06cc\u0642\u06cc \u0639\u0645\u0644 \u0627\u0628 \u0628\u06be\u06cc \u0627\u0633 \u0646\u062a\u0627\u0626\u062c \u06a9\u06cc \u0637\u0631\u0641 \u0628\u0691\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u0644\u06cc\u06d2\u060c \u0627\u06af\u0644\u06cc \u067e\u0631\u062a \u062a\u0645\u0627\u0645 \u062a\u062c\u0631\u0628\u0627\u062a \u06a9\u0648 \u0679\u0631\u06cc\u06a9 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0627\u06cc\u06a9 \u0645\u0642\u0631\u0631\u06c1 \u062a\u062d\u0642\u06cc\u0642\u06cc \u0628\u062c\u0679 \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06af\u0644\u0627 \u062a\u062c\u0631\u0628\u06c1 \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u0631 \u0648\u0631\u0698\u0646 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u062a\u0631\u062a\u06cc\u0628 \u0633\u06d2 \u06af\u0632\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-1-create-the-experiment-registry\">1. \u0627\u06cc\u06a9 \u062a\u062c\u0631\u0628\u0627\u062a\u06cc \u0631\u062c\u0633\u0679\u0631\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h3>\n<p>\u0622\u0626\u06cc\u06d2 \u0631\u062c\u0633\u0679\u0631\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u060c \u062c\u0648 \u0633\u0633\u0679\u0645 \u067e\u0631 \u062c\u0627\u0646\u0686 \u06a9\u06cc \u06af\u0626\u06cc \u062a\u0645\u0627\u0645 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">REGISTRY = WS \/ \"registry.csv\"\nDECISIONS = WS \/ \"decisions.jsonl\"\nMAX_CONFIGS = 12\nCOLS = [\"version\",\"run\",\"status\",\"params\",\"note\",\"dev_cagr\",\"dev_sharpe\",\"dev_sortino\",\n        \"dev_max_dd\",\"dev_turnover\",\"val_cagr\",\"val_sharpe\",\"val_max_dd\",\"dev_cagr_20bps\",\"error\"]\n\ndef _used(version):\n    if not REGISTRY.exists(): return 0\n    return int((pd.read_csv(REGISTRY)[\"version\"] == version).sum())\n\ndef _decisions():\n    if not DECISIONS.exists(): return []\n    return [json.loads(l) for l in DECISIONS.read_text().splitlines() if l.strip()]\n\ndef _stage_ok(version):\n    \"\"\"vN cannot begin until v(N-1) is swept, reviewed and decided.\"\"\"\n    if not (version.startswith(\"v\") and version[1:].isdigit()): return True, \"\"\n    n = int(version[1:])\n    if n <= 1: return True, \"\"\n    prev = f\"v{n-1}\"\n    if not REGISTRY.exists() or _used(prev) == 0:\n        return False, f\"stage gate: {prev} has no recorded runs. Complete {prev} first.\"\n    reg = pd.read_csv(REGISTRY)\n    if reg[(reg.version == prev) &#038; (reg.status == \"ok\")].empty:\n        return False, f\"stage gate: {prev} has no successful runs.\"\n    if not (WS\/\"reviews\"\/f\"{prev}.md\").exists():\n        return False, f\"stage gate: \/reviews\/{prev}.md does not exist. Get a critic review first.\"\n    if not any(d[\"version\"] == prev for d in _decisions()):\n        return False, f\"stage gate: no decision recorded for {prev}. Call record_decision first.\"\n    return True, \"\"\n<\/code><\/pre>\n<p><code>MAX_CONFIGS = 12<\/code>    \u06c1\u0645 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u067e\u0631 \u0633\u062e\u062a \u062d\u062f\u06cc\u06ba \u0644\u06af\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0648\u0631\u0698\u0646 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u062a\u0635\u062f\u06cc\u0642\u06cc \u0688\u06cc\u0679\u0627 \u06a9\u0627 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u06a9\u06d2 \u0645\u062e\u062a\u0644\u0641 \u0645\u062c\u0645\u0648\u0639\u0648\u06ba \u06a9\u0648 \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u0627\u0645\u062d\u062f\u0648\u062f \u0645\u0648\u0627\u0642\u0639 \u0645\u0644\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0648\u06c1 \u062a\u0648\u062b\u06cc\u0642 \u0645\u06cc\u06ba \u0628\u06c1\u062a\u0631\u06cc\u0646 \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u06a9\u0627 \u0645\u0638\u0627\u06c1\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0627\u0645\u062a\u0632\u0627\u062c \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u062a\u0627 \u0631\u06c1\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0627 \u0633\u06cc\u0679 \u0622\u06c1\u0633\u062a\u06c1 \u0622\u06c1\u0633\u062a\u06c1 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0627\u0635\u0644\u0627\u062d \u06a9\u06d2 \u062a\u0627\u0628\u0639 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633\u0679\u06cc\u062c \u06af\u06cc\u0679\u0633 \u062f\u0648\u0633\u0631\u06d2 \u0645\u0633\u0627\u0626\u0644 \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u0646\u06cc\u0627 \u0648\u0631\u0698\u0646 \u0634\u0631\u0648\u0639 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u0627\u06cc\u062c\u0646\u0679 \u0645\u062e\u062a\u0644\u0641 \u0633\u0648\u0686\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u06c1\u0644\u06d2 <code>v2<\/code> \u0679\u06cc\u0633\u0679 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c <code>v1<\/code> \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u06a9\u0645 \u0627\u0632 \u06a9\u0645 \u0627\u06cc\u06a9 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u062f\u0648\u0691\u060c \u062a\u0646\u0642\u06cc\u062f\u06cc \u062c\u0627\u0626\u0632\u06d2\u060c \u0627\u0648\u0631 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0634\u062f\u06c1 \u0641\u06cc\u0635\u0644\u06d2 \u06c1\u0648\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba\u06d4 \u0648\u06c1\u06cc \u062d\u06a9\u0645 \u067e\u06c1\u0644\u06d2 \u06a9\u06cc \u0637\u0631\u062d \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 <code>v3<\/code>.<\/p>\n<p>\u062a\u0648 \u0648\u0631\u0698\u0646 \u06a9\u0627 \u0628\u06c1\u0627\u0624 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768966_882_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"\u0648\u0631\u0698\u0646 \u0628\u06c1\u0627\u0624\" style=\"display:block;margin:0 auto\" width=\"1500\" height=\"221\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0639\u0645\u0644 \u06a9\u0648 \u06cc\u0627\u062f \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u067e\u0646\u06d2 \u06a9\u0648\u0688 \u0645\u06cc\u06ba \u0627\u0633\u0679\u0688\u06cc \u0622\u0631\u0688\u0631 \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-2-create-the-research-tools\">2. \u062a\u062d\u0642\u06cc\u0642\u06cc \u0679\u0648\u0644\u0632 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h3>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u062a\u06cc\u0646 LangChain \u0679\u0648\u0644\u0632 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u0633 \u067e\u0631\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0639\u0627\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<p>\u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2\u06d4 <code>sweep()<\/code>. \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0631\u06a9\u0627\u0631\u06cc \u0628\u06cc\u06a9 \u0679\u06cc\u0633\u0679 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u06cc\u06c1 \u0648\u0627\u062d\u062f \u0631\u0627\u0633\u062a\u06c1 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">from langchain.tools import tool\n\n@tool\ndef sweep(version: str, grid_json: str, note: str = \"\") -> str:\n    \"\"\"Backtest strategies\/<version>.py over several parameter sets in ONE call.\n\n    version   : file stem, e.g. \"v1\" for strategies\/v1.py\n    grid_json : JSON list of parameter objects, e.g. [{\"top_n\":3},{\"top_n\":4}]\n    note      : short reason for this sweep\n\n    Runs each configuration in an isolated subprocess. Returns a CSV table sorted by\n    validation Sharpe. Max 12 configurations per version, cumulative. Every row is\n    written to registry.csv, including failures. vN is blocked until v(N-1) is swept,\n    reviewed and decided.\n    \"\"\"\n    ok, why = _stage_ok(version)\n    if not ok: return f\"error: {why}\"\n    used = _used(version)\n    try:\n        grid = json.loads(grid_json)\n        if isinstance(grid, dict): grid = [grid]\n    except Exception as e:\n        return f\"error: grid_json is not valid JSON ({e})\"\n    if used + len(grid) > MAX_CONFIGS:\n        return f\"error: budget. {used}\/{MAX_CONFIGS} used on {version}, you asked for {len(grid)} more.\"\n    path = WS\/\"strategies\"\/f\"{version}.py\"\n    if not path.exists():\n        return f\"error: {path.name} does not exist. Write it first.\"\n\n    rows = []\n    for i, params in enumerate(grid, start=used + 1):\n        row = {\"version\": version, \"run\": i, \"note\": note,\n               \"params\": json.dumps(params, separators=(\",\", \":\"))}\n        dev = run_isolated(path, params, \"dev\")\n        if not dev[\"ok\"]:\n            row.update(status=\"error\", error=dev[\"error\"].strip().split(\"n\")[-1][:150])\n            rows.append(row); continue\n        val = run_isolated(path, params, \"val\")\n        c20 = run_isolated(path, params, \"dev\", cost_bps=20.0)\n        dm, vm = dev[\"metrics\"], val[\"metrics\"]\n        row.update(status=\"ok\", dev_cagr=dm[\"cagr\"], dev_sharpe=dm[\"sharpe\"],\n                   dev_sortino=dm[\"sortino\"], dev_max_dd=dm[\"max_dd\"],\n                   dev_turnover=dm[\"ann_turnover\"], val_cagr=vm[\"cagr\"],\n                   val_sharpe=vm[\"sharpe\"], val_max_dd=vm[\"max_dd\"],\n                   dev_cagr_20bps=c20[\"metrics\"][\"cagr\"] if c20[\"ok\"] else None)\n        tag = f\"{version}_run{i}\"\n        (WS\/\"results\"\/f\"{tag}.json\").write_text(json.dumps({\"params\": params, \"dev\": dm, \"val\": vm}, indent=2))\n        eq = pd.Series(dev[\"equity\"], index=pd.to_datetime(dev[\"dates\"]))\n        plt.figure(figsize=(8,3)); plt.plot(eq); plt.yscale(\"log\"); plt.title(tag)\n        plt.tight_layout(); plt.savefig(WS\/\"results\"\/f\"{tag}.png\", dpi=90); plt.close(\"all\")\n        rows.append(row)\n\n    df = pd.DataFrame(rows).reindex(columns=COLS)\n    df.to_csv(REGISTRY, mode=\"a\", header=not REGISTRY.exists(), index=False)\n    out = df.drop(columns=[\"version\",\"note\"]).round(3).dropna(axis=1, how=\"all\")\n    if \"val_sharpe\" in out:\n        out = out.sort_values(\"val_sharpe\", ascending=False, na_position=\"last\")\n    return out.to_csv(index=False)\n\n@tool\ndef read_registry(version: str = \"\") -> str:\n    \"\"\"Every run recorded so far as CSV, accepted and rejected. Pass a version to filter.\"\"\"\n    if not REGISTRY.exists(): return \"empty\"\n    r = pd.read_csv(REGISTRY)\n    if version: r = r[r[\"version\"] == version]\n    return r[[\"version\",\"run\",\"status\",\"params\",\"dev_sharpe\",\"dev_sortino\",\n              \"dev_max_dd\",\"val_sharpe\",\"val_max_dd\",\"error\"]].to_csv(index=False)\n\n@tool\ndef record_decision(version: str, champion: str, rationale: str, params_json: str) -> str:\n    \"\"\"Record the approved outcome of a version. REQUIRED before the next version can be swept.\n\n    version    : the version just reviewed, e.g. \"v2\"\n    champion   : which version is champion after applying the selection rule\n    rationale  : cite the selection rule and the specific numbers that decided it\n    params_json: the champion's parameters as JSON\n    \"\"\"\n    if any(d[\"version\"] == version for d in _decisions()):\n        return f\"error: a decision for {version} already exists and cannot be overwritten.\"\n    rec = {\"version\": version, \"champion\": champion, \"rationale\": rationale,\n           \"params\": json.loads(params_json), \"ts\": time.time()}\n    with DECISIONS.open(\"a\") as f:\n        f.write(json.dumps(rec) + \"n\")\n    return f\"recorded. champion is now {champion}\"\n<\/version><\/code><\/pre>\n<p>\u062a\u0645\u0627\u0645 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 <code>sweep()<\/code> \u062a\u0631\u0642\u06cc \u0627\u0648\u0631 \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0648 \u0627\u0633 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u062a\u0634\u062e\u06cc\u0635\u06cc \u0631\u0627\u0633\u062a\u06d2 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0686\u0644\u0627\u0626\u06cc\u06ba \u062c\u0648 \u0622\u067e \u0646\u06d2 \u0627\u0628\u06be\u06cc \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2\u06d4 \u06c1\u0645 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06cc \u0644\u0627\u06af\u062a \u06a9\u06d2 20bp \u067e\u0631 \u067e\u06cc\u0634\u0631\u0641\u062a \u06a9\u0648 \u0628\u06be\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0646\u0627\u0642\u062f\u06cc\u0646 \u06a9\u0648 \u06cc\u06c1 \u062c\u0627\u0646\u0686\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u0646\u062a\u0627\u0626\u062c \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u0628\u0646\u06cc\u0627\u062f\u06cc 10bp \u0645\u0641\u0631\u0648\u0636\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062d\u0633\u0627\u0633 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u0631\u0646 \u0627\u0634\u0627\u0631\u06d2\u060c \u0627\u06cc\u06a9 JSON \u0646\u062a\u0627\u0626\u062c \u0641\u0627\u0626\u0644\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0627\u062b\u0627\u062b\u06c1 \u0648\u06a9\u0631 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0646\u0627\u06a9\u0627\u0645 \u0631\u0646\u0632 \u062f\u0631\u062c \u06c1\u0648\u062a\u06d2 \u0631\u06c1\u06cc\u06ba \u06af\u06d2\u06d4 <code>registry.csv<\/code> \u062a\u062d\u0642\u06cc\u0642\u06cc \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0633\u06d2 \u063a\u0627\u0626\u0628 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633\u0679\u0631\u06cc\u0679\u062c\u06a9 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0632 \u062e\u0627\u0645\u0648\u0634\u06cc \u0633\u06d2 \u0645\u062a\u0639\u062f\u062f \u0679\u0648\u0679\u06d2 \u06c1\u0648\u0626\u06d2 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06cc \u0645\u0631\u0645\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u0627\u0648\u0631 \u0635\u0631\u0641 \u062d\u062a\u0645\u06cc \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0648\u0633\u0631\u06d2 \u062f\u0648 \u0679\u0648\u0644\u0632 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0622\u0633\u0627\u0646 \u06c1\u06cc\u06ba\u06d4 <code>read_registry()<\/code> \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u0648 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0634\u062f\u06c1 \u0634\u0648\u0627\u06c1\u062f \u06a9\u0627 \u0645\u0639\u0627\u0626\u0646\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u06ba\u061b <code>record_decision()<\/code> \u06c1\u0631 \u0648\u0631\u0698\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0631\u06a9\u0627\u0631\u06cc \u0646\u062a\u0627\u0626\u062c \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0641\u06cc\u0635\u0644\u06c1 \u06c1\u0648 \u062c\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0627\u0633\u06cc \u0648\u0631\u0698\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0679\u0648\u0644 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0627\u0644 \u06a9\u0631 \u06a9\u06d2 \u0627\u0633\u06d2 \u0627\u0648\u0648\u0631 \u0631\u0627\u0626\u0679 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627\u06d4<\/p>\n<h3 id=\"heading-3-fix-the-strategy-selection-rule\">3. \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06d2 \u0642\u0648\u0627\u0639\u062f \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0631\u062c\u0633\u0679\u0631\u06cc \u0622\u067e \u06a9\u0648 \u0628\u062a\u0627\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u06a9\u06cc\u0627 \u06c1\u0648\u0627\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633\u06d2 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u06a9\u06c1 \u0628\u06c1\u062a\u0631\u06cc \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u06cc\u0627 \u0634\u0645\u0627\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u06cc\u06c1 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u06d2 \u0645\u06cc\u0679\u0631\u06a9\u0633 \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u060c \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0627 \u0645\u0639\u06cc\u0627\u0631 \u062e\u0648\u062f \u0627\u0635\u0644\u0627\u062d \u06a9\u0627 \u062d\u0635\u06c1 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0648 \u0622\u0626\u06cc\u06d2 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u0648\u0631\u0698\u0646 \u06a9\u06d2 \u0686\u0644\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u067e\u0631\u0648\u0645\u0648\u0634\u0646 \u06a9\u06d2 \u0627\u0635\u0648\u0644\u0648\u06ba \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">SELECTION_RULE = \"\"\"\n# Version selection rule (fixed before any version was run)\n\nA challenger replaces the incumbent champion only if it passes ALL THREE gates:\n\n1. Validation Sharpe is not worse than the incumbent's\n2. Validation max drawdown is within 2 percentage points of the incumbent's\n3. Development annual turnover is no more than 20% above the incumbent's\n\nTies go to the incumbent. A newer version does not automatically replace an older one.\nA higher development Sharpe is not sufficient and is not one of the gates.\n\"\"\"\n(WS\/\"SELECTION_RULE.md\").write_text(SELECTION_RULE)\n\ndef select_champion(challenger, incumbent, name_c, name_i):\n    if incumbent is None: return name_c, \"no incumbent\"\n    checks = [(\"validation Sharpe not worse\",\n               challenger[\"val_sharpe\"] >= incumbent[\"val_sharpe\"]),\n              (\"validation drawdown within 2pp\",\n               challenger[\"val_max_dd\"] >= incumbent[\"val_max_dd\"] - 0.02),\n              (\"turnover within +20%\",\n               challenger[\"dev_turnover\"] <= incumbent[\"dev_turnover\"] * 1.20)]\n    failed = [n for n, ok in checks if not ok]\n    if failed:\n        return name_i, \"incumbent retained; challenger failed: \" + \"; \".join(failed)\n    return name_c, \"challenger passed all three gates\"\n\ndef best_of(version):\n    reg = pd.read_csv(REGISTRY)\n    rows = reg[(reg.version == version) &#038; (reg.status == \"ok\")]\n    return None if rows.empty else rows.sort_values(\"val_sharpe\", ascending=False).iloc[0]\n\nprint(SELECTION_RULE)\n<\/code><\/pre>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0628 \u0627\u0635\u0648\u0644 \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u06cc \u06af\u0626\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768966_859_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"\u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06d2 \u0642\u0648\u0627\u0646\u06cc\u0646\" style=\"display:block;margin:0 auto\" width=\"1462\" height=\"427\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06d2 \u062f\u0648 \u062f\u0631\u062c\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>best_of()<\/code>    \u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06c1\u0645 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0637\u0627\u0642\u062a\u0648\u0631 \u0627\u0648\u0631 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u062a\u0631\u062a\u06cc\u0628 \u062a\u0644\u0627\u0634 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba. <strong>\u0648\u0631\u0698\u0646 \u06a9\u06d2 \u0627\u0646\u062f\u0631<\/strong> \u062a\u0648\u062b\u06cc\u0642 \u062a\u06cc\u0632 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u062a\u0627\u06c1\u0645\u060c \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u062c\u06be\u0627\u0691\u0648 \u062c\u06cc\u062a\u0646\u0627 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0627\u0633 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u0646\u06cc\u0627 \u0686\u06cc\u0645\u067e\u0626\u0646 \u0646\u06c1\u06cc\u06ba \u0628\u0646\u0627\u062a\u0627\u06d4 <code>select_champion()<\/code> \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u0627\u0646 \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0648\u06ba \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u062a\u06cc\u0646\u0648\u06ba \u062f\u0631\u0648\u0627\u0632\u0648\u06ba \u067e\u0631 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0648\u06ba \u0633\u06d2 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0634\u0627\u0631\u067e \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0627\u0633 \u062f\u0631\u0648\u0627\u0632\u06d2 \u067e\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06cc\u062c\u0646\u0679 \u06cc\u06c1 \u0633\u0645\u062c\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0631\u0642\u06cc\u0627\u062a\u06cc \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u062a\u0648\u0642\u0639 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u06c1\u0648 \u0631\u06c1\u06cc \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0628\u0691\u06d2 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u062a\u0631\u0642\u06cc\u0627\u062a\u06cc \u0628\u06c1\u062a\u0631\u06cc \u06a9\u0645\u0632\u0648\u0631 \u062a\u0648\u062b\u06cc\u0642 \u06a9\u06d2 \u062b\u0628\u0648\u062a \u06a9\u06cc \u062a\u0644\u0627\u0641\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06cc\u06d4<\/p>\n<p>\u06cc\u06c1 \u0641\u0631\u0642 \u0627\u0633 \u0648\u0642\u062a \u0627\u06c1\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u0627\u06cc\u062c\u0646\u0679 \u0627\u067e\u0646\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u0648\u06ba \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u0646\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0631 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062a\u0631\u0642\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0648\u0631\u0698\u0646 \u0628\u06c1\u062a \u0628\u06c1\u062a\u0631 \u0646\u0638\u0631 \u0622 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633\u06d2 \u067e\u06be\u0631 \u0628\u06be\u06cc \u0645\u0633\u062a\u0631\u062f \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-establish-the-manual-baseline\">\u062f\u0633\u062a\u06cc \u0628\u06cc\u0633 \u0644\u0627\u0626\u0646 \u0633\u06cc\u0679 \u0627\u067e<\/h2>\n<p>\u0688\u06cc\u067e \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u0648 \u062a\u062d\u0642\u06cc\u0642\u06cc \u0679\u0648\u0644\u0632 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06c1\u0645 \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u0627\u0633\u06cc \u062a\u0634\u062e\u06cc\u0635\u06cc \u067e\u0631\u062a \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0645\u0639\u0631\u0648\u0641 \u062d\u0648\u0627\u0644\u06c1 \u0646\u0642\u0637\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0688\u06cc\u0679\u0627\u060c \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06cc \u0645\u0646\u0637\u0642\u060c \u0628\u06cc\u06a9 \u0679\u06cc\u0633\u0679\u0646\u06af \u0627\u0646\u062c\u0646\u060c \u0627\u0648\u0631 \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9 \u06a9\u06cc\u0644\u06a9\u0648\u0644\u06cc\u0634\u0646\u0632 \u0633\u0628\u06be\u06cc \u0645\u06cc\u0686 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0628\u06cc\u0633 \u0644\u0627\u0626\u0646 \u0688\u0627\u0644\u0631 \u0648\u0627\u0644\u06cc\u0648\u0645 \u0641\u0644\u0679\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be 126 \u062f\u0646 \u06a9\u06cc \u0627\u06cc\u0688\u062c\u0633\u0679 \u0634\u062f\u06c1 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0631\u0641\u062a\u0627\u0631 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06c1\u0631 \u0645\u06c1\u06cc\u0646\u06d2 \u06a9\u06d2 \u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c ETF \u0635\u0631\u0641 \u0627\u0633 \u0648\u0642\u062a \u0627\u06c1\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u0627\u0633 \u06a9\u06cc \u0631\u0641\u062a\u0627\u0631 \u0645\u062b\u0628\u062a \u06c1\u0648 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u0627 20 \u062f\u0646 \u06a9\u0627 \u0627\u0648\u0633\u0637 \u0688\u0627\u0644\u0631 \u06a9\u0627 \u062d\u062c\u0645 \u0627\u0633 \u06a9\u06cc 120 \u062f\u0646 \u06a9\u06cc \u0627\u0648\u0633\u0637 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06c1\u0648\u06d4 \u06cc\u06c1 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0631\u0641\u062a\u0627\u0631 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u0627\u06c1\u0644 ETFs \u06a9\u06cc \u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0633\u0628 \u0633\u06d2 \u0627\u0648\u067e\u0631 \u062a\u06cc\u0646 ETFs \u06a9\u06d2 \u0628\u0631\u0627\u0628\u0631 \u0648\u0632\u0646 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0627\u06c1\u0644 ETFs \u062f\u0633\u062a\u06cc\u0627\u0628 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u0633 \u0645\u06cc\u06ba \u0646\u0642\u062f \u0631\u0642\u0645 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">def manual_baseline(data, mom_window=126, vol_short=20, vol_long=120,\n                    vol_ratio_min=1.0, top_n=3):\n    adj, cls, vol = data[\"adj_close\"], data[\"close\"], data[\"volume\"]\n    mom = adj.pct_change(mom_window)\n    dv = cls * vol\n    ratio = dv.rolling(vol_short).mean() \/ dv.rolling(vol_long).mean()\n    ok = (mom > 0) & (ratio > vol_ratio_min)\n    dates = pd.DatetimeIndex(adj.index.to_series().resample(\"ME\").last().dropna())\n    w = pd.DataFrame(0.0, index=dates, columns=adj.columns)\n    for d in dates:\n        picks = mom.loc[d][ok.loc[d]].dropna().nlargest(top_n).index\n        if len(picks):\n            w.loc[d, picks] = 1.0 \/ len(picks)\n    return w\n\nd = DATA[\"dev\"]\nbt = backtest(manual_baseline(d), d[\"returns\"])\nev = bt.loc[d[\"eval_start\"]:]\nspy = d[\"returns\"][\"SPY\"].loc[d[\"eval_start\"]:]\nprint(metrics(ev, spy))\n\nfig, ax = plt.subplots(2, 1, figsize=(9, 5), sharex=True, height_ratios=[2, 1])\neq = (1 + ev[\"ret\"]).cumprod()\nax[0].plot(eq, label=\"strategy\"); ax[0].plot((1 + spy).cumprod(), label=\"SPY\")\nax[0].set_yscale(\"log\"); ax[0].legend(); ax[0].set_title(\"Development 2005-2017\")\nax[1].fill_between(eq.index, (eq \/ eq.cummax() - 1), 0, alpha=.4)\nax[1].set_ylabel(\"drawdown\")\nplt.tight_layout()\nplt.show()\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u062a\u0631\u0642\u06cc \u06a9\u06cc \u062f\u0648\u0691 \u0648\u0627\u067e\u0633\u06cc:<\/p>\n<pre><code class=\"language-plaintext\">{'cagr': 0.0549, 'ann_ret': 0.0642, 'vol': 0.1463, 'sharpe': 0.4387, 'sortino': 0.6047, 'max_dd': -0.2606, 'ann_turnover': 11.6605, 'ann_cost': 0.0117, 'avg_cash': 0.2109, 'bench_cagr': 0.0847}\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768966_548_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"\u062f\u0633\u062a\u06cc \u062d\u0648\u0627\u0644\u06c1 \u0627\u062b\u0627\u062b\u06c1 \u0648\u06a9\u0631\" style=\"display:block;margin:0 auto\" width=\"890\" height=\"490\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u062d\u0648\u0627\u0644\u06c1 \u0645\u0631\u06a9\u0628\u0627\u062a \u06c1\u06cc\u06ba: <code>5.49%<\/code> \u06c1\u0631 \u0633\u0627\u0644 \u062a\u0631\u0642\u06cc \u06a9\u06cc \u0645\u062f\u062a \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 <code>0.4387<\/code> \u062a\u06cc\u0632 \u0627\u0648\u0631 \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0645\u06cc <code>-26.06%<\/code>. SPY \u06a9\u0645\u067e\u0627\u0624\u0646\u0688 <code>8.47%<\/code> \u0627\u0633\u06cc \u0645\u062f\u062a \u0645\u06cc\u06ba \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0628\u06c1\u062a\u0631 \u0646\u062a\u0627\u0626\u062c \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u06c1\u0645 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0627\u06cc\u06a9 \u06a9\u0645\u0632\u0648\u0631 \u0631\u06cc\u0648\u0646\u06cc\u0648 \u067e\u0631\u0648\u0641\u0627\u0626\u0644 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639\u0627\u062a \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633\u0679\u0627\u06a9 \u0648\u06a9\u0631 \u06a9\u0686\u06be \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u06a9\u0627 \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0646\u06d2 \u0628\u0691\u06cc \u062d\u062f \u062a\u06a9 2008 \u0645\u06cc\u06ba SPY \u06a9\u06d2 \u062e\u0627\u062a\u0645\u06d2 \u0633\u06d2 \u06af\u0631\u06cc\u0632 \u06a9\u06cc\u0627 \u0627\u0648\u0631 \u0627\u0633 \u0645\u062f\u062a \u06a9\u06d2 \u06a9\u0686\u06be \u062d\u0635\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u06d2 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0641\u0644\u06cc\u0679 \u0631\u06a9\u06be\u0627\u060c \u0644\u06cc\u06a9\u0646 \u0628\u062d\u0627\u0644\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0627\u0633 \u06a9\u0627 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0641\u0627\u0626\u062f\u06c1 \u0686\u06be\u0648\u0691 \u062f\u06cc\u0627\u06d4 \u0644\u06c1\u0670\u0630\u0627\u060c \u06a9\u0645 \u0688\u0631\u0627 \u0688\u0627\u0648\u0646 \u06a9\u06cc \u0634\u0631\u062d \u0628\u0627\u0645\u0639\u0646\u06cc \u0648\u0627\u067e\u0633\u06cc \u06a9\u06cc \u062a\u062c\u0627\u0631\u062a \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u062c\u0627\u0631\u062a\u06cc \u0633\u0631\u06af\u0631\u0645\u06cc \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u06a9\u0645\u0632\u0648\u0631\u06cc \u06c1\u06d2\u06d4 \u0633\u0627\u0644\u0627\u0646\u06c1 \u0641\u0631\u0648\u062e\u062a \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u06af\u0626\u06cc\u06d4 <code>11.6605<\/code>\u0627\u0633 \u06a9\u0627 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u06cc\u0648\u06ba \u062a\u0631\u062c\u0645\u06c1 \u06c1\u0648\u062a\u0627 \u06c1\u06d2: <code>1.17%<\/code> \u0633\u0627\u0644\u0627\u0646\u06c1 \u0644\u06cc\u0646 \u062f\u06cc\u0646 \u06a9\u06d2 \u0627\u062e\u0631\u0627\u062c\u0627\u062a 10 \u0628\u06cc\u0633\u0633 \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be\u06d4 \u06cc\u06c1 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0628\u06be\u06cc <code>21.09%<\/code> \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u0645\u06cc\u06ba \u0627\u0648\u0633\u0637 \u0646\u0642\u062f\u06d4<\/p>\n<p>\u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0646\u062a\u0627\u0626\u062c \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0637\u0627\u0628\u0642\u062a \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba: <code>volume_mom<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9 \u06c1\u06d2 \u062c\u0633 \u06a9\u0627 \u06c1\u0645 \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u062f\u0631\u0633\u062a \u062d\u0633\u0627\u0628 \u0644\u06af\u0627\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u0633\u06d2 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0644\u06a9\u06be\u06cc \u06af\u0626\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0627\u0648\u0631 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u062a\u0634\u062e\u06cc\u0635\u06cc \u0627\u0646\u062c\u0646 \u0645\u0633\u062a\u0642\u0644 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-configure-the-deep-agents-research-team\">\u06af\u06c1\u0631\u06cc \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u06cc \u062a\u062d\u0642\u06cc\u0642\u06cc \u0679\u06cc\u0645 \u06a9\u06cc \u062a\u0634\u06a9\u06cc\u0644<\/h2>\n<p>\u062a\u0639\u06cc\u06cc\u0646\u0627\u062a\u06cc \u062a\u062d\u0642\u06cc\u0642 \u06a9\u06cc \u062a\u06c1\u06c1 \u0627\u0628 \u0645\u06a9\u0645\u0644 \u06c1\u0648 \u0686\u06a9\u06cc \u06c1\u06d2\u06d4 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u0648\u06ba \u06a9\u06cc \u062c\u0627\u0646\u0686 \u0635\u0631\u0641 \u0641\u06a9\u0633\u0688 \u0627\u0646\u062c\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06a9\u06cc \u062c\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u060c \u062a\u0645\u0627\u0645 \u062a\u062c\u0631\u0628\u0627\u062a \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u06cc\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06d2 \u0627\u0635\u0648\u0644 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0686\u06cc\u0644\u0646\u062c\u0631 \u06a9\u0648 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0686\u06cc\u0645\u067e\u0626\u0646 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06cc\u0627 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0627\u0628 \u0622\u067e \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06cc \u067e\u0631\u062a\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u06cc\u06ba \u062a\u062d\u0642\u06cc\u0642\u06cc \u0639\u0645\u0644 \u06a9\u0648 \u062a\u06cc\u0646 \u06a9\u0631\u062f\u0627\u0631\u0648\u06ba \u0645\u06cc\u06ba \u062a\u0642\u0633\u06cc\u0645 \u06a9\u0631\u0648\u06ba \u06af\u0627:<\/p>\n<ul>\n<li>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u0627\u0633\u0679\u0631\u06cc\u0679\u062c\u06a9 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631<\/strong> \u0627\u06cc\u06a9 \u06a9\u0645\u067e\u0646\u06cc \u062c\u0648 \u0622\u0626\u06cc\u0688\u06cc\u0627\u0632 \u06a9\u0648 \u0646\u0627\u0641\u0630 \u0627\u0648\u0631 \u062c\u0627\u0646\u0686\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u062a\u062d\u0642\u06cc\u0642\u06cc \u0646\u0642\u0627\u062f<\/strong> \u0646\u062a\u06cc\u062c\u06d2 \u06a9\u06d2 \u062b\u0628\u0648\u062a \u06a9\u0648 \u0686\u06cc\u0644\u0646\u062c \u06a9\u0631\u0646\u0627<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631<\/strong> \u06cc\u06c1 \u0622\u0631\u0688\u0631 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06d2 \u0642\u0648\u0627\u0639\u062f \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0630\u0645\u06c1 \u062f\u0627\u0631 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0628\u0631\u06cc\u06a9 \u0627\u067e \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u06c1\u0648\u0627 \u062a\u06be\u0627\u06d4 \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u062a\u062c\u0648\u06cc\u0632 \u06a9\u0631\u0646\u06d2\u060c \u0627\u067e\u0646\u06d2 \u06a9\u0627\u0645 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0646\u06d2 \u0627\u0648\u0631 \u067e\u06be\u0631 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u0648\u06c1 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u0641\u0631\u0648\u063a \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-1-set-the-agent-roles-and-boundaries\">1. \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u06a9\u0631\u062f\u0627\u0631 \u0627\u0648\u0631 \u062d\u062f\u0648\u062f \u0637\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0627\u067e\u0646\u06cc \u0679\u06cc\u0645 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062f\u06c1 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">load_dotenv(override=True)\nfrom deepagents import create_deep_agent, FilesystemPermission\nfrom deepagents.backends import FilesystemBackend\nfrom langchain.chat_models import init_chat_model\nfrom langgraph.checkpoint.memory import InMemorySaver\n\nMODEL_ID = \"openai:gpt-5.6-terra\"\nWORKER = init_chat_model(MODEL_ID, reasoning={\"effort\": \"low\"})\nMANAGER = init_chat_model(MODEL_ID, reasoning={\"effort\": \"medium\"})\n<\/code><\/pre>\n<p>\u0686\u0648\u0646\u06a9\u06c1 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0632 \u06a9\u06cc \u0645\u0644\u0627\u0632\u0645\u062a\u06cc\u06ba \u0628\u0646\u06cc\u0627\u062f\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0627\u0646\u06c1\u06cc\u06ba \u06a9\u0645 \u062a\u062e\u0645\u06cc\u0646\u06c1 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628\u0627\u062a \u0645\u0644\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0631\u0627\u0628\u0637\u06c1 \u06a9\u0627\u0631 \u0627\u0648\u0631 \u0646\u0642\u0627\u062f \u0627\u0639\u0644\u06cc\u0670 \u062a\u0631\u062a\u06cc\u0628\u0627\u062a \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0646\u06c1\u06cc\u06ba \u062b\u0628\u0648\u062a\u0648\u06ba \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u0646\u0627\u060c \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0686\u06cc\u0644\u0646\u062c \u06a9\u0631\u0646\u0627\u060c \u0627\u0648\u0631 \u062a\u062d\u0642\u06cc\u0642\u06cc \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u06cc \u0628\u06be\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 \u062f\u0631\u0633\u062a \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06cc\u0633\u06cc \u062f\u06a9\u06be\u062a\u06cc \u06c1\u06d2\u06d4 \u06c1\u0631 \u0648\u0631\u0698\u0646 \u06a9\u0648 \u0627\u0633 \u06a9\u0627 \u0627\u067e\u0646\u0627 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0628\u0646\u0627\u0646\u06d2 \u067e\u0631 \u0645\u062c\u0628\u0648\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u06c1\u0645 \u0648\u06c1\u06cc \u0627\u0633\u0679\u0631\u06cc\u0679\u062c\u06a9 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u06cc \u062a\u0639\u06cc\u06cc\u0646\u0627\u062a\u06cc \u0627\u0646\u062c\u0646 \u062a\u0648\u0642\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">CONTRACT = \"\"\"\nEvery strategy file defines exactly one function:\n\n    def target_weights(data, **params) -> pd.DataFrame\n\n    index   : rebalance dates, all of which must exist in data[\"adj_close\"].index\n    columns : the nine tickers\n    values  : target weights, each row summing to <= 1.0 (remainder is cash)\n\ndata keys: adj_close, close, volume, returns (DataFrames, dates x tickers)\nUse adj_close for momentum and returns. Use close * volume for dollar volume.\nA row dated t is a decision made on t's close; the engine applies it on t+1.\nGuard against empty selections: if nothing qualifies, leave the row at zero.\n\nYour code runs in an isolated subprocess with no network, no credentials and no\nholdout data. Import only pandas and numpy.\n\nWorking skeleton:\n\nimport pandas as pd\ndef target_weights(data, mom_window=126, top_n=3):\n    adj = data[\"adj_close\"]\n    mom = adj.pct_change(mom_window)\n    dates = pd.DatetimeIndex(adj.index.to_series().resample(\"ME\").last().dropna())\n    w = pd.DataFrame(0.0, index=dates, columns=adj.columns)\n    for d in dates:\n        picks = mom.loc[d].dropna().nlargest(top_n).index\n        if len(picks):\n            w.loc[d, picks] = 1.0 \/ len(picks)\n    return w\n\"\"\"\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u062a\u0645\u0627\u0645 \u0646\u0638\u0631\u062b\u0627\u0646\u06cc \u0627\u06cc\u06a9 \u06c1\u06cc \u062a\u0634\u062e\u06cc\u0635\u06cc \u062f\u0631\u062c\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06c1\u0645 \u0622\u06c1\u0646\u06af \u0631\u06c1\u06cc\u06ba\u06d4 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0632 \u06cc\u06c1 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u0632\u0627\u062f \u06c1\u06cc\u06ba \u06a9\u06c1 \u06c1\u062f\u0641 \u06a9\u06d2 \u0648\u0632\u0646 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u0626\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0648\u06c1 \u0627\u0646 \u067e\u0679 \u0688\u06cc\u0679\u0627 \u06a9\u0646\u0679\u0631\u06cc\u06a9\u0679 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06cc\u0627 \u0627\u0646\u062c\u0646 \u06a9\u0648 \u0646\u0638\u0631\u0627\u0646\u062f\u0627\u0632 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u062c\u0648 \u0628\u0627\u0644\u0622\u062e\u0631 \u0627\u0646 \u0648\u0632\u0646\u0648\u06ba \u06a9\u0648 \u0627\u0633\u06a9\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0644\u0627\u060c \u06c1\u0645 \u067e\u0686\u06be\u0644\u06d2 \u062d\u0635\u06d2 \u0633\u06d2 \u062a\u0641\u062a\u06cc\u0634\u06cc \u06a9\u0646\u0679\u0631\u0648\u0644 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0627\u06cc\u062c\u0646\u0679 \u067e\u0631\u0627\u0645\u067e\u0679 \u067e\u0631 \u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">RULES = f\"\"\"\nLayout: \/strategies\/vN.py, \/results\/, \/reviews\/, \/registry.csv, \/decisions.jsonl\n\nStage gates, enforced by the sweep tool:\nvN cannot be swept until v(N-1) has successful runs, a review at \/reviews\/v(N-1).md,\nand a decision recorded via record_decision. There is no way around this.\n\nHard limits: three versions; at most 12 configurations per version; one major\nstructural change per revision. Engine, universe, splits, benchmark and cost\nconvention are fixed. The holdout does not exist for you; never ask for it.\n\n{SELECTION_RULE}\n\nFixed benchmarks, computed before any version was written:\n{BENCH_TEXT}\n\nDo not call ls, glob, grep or read_file unless told a specific file exists and you\nneed its contents.\n\"\"\"\n<\/code><\/pre>\n<p>\u0627\u06c1\u0645 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u0646\u0626\u06d2 \u0627\u0635\u0648\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0648\u06c1\u06cc \u062d\u062f\u0648\u062f \u06a9\u0648 \u0628\u06d2 \u0646\u0642\u0627\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u0632\u06af\u0631 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: \u062a\u06cc\u0646 \u0648\u0631\u0698\u0646\u060c \u0628\u0627\u0624\u0646\u0688\u0688 \u0633\u0631\u0686\u0632\u060c \u0641\u06a9\u0633\u0688 \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9\u0633\u060c \u0641\u06a9\u0633\u0688 \u0644\u0627\u06af\u062a\u060c \u06a9\u0648\u0626\u06cc \u0633\u0679\u06cc\u067e \u06af\u06cc\u0679\u0633\u060c \u0627\u0648\u0631 \u06a9\u0648\u0626\u06cc \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0631\u0633\u0627\u0626\u06cc \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0628 \u0622\u067e \u062f\u0648 \u0645\u0627\u06c1\u0631 \u06a9\u0631\u062f\u0627\u0631 \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<p>\u0627\u0633\u0679\u0631\u06cc\u0679\u062c\u06a9 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631 \u06a9\u0648 \u0627\u0633\u0679\u0631\u06cc\u0679\u062c\u06a9 \u0645\u0639\u0627\u06c1\u062f\u06c1 \u0645\u0644\u062a\u0627 \u06c1\u06d2\u060c <code>sweep()<\/code> \u0633\u0627\u0645\u0627\u0646:<\/p>\n<pre><code class=\"language-python\">engineer = {\n    \"name\": \"strategy-engineer\",\n    \"description\": \"Writes strategy files and sweeps them through the fixed backtester in one batched call. Use for anything that creates code or produces metrics.\",\n    \"system_prompt\": f\"\"\"You implement strategies. You do not decide what to implement.\n{RULES}{CONTRACT}\nProcedure:\n1. Write the strategy file with write_file.\n2. Call sweep ONCE with the entire parameter grid as a JSON list. Never per configuration.\n3. If a run errors, read the message, fix the file, call sweep again. Errors count\n   against the budget.\n4. Report back in under 200 words: filename, the returned table verbatim, and the one\n   configuration you recommend with a one-line reason. Never paste code back.\"\"\",\n    \"tools\": [sweep],\n    \"model\": WORKER,\n}\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u0627 \u0627\u062e\u062a\u06cc\u0627\u0631 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u062a\u0646\u06af \u06c1\u06d2\u06d4 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0632 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u062b\u0628\u0648\u062a \u062a\u06cc\u0627\u0631 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba: <code>sweep()<\/code>\u062a\u0627\u06c1\u0645\u060c \u06cc\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06a9\u06c1 \u0627\u06af\u0644\u0627 \u062a\u062d\u0642\u06cc\u0642\u06cc \u0645\u0641\u0631\u0648\u0636\u06c1 \u06a9\u06cc\u0627 \u06c1\u0648\u06af\u0627 \u06cc\u0627 \u0627\u0633 \u06a9\u06cc \u0627\u067e\u0646\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0686\u06cc\u0645\u067e\u0626\u0646 \u06a9\u06cc \u062c\u06af\u06c1 \u0644\u06d2 \u06af\u06cc\u06d4<\/p>\n<p>\u062a\u062d\u0642\u06cc\u0642\u06cc \u0646\u0642\u0627\u062f \u062f\u0648\u0633\u0631\u06cc \u0637\u0631\u0641 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">critic = {\n    \"name\": \"research-critic\",\n    \"description\": \"Reads a results table and returns exactly one evidence-backed weakness with one proposed structural change. Use after every version is swept.\",\n    \"system_prompt\": f\"\"\"You review results. You never write or edit strategy code.\n{RULES}\nThe results table is given to you in the task description. Do not go looking for it.\nCall read_registry only to compare against an earlier version.\n\nWrite your review to \/reviews\/vN.md under exactly these five headings:\n\nWeakness     one sentence\nEvidence     specific numbers from the table, compared against the fixed benchmarks\nChange       one structural change, not a parameter nudge\nExpected     what it should do to which metric, and why\nOverfit risk how this could be curve-fitting, and what would disconfirm it\n\nA higher Sharpe alone is not evidence. Compare against equal-weight buy-and-hold and\nplain momentum, not just SPY. Check the 20bps column against the 10bps one, whether\nthe dev result survives validation, and whether neighbouring parameters behave\nsimilarly. If dev and val disagree, that disagreement is the finding.\"\"\",\n    \"tools\": [read_registry],\n    \"model\": MANAGER,\n    \"permissions\": [\n        FilesystemPermission(operations=[\"write\"], paths=[\"\/strategies\/**\"], mode=\"deny\"),\n        FilesystemPermission(operations=[\"read\",\"write\"], paths=[\"\/**\"], mode=\"allow\"),\n    ],\n}\n<\/code><\/pre>\n<p>\u0646\u0627\u0642\u062f\u06cc\u0646 \u0635\u0631\u0641 \u06cc\u06c1 \u0646\u06c1\u06cc\u06ba \u067e\u0648\u0686\u06be \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u06a9\u0648\u0626\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \"\u0627\u0686\u06be\u06cc \u0644\u06af \u0631\u06c1\u06cc \u06c1\u06d2\"\u06d4 \u062c\u0627\u0626\u0632\u06d2 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u06a9\u0645\u0632\u0648\u0631\u06cc \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u060c \u062b\u0628\u0648\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0633 \u06a9\u0645\u0632\u0648\u0631\u06cc \u06a9\u06cc \u062a\u0627\u0626\u06cc\u062f \u06a9\u0631\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u060c \u0627\u0648\u0631 \u0632\u06cc\u0627\u062f\u06c1 \u0641\u0679\u0646\u06af \u06a9\u06d2 \u0648\u0627\u0636\u062d \u062e\u0637\u0631\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0633\u0627\u062e\u062a\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u06cc \u062a\u062c\u0648\u06cc\u0632 \u067e\u06cc\u0634 \u06a9\u0631\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u0627\u06c1\u0645 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0639\u0644\u06cc\u062d\u062f\u06af\u06cc \u06a9\u0648 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0646\u0627\u0641\u0630 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0646\u0642\u0627\u062f \u06a9\u0648 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0644\u06a9\u06be\u0646\u06d2 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u0633\u06d2 \u0627\u0646\u06a9\u0627\u0631 \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2: <code>\/strategies\/**<\/code>. \u0622\u067e \u062a\u062d\u0642\u06cc\u0642\u06cc \u0634\u0648\u0627\u06c1\u062f \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u062c\u0627\u0626\u0632\u06d2 \u0644\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0622\u067e \u062e\u0627\u0645\u0648\u0634\u06cc \u0633\u06d2 \u0627\u0646 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u062c\u0646 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-2-create-the-coordinator\">2. \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h3>\n<p>\u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0632 \u0627\u0648\u0631 \u0646\u0627\u0642\u062f\u06cc\u0646 \u06a9\u0648 \u067e\u0648\u0631\u06cc \u0631\u06cc\u0633\u0631\u0686 \u0644\u0648\u067e \u0633\u06d2 \u062c\u0648\u0691\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">COORDINATOR = f\"\"\"You run a quantitative research process and are judged on the honesty\nof the process, not on the returns.\n{RULES}\nYour loop for each version N:\n1. plan with write_todos\n2. delegate implementation and sweeping to strategy-engineer\n3. pass the engineer's table verbatim into the task description for research-critic\n4. apply the selection rule yourself and state which gates passed or failed\n5. call record_decision with the resulting champion and your rationale\n\nStep 5 is mandatory. The next version is blocked until it is done.\n\nReject proposals that are parameter tuning dressed up as structure. The champion does\nnot change just because a newer version exists. Never overwrite an earlier version.\"\"\"\n\nagent = create_deep_agent(\n    model=MANAGER,\n    tools=[sweep, read_registry, record_decision],\n    system_prompt=COORDINATOR,\n    subagents=[engineer, critic],\n    backend=FilesystemBackend(root_dir=str(WS), virtual_mode=True),\n    checkpointer=InMemorySaver(),\n    name=\"coordinator\",\n)\n<\/code><\/pre>\n<p>\u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u0627\u0633 \u0639\u0645\u0644 \u06a9\u0648 \u0645\u0646\u0638\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u067e\u06be\u0631 \u0628\u06be\u06cc \u06c1\u0645 \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0642\u0627\u0626\u0645 \u06a9\u0631 \u062f\u06cc\u06d2 \u06c1\u0648\u0626\u06d2 \u062a\u0639\u06cc\u06cc\u0646\u0627\u062a\u06cc \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u06d2 \u0627\u0648\u067e\u0631 \u0628\u06cc\u0679\u06be\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u0627\u0646\u062c\u06cc\u0646\u0626\u0631 \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u0631\u067e\u0648\u0631\u0679 \u06a9\u0631\u062f\u06c1 \u0634\u0627\u0631\u067e \u0631\u06cc\u0634\u0648\u0632 \u0628\u0646\u0627\u0626\u06d2 \u0628\u063a\u06cc\u0631\u060c \u062a\u062c\u0631\u0628\u0627\u062a\u06cc \u0631\u062c\u0633\u0679\u0631\u06cc\u0648\u06ba \u06a9\u0648 \u0646\u0638\u0631\u0627\u0646\u062f\u0627\u0632 \u06a9\u06cc\u06d2\u060c \u06cc\u0627 \u0633\u062e\u062a \u0648\u0627\u0626\u0631\u0688 \u0642\u0648\u0627\u0646\u06cc\u0646 \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u067e\u0631 \u0639\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2\u06d4<\/p>\n<p>\u0641\u0627\u0626\u0644 \u0633\u0633\u0679\u0645 \u0628\u06cc\u06a9 \u0627\u06cc\u0646\u0688 \u0679\u06cc\u0645\u0648\u06ba \u06a9\u0648 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06cc \u0641\u0627\u0626\u0644\u0648\u06ba\u060c \u0646\u062a\u0627\u0626\u062c\u060c \u062c\u0627\u0626\u0632\u0648\u06ba \u0627\u0648\u0631 \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u062a\u062d\u0642\u06cc\u0642\u06cc \u06a9\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>virtual_mode=True<\/code> \u06c1\u0645 \u0627\u0633 \u06a9\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0648 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0627\u06cc\u062c\u0646\u0679 \u0633\u0627\u0626\u06cc\u0688 \u0631\u0627\u0633\u062a\u0648\u06ba \u0633\u06d2 \u0628\u06d2 \u0646\u0642\u0627\u0628 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba: <code>\/strategies\/v1.py<\/code>\u067e\u0633\u062f\u06cc\u062f \u0627\u0633 \u06a9\u0627 \u0646\u0642\u0634\u06c1 \u0646\u06cc\u0686\u06d2 \u062f\u06cc \u06af\u0626\u06cc \u0627\u0635\u0644 \u062a\u062d\u0642\u06cc\u0642\u06cc \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u0645\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0628\u06be\u06cc \u067e\u0648\u0631\u0627 \u0631\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u06d4 <code>v1 -> v2 -> v3<\/code> \u06c1\u0645 \u0627\u06cc\u06a9 \u0686\u06cc\u06a9 \u067e\u0648\u0627\u0626\u0646\u0679 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0648 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u0645\u062f\u062f\u06af\u0627\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">def run(prompt):\n    out = agent.invoke({\"messages\": [{\"role\":\"user\",\"content\":prompt}]}, THREAD)\n    c = out[\"messages\"][-1].content\n    print(c if isinstance(c, str) else\n          \"n\".join(b.get(\"text\",\"\") for b in c if b.get(\"type\") == \"text\"))\n    return out\n\nprint(\"subagent models:\", engineer[\"model\"].model_name, critic[\"model\"].model_name)\nprint(WORKER.invoke(\"reply with the single word: ok\").content)\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u062d\u062a\u0645\u06cc \u062c\u0627\u0646\u0686 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u0645\u0627\u06c1\u0631 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">subagent models: gpt-5.6-terra gpt-5.6-terra\n[{'type': 'text', 'text': 'ok', 'annotations': [], 'id': 'msg_09ea14bfb753e624006a72189dbf84819eac295e52e7d7ccd0', 'phase': 'final_answer'}]\n<\/code><\/pre>\n<p>\u0627\u0633 \u0648\u0642\u062a\u060c \u062a\u062d\u0642\u06cc\u0642\u06cc \u0679\u06cc\u0645 \u06a9\u06d2 \u067e\u0627\u0633 \u0648\u06c1 \u0633\u0628 \u06a9\u0686\u06be \u06c1\u06d2 \u062c\u0633 \u06a9\u06cc \u0627\u0646\u06c1\u06cc\u06ba \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0632 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u0646\u0627\u0641\u0630 \u0627\u0648\u0631 \u062c\u0627\u0646\u0686 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0646\u0642\u0627\u062f \u06a9\u0648\u0688 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u062b\u0628\u0648\u062a \u06a9\u0648 \u0686\u06cc\u0644\u0646\u062c \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631\u0632 \u06c1\u0631 \u0648\u0631\u0698\u0646 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u0627\u0648\u0631 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0646\u06d2 \u0627\u0648\u0631 \u0628\u0627\u0642\u0627\u0639\u062f\u06c1 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u06c1\u06cc \u0627\u067e\u0646\u06cc \u062a\u062d\u0642\u06cc\u0642 \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-reproduce-the-manual-baseline-as-v1\">\u0645\u06cc\u0646\u0648\u0626\u0644 \u0628\u06cc\u0633 \u0644\u0627\u0626\u0646 v1 \u0645\u06cc\u06ba \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u06cc\u0627\u0631 \u06a9\u06cc \u06af\u0626\u06cc\u06d4<\/h2>\n<p>\u067e\u06c1\u0644\u06d2 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u0686\u06a9\u0631 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0646\u06cc\u0627 \u0627\u0633\u0679\u0631\u06cc\u0679\u062c\u06a9 \u0622\u0626\u06cc\u0688\u06cc\u0627 \u0645\u062a\u0639\u0627\u0631\u0641 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u0686\u0648\u0646\u06a9\u06c1 \u06c1\u0645\u0627\u0631\u06d2 \u067e\u0627\u0633 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1 \u0628\u06cc\u0633 \u0644\u0627\u0626\u0646 \u06c1\u06d2\u060c <code>v1<\/code> \u06cc\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0646\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0634\u062f\u06c1 \u0637\u0631\u06cc\u0642\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0627\u06cc\u062c\u0646\u0679 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u0633 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u067e\u06cc\u0634 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u062a\u062c\u0631\u0628\u0627\u062a \u0686\u0644\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0622\u0632\u0627\u062f \u062a\u0646\u0642\u06cc\u062f\u06cc \u062c\u0627\u0626\u0632\u06d2 \u062d\u0627\u0635\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062d\u0642\u06cc\u0642\u06cc \u0646\u0638\u0631\u062b\u0627\u0646\u06cc \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0641\u06cc\u0635\u0644\u06d2 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u0646\u06cc\u0627\u062f\u06cc \u0645\u0646\u0637\u0642 \u06a9\u0648 \u06a9\u0627\u0645 \u0645\u06cc\u06ba \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0628\u06cc\u0627\u0646 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0648\u0627\u062d\u062f \u062a\u0644\u0627\u0634 \u062a\u06cc\u0646 \u0645\u0648\u0645\u06cc\u0646\u0679\u0645 \u0648\u0646\u0688\u0648\u0632 \u0627\u0648\u0631 \u062a\u06cc\u0646 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u0633\u0627\u0626\u0632\u0632 \u0645\u06cc\u06ba \u0646\u0648 \u067e\u0631\u06cc \u0631\u062c\u0633\u0679\u0631\u0688 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0627 \u0627\u06cc\u06a9 \u06af\u0631\u0688 \u06c1\u06d2\u060c \u062c\u0648 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0632 \u06a9\u0648 \u067e\u06c1\u0644\u06d2 \u0646\u062a\u0627\u0626\u062c \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631 \u06a9\u06cc \u062a\u0644\u0627\u0634 \u06a9\u0648 \u0628\u0691\u06be\u0627\u0646\u06d2 \u0633\u06d2 \u0631\u0648\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">V1_BRIEF = \"\"\"Build Version 1, the baseline.\n\nDelegate to strategy-engineer. \/strategies\/v1.py: 126-day momentum from adjusted close;\n20-day over 120-day average dollar volume from raw close x raw volume; eligible if\nmomentum > 0 and volume ratio > 1.0; rank eligible by momentum, hold top 3 equal weight,\nrebalance monthly, cash otherwise. Parameters: mom_window, vol_short, vol_long,\nvol_ratio_min, top_n.\n\nSweep exactly these nine in one call: mom_window in (63, 126, 189) crossed with\ntop_n in (2, 3, 4), everything else at default.\n\nPass the table to research-critic for a review of v1, telling it to compare against the\nfixed benchmarks. Then apply the selection rule (v1 has no incumbent, so it becomes the\nchampion by default) and call record_decision for v1.\n\nFinally report: the chosen configuration, how it compares to equal-weight buy-and-hold\nand plain momentum, and the critic's proposal with your decision.\"\"\"\n\n_ = run(V1_BRIEF)\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u0645\u06a9\u0645\u0644 \u0627\u06cc\u062c\u0646\u0679 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u0648\u0627\u067e\u0633 \u0622\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-markdown\">## Version 1 baseline completed\n\n**Champion:** v1 (initial version; no incumbent, so selected by default)  \n**Chosen configuration:**\n```json\n{\n  \"mom_window\": 126,\n  \"vol_short\": 20,\n  \"vol_long\": 120,\n  \"vol_ratio_min\": 1.0,\n  \"top_n\": 2\n}\n```\n\nThis was selected because it produced the highest validation Sharpe of the nine predefined configurations: **0.542**.\n\n### Selected-result comparison\n\n| Metric | V1 selected | Equal-weight buy & hold | Plain momentum |\n|---|---:|---:|---:|\n| **Development CAGR** | 0.0550 | 0.0904 | 0.0750 |\n| **Development Sharpe** | 0.4240 | 0.5532 | 0.5363 |\n| **Development max drawdown** | -0.2760 | -0.5203 | -0.2817 |\n| **Development annual turnover** | 11.5890 | 0.0000 | 7.2798 |\n| **Validation CAGR** | 0.1000 | 0.1769 | 0.2051 |\n| **Validation Sharpe** | 0.5420 | 0.8697 | 0.9279 |\n| **Validation max drawdown** | -0.2950 | -0.3371 | -0.2901 |\n\nV1 has lower development drawdown than both benchmarks, but it underperforms equal-weight buy-and-hold and plain momentum on both development and validation CAGR and Sharpe. It also trades substantially more than plain momentum (development turnover **11.589** vs. **7.280**).\n\n### Selection-rule application\n\nV1 has **no incumbent**, so it becomes champion by default.\n\n- Gate 1 \u2014 validation Sharpe: **not applicable**\n- Gate 2 \u2014 validation max drawdown: **not applicable**\n- Gate 3 \u2014 development turnover: **not applicable**\n\nThe decision was recorded with v1 as champion.\n\n### Critic review and decision\n\n**Critic\u2019s evidence-backed weakness:** the always-invested selection strategy did not achieve benchmark-level risk-adjusted performance despite materially higher turnover. The longer 189-day specification had the strongest development result, but that relative advantage did not persist in validation. The 126-day configurations were more consistent, but still remained well below both fixed benchmarks in validation Sharpe.\n\n**Critic\u2019s proposed structural change:** add a **dual-momentum market-regime rule**: hold the existing relative-momentum portfolio only when broad-market absolute momentum is positive, otherwise move to cash.\n\n**Decision:** retain v1 as the baseline champion. The proposal is a valid single structural change\u2014not parameter tuning\u2014and is appropriate to test as the next version, subject to the fixed version-selection gates.\n<\/code><\/pre>\n<p>\u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0632 \u062a\u0645\u0627\u0645 \u0646\u0648 \u0631\u0646\u0632 \u0645\u06a9\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0633\u0628 \u0633\u06d2 \u062b\u0627\u0628\u062a \u0634\u062f\u06c1 Sharpe \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-plaintext\">{\n  \"mom_window\": 126,\n  \"vol_short\": 20,\n  \"vol_long\": 120,\n  \"vol_ratio_min\": 1.0,\n  \"top_n\": 2\n}\n<\/code><\/pre>\n<p>\u0648\u06c1 \u062a\u0635\u062f\u06cc\u0642 \u062a\u06cc\u0632 <code>0.542<\/code>. \u06cc\u06c1 v1 \u0633\u0648\u06cc\u067e \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0633\u0628 \u0633\u06d2 \u0637\u0627\u0642\u062a\u0648\u0631 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0641\u06a9\u0633\u0688 \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9 \"\u0645\u0636\u0628\u0648\u0637 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\" \u06a9\u06d2 \u0633\u0627\u062a\u06be \"\u0627\u0633 \u062a\u0644\u0627\u0634 \u0645\u06cc\u06ba \u0628\u06c1\u062a\u0631\u06cc\u0646\" \u06a9\u0648 \u0627\u0644\u062c\u06be\u0627\u0646\u06d2 \u0633\u06d2 \u06af\u0631\u06cc\u0632 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>V1 \u0627\u0628 \u0628\u06be\u06cc \u062a\u0631\u0642\u06cc \u0627\u0648\u0631 \u062a\u0648\u062b\u06cc\u0642 CAGR \u0627\u0648\u0631 Sharpe \u062f\u0648\u0646\u0648\u06ba \u0645\u06cc\u06ba \u0645\u0633\u0627\u0648\u06cc \u0648\u0632\u0646 \u06a9\u06cc \u062e\u0631\u06cc\u062f \u0627\u0648\u0631 \u06c1\u0648\u0644\u0688 \u0627\u0648\u0631 \u0639\u0645\u0648\u0645\u06cc \u0631\u0641\u062a\u0627\u0631 \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0628\u0627\u0642\u0627\u0639\u062f\u06c1 \u0631\u0641\u062a\u0627\u0631 \u0633\u06d2 \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u062a\u062c\u0627\u0631\u062a \u0628\u06be\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u062a\u0631\u0642\u06cc\u0627\u062a\u06cc \u0646\u0642\u0635\u0627\u0646\u0627\u062a \u06a9\u0645 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0635\u0631\u0641 \u06cc\u06c1 \u0641\u0627\u0626\u062f\u06c1 \u0645\u062c\u0645\u0648\u0639\u06cc \u0646\u062a\u06cc\u062c\u06c1 \u06a9\u0648 \u067e\u0631\u06a9\u0634\u0634 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0686\u0648\u0646\u06a9\u06c1 \u0627\u0628\u06be\u06cc \u062a\u06a9 \u06a9\u0648\u0626\u06cc \u0630\u0645\u06c1 \u062f\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u062a\u06cc\u0646\u0648\u06ba \u067e\u0631\u0648\u0645\u0648\u0634\u0646 \u06af\u06cc\u0679 \u0648\u06cc\u0632 \u0644\u0627\u06af\u0648 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>v1<\/code> \u06cc\u06c1 \u067e\u06c1\u0644\u0627 \u0686\u06cc\u0645\u067e\u06cc\u0626\u0646 \u0628\u0646 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0633\u06d2 \u0628\u0639\u062f \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0648\u0631\u0698\u0646\u0632 \u06a9\u0648 \u06c1\u0631\u0627\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06be\u0631 \u0646\u0642\u0627\u062f \u062c\u06cc\u062a\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0635\u0641 \u0633\u06d2 \u0622\u06af\u06d2 \u0646\u0638\u0631 \u0622\u062a\u0627 \u06c1\u06d2\u06d4 189 \u062f\u0646 \u06a9\u06d2 \u0645\u062e\u062a\u0644\u0641 \u0642\u0633\u0645 \u06a9\u06d2 \u0645\u0636\u0628\u0648\u0637 \u062a\u0631\u0642\u06cc\u0627\u062a\u06cc \u0646\u062a\u0627\u0626\u062c \u062a\u06be\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u062a\u0648\u062b\u06cc\u0642 \u0645\u06cc\u06ba \u0627\u0633 \u06a9\u06d2 \u0641\u0648\u0627\u0626\u062f \u062e\u062a\u0645 \u06c1\u0648 \u06af\u0626\u06d2 \u062a\u06be\u06d2\u06d4 126 \u062f\u0646 \u06a9\u0627 \u0648\u06cc\u0631\u06cc\u0646\u0679 \u0645\u062e\u062a\u0644\u0641 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u0633\u0627\u0626\u0632\u0632 \u0645\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0637\u0627\u0628\u0642\u062a \u0631\u06a9\u06be\u062a\u0627 \u062a\u06be\u0627\u060c \u0644\u06cc\u06a9\u0646 \u0634\u0627\u0631\u067e\u0633 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u0627\u0628 \u0628\u06be\u06cc \u0633\u0627\u062f\u06c1 \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9 \u0633\u06d2 \u0628\u06c1\u062a \u0646\u06cc\u0686\u06d2 \u062a\u06be\u06cc\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0645\u062e\u062a\u0644\u0641 \u0631\u0641\u062a\u0627\u0631 \u0648\u0646\u0688\u0648 \u062a\u062c\u0648\u06cc\u0632 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2: <code>top_n<\/code> \u0642\u062f\u0631 \u06a9\u06d2 \u0646\u0627\u0642\u062f\u06cc\u0646 \u0633\u0627\u062e\u062a\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u0645\u0634\u0648\u0631\u06c1 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u0639\u0646\u06cc\u060c \u0627\u06cc\u06a9 \u0648\u0633\u06cc\u0639 \u0645\u0627\u0631\u06a9\u06cc\u0679 \u0645\u0637\u0644\u0642 \u0645\u0648\u0645\u06cc\u0646\u0679\u0645 \u0641\u0644\u0679\u0631 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u0627\u06d4 \u0631\u0648\u0627\u06cc\u062a\u06cc \u06cc\u06a9 \u0637\u0631\u0641\u06c1 \u0645\u0648\u0645\u06cc\u0646\u0679\u0645 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u0627\u0633 \u0648\u0642\u062a \u0641\u0639\u0627\u0644 \u0631\u06c1\u062a\u0627 \u06c1\u06d2 \u062c\u0628 SPY \u06a9\u06cc \u0631\u0641\u062a\u0627\u0631 \u0645\u062b\u0628\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u062c\u0628 \u0645\u0627\u0631\u06a9\u06cc\u0679 \u06a9\u06d2 \u0646\u0638\u0627\u0645 \u0645\u0646\u0641\u06cc \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0646\u0642\u062f \u0631\u0642\u0645 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u06c1\u0645 \u0622\u06af\u06d2 \u0628\u0691\u06be\u06cc\u06ba\u060c \u06c1\u0645 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u067e\u0648\u0631\u06d2 v1 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u0646\u06d2 \u062f\u0631\u062d\u0642\u06cc\u0642\u062a \u0627\u0633\u0679\u06cc\u062c \u06af\u06cc\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u06a9\u0627\u0631 \u062a\u06cc\u0646 \u0646\u0645\u0648\u0646\u06d2 \u067e\u06cc\u0686\u06be\u06d2 \u0686\u06be\u0648\u0691 \u062f\u06cc\u06d2 \u06c1\u06cc\u06ba: \u0627\u06cc\u06a9 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u062a\u062c\u0631\u0628\u06c1\u060c \u0627\u06cc\u06a9 \u062a\u0646\u0642\u06cc\u062f\u06cc \u062c\u0627\u0626\u0632\u06c1\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0634\u062f\u06c1 \u0641\u06cc\u0635\u0644\u06c1\u06d4<\/p>\n<pre><code class=\"language-plaintext\">print(pd.read_csv(REGISTRY).groupby([\"version\",\"status\"]).size())\nprint(\"decisions:\", [d[\"version\"] for d in _decisions()])\nassert (WS\/\"reviews\"\/\"v1.md\").exists(), \"v1 review missing\"\nassert any(d[\"version\"] == \"v1\" for d in _decisions()), \"v1 decision missing\"\nprint(\"v1 cycle complete\")\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768966_876_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"V1 \u062a\u0635\u062f\u06cc\u0642\" style=\"display:block;margin:0 auto\" width=\"515\" height=\"220\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u067e\u06c1\u0644\u0627 \u0645\u0631\u062d\u0644\u06c1 \u0645\u06a9\u0645\u0644 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 <code>v1<\/code> \u0644\u06c1\u0630\u0627 \u0627\u0628 \u0622\u067e \u0645\u0648\u062c\u0648\u062f\u06c1 \u0686\u06cc\u0645\u067e\u0626\u0646 \u06c1\u06cc\u06ba\u060c \u0646\u0627\u0642\u062f\u06cc\u0646 \u0646\u06d2 \u06a9\u0686\u06be \u06a9\u0645\u0632\u0648\u0631\u06cc\u0648\u06ba \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06af\u0644\u06d2 \u0648\u0631\u0698\u0646 \u0645\u06cc\u06ba \u062c\u0627\u0646\u0686\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0648\u0627\u0636\u062d \u0633\u0627\u062e\u062a\u06cc \u0645\u0641\u0631\u0648\u0636\u06c1 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-let-the-agents-revise-the-strategy\">\u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u0648 \u0627\u067e\u0646\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u0688\u062c\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u062f\u06cc\u06ba\u06d4<\/h2>\n<p>\u06a9\u06d2 \u0633\u0627\u062a\u06be <code>v1<\/code> \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u067e\u0631\u0627\u0626\u0645\u0631\u06cc \u0686\u06cc\u0645\u067e\u0626\u0646 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0642\u0627\u0626\u0645 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0631\u06cc\u0633\u0631\u0686 \u0644\u0648\u067e \u0622\u062e\u0631 \u06a9\u0627\u0631 \u062a\u0648\u0644\u06cc\u062f \u0633\u06d2 \u0622\u06af\u06d2 \u0628\u0691\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u0645\u0642\u0627\u0645 \u0633\u06d2\u060c \u062a\u0645\u0627\u0645 \u0646\u0626\u06d2 \u0648\u0631\u0698\u0646 \u067e\u0686\u06be\u0644\u06d2 \u062a\u0646\u0642\u06cc\u062f\u06cc \u062c\u0627\u0626\u0632\u0648\u06ba \u0645\u06cc\u06ba \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u06cc \u06af\u0626\u06cc \u06a9\u0645\u0632\u0648\u0631\u06cc\u0648\u06ba \u0633\u06d2 \u0622\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0686\u06cc\u0644\u0646\u062c \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0635\u0631\u0641 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0648\u0631\u0698\u0646\u0632 \u06a9\u06cc \u062c\u06af\u06c1 \u0644\u06d2 \u0644\u06cc\u06ba \u06af\u06d2 \u0627\u06af\u0631 \u0648\u06c1 \u062a\u06cc\u0646\u0648\u06ba \u0641\u06a9\u0633\u0688 \u0633\u0644\u06cc\u06a9\u0634\u0646 \u06af\u06cc\u0679\u0633 \u06a9\u0648 \u067e\u0627\u0633 \u06a9\u0631 \u0644\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-test-the-market-regime-filter-in-v2\">v2 \u0645\u06cc\u06ba \u0645\u0627\u0631\u06a9\u06cc\u0679 \u0631\u062c\u06cc\u0645 \u0641\u0644\u0679\u0631\u0632 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u0627<\/h3>\n<p>v1 \u0646\u0627\u0642\u062f\u06cc\u0646 \u0646\u06d2 \u0627\u06cc\u06a9 \u0633\u0627\u062e\u062a\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u0627 \u0645\u0634\u0648\u0631\u06c1 \u062f\u06cc\u0627: \u062f\u0648\u0633\u0631\u06d2 \u0644\u0641\u0638\u0648\u06ba \u0645\u06cc\u06ba\u060c \u0627\u067e\u0646\u06cc \u0645\u0648\u062c\u0648\u062f\u06c1 \u06cc\u06a9 \u0637\u0631\u0641\u06c1 \u0631\u0641\u062a\u0627\u0631 \u06a9\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u062c\u0628 \u0628\u06be\u06cc SPY \u06a9\u06cc \u0645\u0637\u0644\u0642 \u0631\u0641\u062a\u0627\u0631 \u0645\u062b\u0628\u062a \u0646\u06c1 \u06c1\u0648 \u062a\u0648 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u06a9\u0648 \u0646\u0642\u062f \u0631\u0642\u0645 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631 \u062a\u0644\u0627\u0634 \u06a9\u0648 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u06be\u0648\u0644\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u06c1\u0645 \u0627\u067e\u0646\u06cc \u0645\u0648\u062c\u0648\u062f\u06c1 v1 \u0686\u06cc\u0645\u067e\u0626\u0646 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0633 \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4 \u06cc\u06c1 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631 \u0679\u06cc\u0648\u0646\u0646\u06af \u06a9\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u062f\u0648\u0631 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0631\u062c\u06cc\u0645 \u0641\u0644\u0679\u0631 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u067e\u06c1\u0644\u0627 v2 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">V2_BRIEF = \"\"\"Review the critic's v1 proposal in \/reviews\/v1.md. If you approve it, have\nstrategy-engineer implement it as \/strategies\/v2.py. Do not modify v1.py.\nSweep at most 12 configurations in one call. Pass the table to research-critic for a\nreview written to \/reviews\/v2.md. Then apply the selection rule between v2 and the\ncurrent champion, state which of the three gates passed and which failed, and call\nrecord_decision for v2. Do not proceed past that.\"\"\"\n\n_ = run(V2_BRIEF)\n<\/code><\/pre>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u0679\u06cc\u0645 \u06a9\u06cc \u0648\u0627\u067e\u0633\u06cc:<\/p>\n<pre><code class=\"language-markdown\">Approved the v1 critic proposal as a single structural change: a dual-momentum regime filter that moves the portfolio to cash when SPY\u2019s adjusted-close momentum over the existing `mom_window` is non-positive.\n\n- Implemented as `\/strategies\/v2.py`\n- `\/strategies\/v1.py` was not modified.\n- Swept one configuration using the current v1 champion parameters:\n\n```json\n{\n  \"mom_window\": 126,\n  \"vol_short\": 20,\n  \"vol_long\": 120,\n  \"vol_ratio_min\": 1.0,\n  \"top_n\": 2\n}\n```\n\n### V2 result\n\n| Metric | V1 champion | V2 |\n|---|---:|---:|\n| Development Sharpe | 0.424 | 0.611 |\n| Development max drawdown | -0.276 | -0.190 |\n| Development turnover | 11.589 | 9.814 |\n| Validation Sharpe | 0.542 | 0.321 |\n| Validation max drawdown | -0.295 | -0.295 |\n\nThe critic review was written to `\/reviews\/v2.md`.\n\n### Selection rule: v2 vs. v1\n\n1. **Validation Sharpe \u2014 failed**  \n   V2: **0.321** vs. V1: **0.542**.\n\n2. **Validation maximum drawdown \u2014 passed**  \n   V2: **-0.295** vs. V1: **-0.295**; difference is 0.0 percentage points, within the 2-point limit.\n\n3. **Development annual turnover \u2014 passed**  \n   V2: **9.814** vs. V1: **11.589**; V2 is below V1 and below the allowed 20%-higher limit of **13.907**.\n\nBecause v2 failed the validation-Sharpe gate, it does **not** replace the incumbent. The decision was recorded: **v1 remains champion**.\n<\/code><\/pre>\n<p>\u067e\u06c1\u0644\u06cc \u0646\u0638\u0631 \u0645\u06cc\u06ba\u060c v2 \u0627\u06cc\u06a9 \u0628\u06c1\u062a \u0628\u0691\u06cc \u0628\u06c1\u062a\u0631\u06cc \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u062a\u0631\u0642\u06cc \u062a\u06cc\u0632 \u0686\u06be\u0644\u0627\u0646\u06af \u0633\u06d2: <code>0.4235<\/code> \u06a9\u0648 <code>0.6110<\/code>\u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0645\u06cc \u06c1\u06d2\u06d4 <code>-27.57%<\/code> \u06a9\u0648 <code>-18.99%<\/code>\u0633\u0627\u0644\u0627\u0646\u06c1 \u0641\u0631\u0648\u062e\u062a <code>11.5888<\/code> \u06a9\u0648 <code>9.8139<\/code>.<\/p>\n<p>\u0635\u0631\u0641 \u062a\u0631\u0642\u06cc \u06a9\u06cc \u0645\u062f\u062a \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u062a\u0648 \u0627\u06cc\u0633\u0627 \u0644\u06af\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 Regime Filter \u0646\u06d2 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u06a9\u0626\u06cc \u0645\u0633\u0627\u0626\u0644 \u062d\u0644 \u06a9\u06cc\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062a\u0635\u062f\u06cc\u0642 \u0627\u06cc\u06a9 \u0628\u06c1\u062a \u0645\u062e\u062a\u0644\u0641 \u06a9\u06c1\u0627\u0646\u06cc \u0628\u062a\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0633\u06d2 \u062a\u06cc\u0632 \u06af\u0631\u062a\u0627 \u06c1\u06d2: <code>0.5424<\/code> v1 \u06a9\u06d2 \u0644\u06cc\u06d2 <code>0.3207<\/code> v2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0645\u06cc \u0639\u0645\u0644\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0648\u0626\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0644\u06c1\u0630\u0627\u060c \u062a\u0631\u0642\u06cc \u0645\u06cc\u06ba \u0628\u06c1\u062a\u0631\u06cc \u062f\u0631\u062d\u0642\u06cc\u0642\u062a \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u0646\u06c1\u06cc\u06ba \u0631\u06c1\u062a\u06cc \u062c\u0648 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u0646\u0627 \u06c1\u06d2 \u06cc\u0627 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06d2 \u0642\u0648\u0627\u0646\u06cc\u0646 \u06a9\u0627\u0645 \u0622\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 V2 \u0688\u06cc\u06a9\u0644\u0627\u0626\u0646 \u06af\u06cc\u0679 \u0627\u0648\u0631 \u0631\u06cc\u0648\u0646\u06cc\u0648 \u06af\u06cc\u0679 \u06a9\u0648 \u0622\u0633\u0627\u0646\u06cc \u0633\u06d2 \u067e\u0627\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u067e\u06c1\u0644\u06cc \u0636\u0631\u0648\u0631\u062a \u0645\u06cc\u06ba \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0635\u062f\u06cc\u0642 \u0634\u0627\u0631\u067e \u0642\u0627\u0626\u0645 \u06a9\u0645\u067e\u0646\u06cc\u0648\u06ba \u0633\u06d2 \u0628\u062f\u062a\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u0648 \u0633\u06a9\u062a\u0627.<\/p>\n<p><strong>\u0644\u06c1\u0630\u0627 \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0636\u0628\u0648\u0637 \u062a\u0631\u0642\u06cc\u0627\u062a\u06cc \u0646\u062a\u0627\u0626\u062c \u06a9\u06d2 \u0628\u0627\u0648\u062c\u0648\u062f\u060c v1 \u0627\u0628 \u0628\u06be\u06cc \u0686\u06cc\u0645\u067e\u0626\u0646 \u06c1\u06d2\u06d4<\/strong><\/p>\n<p>\u0646\u0627\u0642\u062f\u06cc\u0646 \u06a9\u0648 \u062b\u0628\u0648\u062a \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u06a9\u0645\u0632\u0648\u0631\u06cc \u0628\u06be\u06cc \u0645\u0644\u06cc\u06d4 V2 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u06af\u06cc\u0627\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0628\u0691\u06d2 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u062a\u0631\u0642\u06cc \u06a9\u06cc \u0628\u06c1\u062a\u0631\u06cc \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0645\u0644\u062d\u0642\u06c1 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631 \u0633\u067e\u0648\u0631\u0679 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062d\u06a9\u0648\u0645\u062a\u06cc \u0642\u0648\u0627\u0646\u06cc\u0646 \u06a9\u0648 \u062e\u0648\u062f \u06a9\u0648 \u0627\u06cc\u0688\u062c\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0646\u0627\u0642\u062f\u06cc\u0646 \u0646\u06d2 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0633\u0627\u062e\u062a\u06cc \u0627\u0635\u0644\u0627\u062d\u0627\u062a \u06a9\u06cc \u062a\u062c\u0648\u06cc\u0632 \u067e\u06cc\u0634 \u06a9\u06cc\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0628\u0627\u0626\u0646\u0631\u06cc \u0688\u0627\u0644\u0631 \u06a9\u06d2 \u062d\u062c\u0645 \u06a9\u06d2 \u0627\u06c1\u0644\u06cc\u062a \u06a9\u06d2 \u0641\u0644\u0679\u0631 \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u0645\u0648\u0645\u06cc\u0646\u0679\u0645 \u0627\u062b\u0627\u062b\u0648\u06ba \u0645\u06cc\u06ba \u0627\u062a\u0627\u0631 \u0686\u0691\u06be\u0627\u0624 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u0688\u062c\u0633\u0679 \u0634\u062f\u06c1 \u0648\u0632\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627\u06d4<\/p>\n<p>\u06c1\u0645 \u0627\u0633 \u062e\u06cc\u0627\u0644 \u06a9\u0648 \u062c\u0627\u0646\u0686\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06af\u06d2 \u06a9\u06c1 \u062a\u0645\u0627\u0645 v2 \u062a\u062c\u0631\u0628\u0627\u062a\u060c \u062c\u0627\u0626\u0632\u06d2 \u0627\u0648\u0631 \u0641\u06cc\u0635\u0644\u06d2 \u0628\u0631\u0642\u0631\u0627\u0631 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">print(pd.read_csv(REGISTRY).groupby([\"version\",\"status\"]).size())\nprint(\"decisions:\", [d[\"version\"] for d in _decisions()])\nassert (WS\/\"reviews\"\/\"v2.md\").exists(), \"v2 review missing\"\nassert any(d[\"version\"] == \"v2\" for d in _decisions()), \"v2 decision missing\"\nprint(\"v2 cycle complete\")\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768966_365_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"V2 \u062a\u0635\u062f\u06cc\u0642\" style=\"display:block;margin:0 auto\" width=\"500\" height=\"230\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0644\u06c1\u0630\u0627\u060c V2 \u0628\u063a\u06cc\u0631 \u067e\u0631\u0648\u0645\u0648\u0634\u0646 \u06a9\u06d2 \u0628\u06be\u06cc \u0645\u0641\u06cc\u062f \u062b\u0628\u0648\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-run-the-final-revision-in-v3\">v3 \u0645\u06cc\u06ba \u062d\u062a\u0645\u06cc \u0646\u0638\u0631\u062b\u0627\u0646\u06cc \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/h3>\n<p>v2 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0646\u06d2 \u0648\u0627\u0644\u0648\u06ba \u06a9\u06cc \u062a\u062c\u0627\u0648\u06cc\u0632 \u062d\u062a\u0645\u06cc \u0646\u0638\u0631\u062b\u0627\u0646\u06cc \u0628\u0646 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 V3 v2 \u0645\u06cc\u06ba \u0645\u062a\u0639\u0627\u0631\u0641 \u06a9\u0631\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u0648\u0633\u06cc\u0639 \u0645\u0627\u0631\u06a9\u06cc\u0679 \u0631\u062c\u06cc\u0645 \u0641\u0644\u0679\u0631\u0632 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0628\u0627\u0626\u0646\u0631\u06cc \u0688\u0627\u0644\u0631 \u06a9\u06d2 \u062d\u062c\u0645 \u06a9\u06cc \u0627\u06c1\u0644\u06cc\u062a \u06a9\u06d2 \u0627\u0635\u0648\u0644\u0648\u06ba \u06a9\u0648 \u06c1\u0679\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0645\u0648\u0645\u06cc\u0646\u0679\u0645 \u0627\u062b\u0627\u062b\u0648\u06ba \u06a9\u0648 \u0627\u0646 \u06a9\u06cc \u062d\u0627\u0644 \u06c1\u06cc \u0645\u06cc\u06ba \u0645\u062d\u0633\u0648\u0633 \u06a9\u06cc \u06af\u0626\u06cc \u0627\u062a\u0627\u0631 \u0686\u0691\u06be\u0627\u0624 \u06a9\u06d2 \u0627\u0644\u0679\u0627 \u0645\u062a\u0646\u0627\u0633\u0628 \u0648\u0632\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0628\u0627\u0631\u060c \u0627\u0646\u062c\u06cc\u0646\u0626\u0631 \u062a\u06cc\u0646 \u0645\u0644\u062d\u0642\u06c1 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u0633\u0627\u0626\u0632 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>top_n<\/code> \u067e\u0631 \u0633\u06cc\u0679 \u06a9\u0631\u06cc\u06ba <code>2<\/code>\u060c <code>3<\/code>\u0627\u0648\u0631 <code>4<\/code>. \u062d\u062a\u0645\u06cc \u062a\u0646\u0642\u06cc\u062f\u06cc \u062c\u0627\u0626\u0632\u06c1 \u0627\u0648\u0631 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06d2 \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06a9\u0648 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u0646 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u0645\u0646\u062c\u0645\u062f \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u062c\u0648 \u0627\u0628 \u0628\u06be\u06cc \u0686\u06cc\u0645\u067e\u0626\u0646\u0632 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u06c1\u0644 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">V3_BRIEF = \"\"\"Implement the final approved revision as \/strategies\/v3.py. Do not modify\nv1 or v2. Sweep at most 12 configurations in one call, get a critic review at\n\/reviews\/v3.md, apply the selection rule, and call record_decision for v3.\n\nThen write \/strategies\/frozen.json containing exactly:\n{\"version\": \"<champion version=\"\">\", \"params\": {...}, \"rationale\": \"...\"}\nwhere the version is whichever the selection rule says is champion, which may be v1 or\nv2 rather than v3. After writing that file, stop.\"\"\"\n\n_ = run(V3_BRIEF)\n\ndisplay(Markdown(\"### Decision log\"))\nfor dd_ in _decisions():\n    print(f\"{dd_['version']} -> champion {dd_['champion']}: {dd_['rationale'][:160]}\")\nprint(\"nfrozen:\", (WS\/\"strategies\"\/\"frozen.json\").read_text())\n<\/champion><\/code><\/pre>\n<p>\u0645\u06a9\u0645\u0644 \u0622\u0624\u0679 \u067e\u0679 \u06c1\u06d2:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768966_384_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"V3 \u0646\u062a\u0627\u0626\u062c\" style=\"display:block;margin:0 auto\" width=\"1352\" height=\"730\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0633\u0628 \u0633\u06d2 \u0637\u0627\u0642\u062a\u0648\u0631 v3 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06c1\u06d2\u06d4 <code>top_n=3<\/code> \u0634\u0627\u0631\u067e \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06c1\u0648 \u0686\u06a9\u06cc \u06c1\u06d2\u06d4 <code>0.5377<\/code>. v1 \u0633\u06d2 \u0628\u06c1\u062a \u0645\u0644\u062a\u0627 \u062c\u0644\u062a\u0627 \u06c1\u06d2\u06d4 <code>0.5424<\/code>. V3 \u0628\u06be\u06cc <code>-0.2954<\/code> \u06a9\u0648 <code>-0.2884<\/code> \u062a\u0631\u0642\u06cc \u06a9\u06cc \u0641\u0631\u0648\u062e\u062a \u0645\u06cc\u06ba \u06a9\u0645\u06cc \u0622\u0626\u06cc\u06d4 <code>11.5888<\/code> \u06a9\u0648 <code>7.0480<\/code>.<\/p>\n<p>\u062a\u0648 \u062a\u06cc\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u062f\u0648 \u062f\u0631\u0648\u0627\u0632\u06d2 \u0627\u0646\u062f\u0631 \u0633\u06d2 \u06af\u0632\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0634\u0627\u0631\u067e \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u0645\u06cc\u06ba \u0628\u0627\u0642\u06cc \u0641\u0631\u0642 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06c1\u06cc\u06ba: <code>0.0047<\/code>\u06cc\u06c1 \u067e\u0648\u0631\u06d2 \u062a\u062c\u0631\u0628\u06d2 \u06a9\u06d2 \u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u0641\u06cc\u0635\u0644\u0648\u06ba \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062f\u0639\u0648\u06cc \u06a9\u0631\u0646\u0627 \u0622\u0633\u0627\u0646 \u06c1\u0648\u06af\u0627 \u06a9\u06c1 \u0646\u0645\u0628\u0631\u0632 \u0645\u0624\u062b\u0631 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 v3 \u06a9\u0648 \u0641\u0631\u0648\u063a \u062f\u06cc\u06ba \u06af\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633 \u0645\u06cc\u06ba \u0628\u06c1\u062a\u0631 \u062a\u0648\u062c\u06c1 \u0627\u0648\u0631 \u0679\u0631\u0646 \u0627\u0648\u0648\u0631 \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u06cc\u06a9\u0646 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u0646\u0627 \u0627\u0648\u0631 \u0645\u0639\u06cc\u0627\u0631\u0627\u062a \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627\u06d4<\/p>\n<p>v3 \u06a9\u06d2 \u0648\u062c\u0648\u062f \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633 \u0627\u0635\u0648\u0644 \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u06cc \u06af\u0626\u06cc \u062a\u06be\u06cc\u060c \u0627\u0648\u0631 \u06c1\u0645\u06cc\u06ba \u06cc\u06c1 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0646\u0627 \u06c1\u0648\u06af\u0627 \u06a9\u06c1 Sharpe \u067e\u0631\u0627\u0646\u06d2 \u0627\u0635\u0648\u0644 \u0633\u06d2 \u0628\u062f\u062a\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 V3 \u0622\u0633\u0627\u0646\u06cc \u0633\u06d2 \u0627\u0633 \u0636\u0631\u0648\u0631\u062a \u06a9\u0648 \u06cc\u0627\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u0644\u06c1\u0630\u0627\u060c V1 \u062d\u062a\u0645\u06cc \u0686\u06cc\u0645\u067e\u0626\u0646 \u0631\u06c1\u062a\u0627 \u06c1\u06d2\u06d4<\/strong><\/p>\n<p>\u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u062f\u0631\u062c \u0630\u06cc\u0644 \u062c\u06af\u06c1 \u067e\u0631 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>frozen.json<\/code>\u0628\u0627\u0644\u06a9\u0644 \u0627\u06cc\u0633\u06d2 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u06d2 \u062c\u0648 \u067e\u0648\u0631\u06d2 \u0627\u0633\u0679\u0688\u06cc \u0644\u0648\u067e \u0645\u06cc\u06ba \u0645\u062d\u0641\u0648\u0638 \u0631\u06c1\u06d2\u06d4 \u0627\u0633 \u0648\u0642\u062a \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0627 \u0645\u0631\u062d\u0644\u06c1 \u062e\u062a\u0645 \u06c1\u0648 \u0686\u06a9\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u0622\u0646\u06d2 \u0648\u0627\u0644\u0627 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0648\u0631\u0698\u0646 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0648\u0631\u0698\u0646 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u0627\u06d4<\/p>\n<h2 id=\"heading-freeze-the-champion-and-unlock-the-holdout\">\u0686\u06cc\u0645\u067e\u0626\u0646\u0632 \u06a9\u0648 \u0645\u0646\u062c\u0645\u062f \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u06c1\u0648\u0644 \u0622\u0624\u0679 \u06a9\u0648 \u063a\u06cc\u0631 \u0645\u0642\u0641\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0631\u06cc\u0633\u0631\u0686 \u0644\u0648\u067e \u0645\u06a9\u0645\u0644 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0627\u0628\u06be\u06cc \u062a\u06a9 \u0633\u0627\u0645\u0646\u06d2 \u0646\u06c1\u06cc\u06ba \u0622\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0644\u0627\u0646\u0686 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06c1\u0645 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06af\u06d2 \u06a9\u06c1 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u062a\u06cc\u0646\u0648\u06ba \u0686\u06a9\u0631 \u0645\u06a9\u0645\u0644 \u06c1\u0648 \u0686\u06a9\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0622\u06cc\u0627 \u0686\u06cc\u0645\u067e\u0626\u0646\u0632 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0645\u0646\u062c\u0645\u062f \u06c1\u0648 \u0686\u06a9\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u062a\u0648\u062b\u06cc\u0642 \u0645\u0631\u06a9\u0632\u06cc \u062a\u062d\u0642\u06cc\u0642\u06cc \u0639\u0645\u0644 \u06a9\u06cc \u0627\u06cc\u062c\u0646\u0679 \u067e\u0631\u062a \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0641\u0631\u0642 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0627\u06cc\u062c\u0646\u0679 \u062e\u0648\u062f \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06a9\u0628 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u06a9\u0648 \u0628\u06d2 \u0646\u0642\u0627\u0628 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u062d\u062f\u0648\u062f \u0627\u0631\u062f \u06af\u0631\u062f \u06a9\u06d2 \u0646\u0638\u0627\u0645 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u0631\u0648\u06cc\u06d2 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">frozen = json.loads((WS\/\"strategies\"\/\"frozen.json\").read_text())\nprint(\"frozen:\", frozen)\nassert len(_decisions()) == 3, f\"expected 3 decisions, found {len(_decisions())}\"\nfor v in [\"v1\",\"v2\",\"v3\"]:\n    assert (WS\/\"reviews\"\/f\"{v}.md\").exists(), f\"missing review for {v}\"\n    assert not pd.read_csv(REGISTRY).query(f\"version=='{v}' and status=='ok'\").empty, f\"no runs for {v}\"\nprint(\"all three cycles complete\")\n\nfor field in [\"adj_close\",\"close\",\"volume\"]:\n    DATA[\"holdout\"][field].to_parquet(WS\/\"data\"\/f\"holdout_{field}.parquet\")\n\nfinal = {}\nfor split in [\"dev\",\"val\",\"holdout\"]:\n    res = run_isolated(WS\/\"strategies\"\/f\"{frozen['version']}.py\", frozen[\"params\"], split)\n    assert res[\"ok\"], res[\"error\"]\n    final[split] = res[\"metrics\"]\n    plt.plot(pd.Series(res[\"equity\"], index=pd.to_datetime(res[\"dates\"])), label=split)\nplt.yscale(\"log\"); plt.legend(); plt.title(f\"frozen {frozen['version']} across all periods\"); plt.show()\n\n(WS\/\"results\"\/\"holdout.json\").write_text(json.dumps(final, indent=2))\nBENCH_HOLD = benchmark_table(\"holdout\")\ncomparison = pd.concat([pd.DataFrame(final).T.assign(source=\"strategy\"),\n                        BENCH_HOLD.assign(source=\"benchmark_holdout\")])\ncomparison[[\"cagr\",\"sharpe\",\"sortino\",\"max_dd\",\"ann_turnover\",\"source\"]]\n<\/code><\/pre>\n<p>\u0686\u06cc\u06a9 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u0633\u06cc \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba\u06d4 <code>v1<\/code> \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u062f\u06c1 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0627\u0628\u06be\u06cc \u0628\u06be\u06cc \u0637\u06d2 \u0634\u062f\u06c1 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-plaintext\">frozen: {\n    'version': 'v1',\n    'params': {\n        'mom_window': 126,\n        'vol_short': 20,\n        'vol_long': 120,\n        'vol_ratio_min': 1.0,\n        'top_n': 2\n    },\n    'rationale': \"V1 remains champion after v3 failed the required validation-Sharpe gate (0.538 versus v1's 0.542), although v3 passed the validation-drawdown and development-turnover gates.\"\n}\nall three cycles complete\n<\/code><\/pre>\n<p>\u0627\u0646 \u0686\u06cc\u06a9\u0633 \u06a9\u06d2 \u067e\u0627\u0633 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u06c1\u06cc \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0688\u06cc\u0679\u0627 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u06cc\u06ba \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u0646\u062c\u0645\u062f \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768966_83_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"V1 \u062a\u0645\u0627\u0645 \u0627\u062f\u0648\u0627\u0631 \u0645\u06cc\u06ba \u062c\u0645 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4\" style=\"display:block;margin:0 auto\" width=\"574\" height=\"434\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u062d\u0635\u0635 \u06a9\u0627 \u062e\u0627\u06a9\u06c1 \u062a\u0631\u0642\u06cc\u060c \u062a\u0648\u062b\u06cc\u0642\u060c \u0627\u0648\u0631 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u0637\u06d2 \u0634\u062f\u06c1 v1 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0631 \u067e\u06cc\u0631\u06cc\u0688 \u06a9\u0627 \u0627\u0644\u06af \u0633\u06d2 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u062a\u06cc\u0646 \u0644\u0627\u0626\u0646\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u0633\u0644\u0633\u0644 \u062c\u0627\u0645\u0639 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0646\u06c1\u06cc\u06ba \u067e\u0691\u06be\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u06cc\u06c1\u0627\u06ba \u0627\u06c1\u0645 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u062a\u06cc\u0646\u0648\u06ba \u0627\u062f\u0648\u0627\u0631 \u0645\u06cc\u06ba \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06cc \u0645\u0646\u0637\u0642 \u0627\u0648\u0631 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u0646\u06c1\u06cc\u06ba \u0622\u0626\u06cc\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u062d\u062a\u0645\u06cc \u0645\u0648\u0627\u0632\u0646\u06c1 \u06c1\u06d2:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768966_985_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"\u062d\u062a\u0645\u06cc \u0646\u062a\u0627\u0626\u062c \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4\" style=\"display:block;margin:0 auto\" width=\"1387\" height=\"566\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0627\u06cc\u06a9 \u067e\u0648\u0634\u06cc\u062f\u06c1 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u067e\u0631 \u0645\u0646\u062c\u0645\u062f <code>v1<\/code> \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 <code>13.98%<\/code> \u0633\u06cc \u0627\u06d2 \u062c\u06cc \u0622\u0631 \u0627\u0648\u0631 <code>0.7962<\/code> \u062a\u06cc\u0632 \u062f\u0648\u0646\u0648\u06ba \u0627\u0633\u06cc \u0645\u062f\u062a \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 SPY \u0628\u0627\u0626\u06d2 \u0627\u06cc\u0646\u0688 \u06c1\u0648\u0644\u0688\u060c \u0627\u06cc\u06a9\u0648\u06cc\u0644 \u0648\u06cc\u0679 \u0628\u0627\u0626\u06cc \u0627\u06cc\u0646\u0688 \u06c1\u0648\u0644\u0688\u060c \u062c\u0646\u0631\u0644 \u0645\u0648\u0645\u0646\u0679\u0645 \u0627\u0648\u0631 \u0648\u0627\u0644\u06cc\u0648\u0645 \u0645\u0648\u0645\u06cc\u0646\u0679\u0645 \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0645\u06cc \u06c1\u06d2\u06d4 <code>-23.04%<\/code> \u0627\u06af\u0631\u0686\u06c1 SPY \u0627\u0648\u0631 \u0631\u06cc\u06af\u0648\u0644\u0631 \u0645\u0648\u0645\u06cc\u0646\u0679\u0645 \u0633\u06d2 \u0642\u062f\u0631\u06d2 \u0686\u06be\u0648\u0679\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0645\u0633\u0627\u0648\u06cc \u0648\u0632\u0646 \u062e\u0631\u06cc\u062f\u0646\u0627 \u0627\u0648\u0631 \u06c1\u0648\u0644\u0688 \u06a9\u0631\u0646\u0627 \u0627\u0628 \u0628\u06be\u06cc \u0645\u0646\u0641\u06cc \u067e\u06c1\u0644\u0648 \u0633\u06d2 \u0628\u06c1\u062a\u0631 \u06c1\u06d2\u06d4 <code>-18.23%<\/code>.<\/p>\n<p>\u06cc\u06c1 \u0627\u06cc\u06a9 \u0633\u0627\u0632\u06af\u0627\u0631 \u0646\u062a\u06cc\u062c\u06c1 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633 \u0633\u06d2 \u0648\u06c1 \u062a\u0628\u062f\u06cc\u0644\u06cc \u0646\u06c1\u06cc\u06ba \u0622\u062a\u06cc \u062c\u0648 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0633\u06cc\u06a9\u06be\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u06d4 V1 \u0645\u06cc\u06ba \u0627\u0628 \u0628\u06be\u06cc \u0627\u06cc\u06a9 \u0633\u0627\u062f\u06c1 \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9 \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba \u0628\u06c1\u062a \u06a9\u0645\u0632\u0648\u0631 \u0634\u0627\u0631\u067e \u062a\u0648\u062b\u06cc\u0642 \u062a\u06be\u06cc\u060c \u0627\u0648\u0631 \u0627\u0633 \u0637\u0631\u062d \u06a9\u06d2 \u0646\u0645\u0628\u0631\u0648\u06ba \u06a9\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633\u06d2 \u0645\u0646\u062c\u0645\u062f \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u06d4<\/p>\n<p>\u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u0627\u06cc\u06a9 \u067e\u0648\u0634\u06cc\u062f\u06c1 \u062c\u0627\u0626\u0632\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u062f\u0648\u0633\u0631\u0627 \u0645\u0648\u0642\u0639 \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0633 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-audit-the-complete-research-trail\">\u0645\u06a9\u0645\u0644 \u0645\u0637\u0627\u0644\u0639\u06c1 \u0633\u06d2 \u0628\u0627\u062e\u0628\u0631 \u0631\u06c1\u0646\u06d2 \u06a9\u0627 \u0622\u0688\u0679<\/h2>\n<p>\u062a\u062c\u0631\u0628\u06c1 \u062e\u062a\u0645 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u062d\u062a\u0645\u06cc \u06a9\u0627\u0645 \u062f\u06cc\u06ba\u06d4 \u062e\u06cc\u0627\u0644 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0633\u0628 \u06a9\u0686\u06be \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0645\u0646\u062c\u0645\u062f \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u067e\u0648\u0631\u06d2 \u0679\u0631\u06cc\u0633 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0648\u0642\u062a \u0646\u062a\u0627\u0626\u062c \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2\u06d4 \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u0642\u0631\u0631\u06c1 \u062a\u0631\u062a\u06cc\u0628\u060c \u062a\u06cc\u0646\u0648\u06ba \u0627\u062f\u0648\u0627\u0631 \u0633\u06d2 \u0645\u06cc\u0679\u0631\u06a9\u0633\u060c \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9\u0633\u060c \u062a\u062c\u0631\u0628\u06c1 \u06a9\u06cc \u0631\u062c\u0633\u0679\u0631\u06cc\u060c \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u06cc \u062a\u0627\u0631\u06cc\u062e\u060c \u0627\u0648\u0631 \u062a\u0646\u0642\u06cc\u062f\u06cc \u062c\u0627\u0626\u0632\u06d2 \u0645\u0648\u0635\u0648\u0644 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u06cc\u06ba \u0622\u067e \u06a9\u0648 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0628\u062a\u0627\u062a\u0627 \u06c1\u0648\u06ba \u06a9\u06c1 \u0646\u062a\u0627\u0626\u062c \u06a9\u0627 \u062f\u0641\u0627\u0639 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">REPORT_BRIEF = f\"\"\"The holdout has been run once and the strategy is frozen. Nothing can change now.\n\nFrozen: {json.dumps(frozen)}\nMetrics by period: {json.dumps(final)}\nHoldout benchmarks: {BENCH_HOLD[COLS_B].to_json()}\n\nCall read_registry once with no argument, read \/decisions.jsonl and every file in\n\/reviews\/, then write \/report.md covering:\n\n1. What changed at each version and what evidence drove it\n2. How the selection rule decided each champion, including gates that failed\n3. Whether the revisions improved the research case, separately from returns\n4. How the frozen strategy compares to SPY buy-and-hold, equal-weight buy-and-hold,\n   and plain momentum on the holdout\n5. Whether the volume filter earned its turnover\n6. Where you made weak decisions, accepted thin evidence, or got lucky\n\nCite run numbers from the registry. Do not defend the result.\"\"\"\n\n_ = run(REPORT_BRIEF)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1786768966_606_\u0644\u06cc\u0646\u06af-\u0686\u06cc\u0646-\u0688\u06cc\u067e-\u0627\u06cc\u062c\u0646\u0679\u0633-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0645\u0644\u0679\u06cc-\u0627\u06cc\u062c\u0646\u0679.png\" alt=\"\u062c\u0648\u0627\u0628\u06cc \u0631\u067e\u0648\u0631\u0679\" style=\"display:block;margin:0 auto\" width=\"1762\" height=\"198\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0622\u0626\u06cc\u06d2 \u0627\u0633 \u0631\u067e\u0648\u0631\u0679 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u062a\u062c\u0631\u0628\u06c1 \u0631\u062c\u0633\u0679\u0631\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u067e\u06cc\u0634 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u062a\u0645\u0627\u0645 \u0648\u0631\u0698\u0646\u0632 \u0645\u06cc\u06ba \u0627\u0628 \u0628\u06be\u06cc \u0627\u0646 \u06a9\u06d2 \u0631\u0646\u0632\u060c \u0641\u06cc\u0635\u0644\u06d2 \u0627\u0648\u0631 \u062a\u0646\u0642\u06cc\u062f\u06cc \u062c\u0627\u0626\u0632\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">display(Markdown(\"## Agent report\"))\ndisplay(Markdown((WS \/ \"report.md\").read_text(encoding=\"utf-8\")))\n\ndisplay(Markdown(\"## Experiment registry\"))\nreg = pd.read_csv(REGISTRY)\ndisplay(reg[[\"version\",\"run\",\"status\",\"params\",\"dev_sharpe\",\"dev_sortino\",\n             \"dev_max_dd\",\"dev_turnover\",\"val_sharpe\",\"val_max_dd\",\"dev_cagr_20bps\"]])\nprint(\"versions with runs:\", sorted(reg[\"version\"].unique()))\nprint(\"decisions recorded:\", [d[\"version\"] for d in _decisions()])\nprint(\"reviews on disk:  \", sorted(p.stem for p in (WS\/\"reviews\").glob(\"*.md\")))\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u0622\u0688\u0679 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0627\u0631\u0622\u0645\u062f \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u06a9\u0627 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0645\u0637\u0627\u0644\u0639\u06c1 \u06a9\u06cc\u0633\u06d2 \u06a9\u06cc\u0627 \u06af\u06cc\u0627\u06d4<\/p>\n<p>\u062a\u06cc\u0646 \u0648\u0627\u0636\u062d \u06a9\u0645\u0632\u0648\u0631\u06cc\u0627\u06ba \u0633\u0627\u0645\u0646\u06d2 \u0622\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0686\u0648\u0646\u06a9\u06c1 V2 \u0646\u06d2 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u0627\u06c1\u0645 \u0631\u062c\u06cc\u0645 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u06a9\u06cc\u0627\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u062a\u0631\u0642\u06cc \u0645\u06cc\u06ba \u0628\u06c1\u062a\u0631\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a \u06a9\u0645 \u0645\u0636\u0628\u0648\u0637\u06cc \u06a9\u06d2 \u062b\u0628\u0648\u062a \u0645\u0648\u062c\u0648\u062f \u062a\u06be\u06d2\u06d4 V3 \u0646\u06d2 \u067e\u06be\u0631 \u062d\u0642\u06cc\u0642\u06cc \u0686\u06cc\u0645\u067e\u0626\u0646 v1 \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba \u0628\u06c1\u062a \u0633\u06d2 \u0627\u062e\u062a\u0644\u0627\u0641\u0627\u062a \u062c\u0645\u0639 \u06a9\u06cc\u06d2\u060c \u062c\u0633 \u0633\u06d2 \u0631\u0648\u06cc\u06d2 \u06a9\u06cc \u0648\u062c\u06c1 \u06a9\u0648 \u0627\u0644\u06af \u06a9\u0631\u0646\u0627 \u0645\u0634\u06a9\u0644 \u06c1\u0648 \u06af\u06cc\u0627\u06d4<\/p>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u0627\u06c1\u0645 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0622\u0688\u0679 \u0646\u0642\u0627\u062f \u06a9\u06cc \u0627\u067e\u0646\u06cc \u063a\u0644\u0637\u06cc\u0648\u06ba \u0633\u06d2 \u067e\u0631\u062f\u06c1 \u0627\u0679\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 v3 \u062c\u0627\u0626\u0632\u06c1 \u0628\u0627\u0626\u0646\u0631\u06cc \u0648\u0627\u0644\u06cc\u0648\u0645 \u0631\u06cc\u0634\u0648 \u0641\u0644\u0679\u0631 \u06a9\u0648 \u0627\u062a\u0627\u0631 \u0686\u0691\u06be\u0627\u0624 \u06a9\u06cc \u067e\u06cc\u0645\u0627\u0626\u0634 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0633\u0641\u0627\u0631\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062d\u0627\u0644\u0627\u0646\u06a9\u06c1 v3 \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0627\u0633 \u0641\u0644\u0679\u0631 \u06a9\u0648 \u06c1\u0679\u0627 \u062f\u06cc\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0644\u0679\u0627 \u0627\u062a\u0627\u0631 \u0686\u0691\u06be\u0627\u0624 \u06a9\u06d2 \u0648\u0632\u0646 \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631\u0686\u06c1 \u0648\u0636\u0627\u062d\u062a \u0645\u0639\u0642\u0648\u0644 \u0644\u06af \u0631\u06c1\u06cc \u062a\u06be\u06cc\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633 \u0646\u06d2 \u0632\u06cc\u0631 \u063a\u0648\u0631 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u062f\u0631\u0633\u062a \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0628\u06cc\u0627\u0646 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627\u06d4<\/p>\n<p>\u0634\u0627\u06cc\u062f \u06cc\u06c1 \u0633\u0628 \u0633\u06d2 \u0637\u0627\u0642\u062a\u0648\u0631 \u0633\u0628\u0642 \u06c1\u06d2 \u062c\u0648 \u0645\u06cc\u06ba \u0646\u06d2 \u0634\u06a9\u0631 \u06af\u0632\u0627\u0631\u06cc \u0633\u06d2 \u0633\u06cc\u06a9\u06be\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u0648 \u06a9\u0631\u062f\u0627\u0631 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u0627\u0644\u06af \u06a9\u0631\u0646\u0627 \u0645\u0641\u06cc\u062f \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0636\u0645\u0627\u0646\u062a \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u062a\u0627 \u06a9\u06c1 \u0648\u06c1 \u0627\u06cc\u062c\u0646\u0679 \u0627\u0633 \u0646\u0645\u0648\u0646\u06d2 \u06a9\u0648 \u0633\u0645\u062c\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0633 \u06a9\u0627 \u0648\u06c1 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06d2 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u06d2 \u06a9\u0648\u0688\u0632\u060c \u062a\u062c\u0631\u0628\u0627\u062a\u06cc \u0631\u062c\u0633\u0679\u0631\u06cc\u0648\u06ba\u060c \u062c\u0627\u0626\u0632\u0648\u06ba \u0627\u0648\u0631 \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u0646\u0627 \u0627\u06cc\u06a9 \u0622\u0632\u0627\u062f \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u06a9\u06d2 \u062e\u0644\u0627\u0641 \u0642\u06cc\u0627\u0633 \u0622\u0631\u0627\u0626\u06cc\u0648\u06ba \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06cc \u062c\u0627 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-conclusion\">\u0646\u062a\u06cc\u062c\u06c1<\/h2>\n<p>\u062a\u0639\u0645\u06cc\u0631 \u0622\u062e\u0631 \u06a9\u0627\u0631 \u062e\u062a\u0645 \u06c1\u0648 \u06af\u0626\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0646\u06d2 \u062e\u0627\u0645 \u0633\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u06cc\u0627\u06d4 <strong>EODHD \u0645\u0627\u0631\u06a9\u06cc\u0679 \u0688\u06cc\u0679\u0627<\/strong> \u06c1\u0645 \u0646\u06d2 \u0645\u0642\u0631\u0631\u06c1 \u0688\u06cc\u0679\u0627 \u0628\u0627\u0624\u0646\u0688\u0631\u06cc\u0632\u060c \u0688\u06cc\u0679\u0631\u0645\u0646\u0633\u0679\u06a9 \u0628\u06cc\u06a9\u0679\u06cc\u0633\u0679\u0631\u0632\u060c \u0628\u06cc\u0646\u0686 \u0645\u0627\u0631\u06a9\u0633\u060c \u062a\u062c\u0631\u0628\u0627\u062a\u06cc \u0679\u0631\u06cc\u06a9\u0646\u06af\u060c \u062a\u06cc\u0646 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u06a9\u0631\u062f\u0627\u0631\u060c \u062a\u06cc\u0646 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0648\u0631\u0698\u0646\u060c \u0641\u06a9\u0633\u0688 \u0686\u06cc\u0645\u067e\u0626\u0646\u0632\u060c \u0627\u06cc\u06a9 \u06c1\u0648\u0644\u0688 \u0622\u0624\u0679 \u0679\u06cc\u0633\u0679\u060c \u0627\u0648\u0631 \u062c\u0648 \u06a9\u0686\u06be \u0628\u06be\u06cc \u06c1\u0648\u0627 \u0627\u0633 \u06a9\u0627 \u062d\u062a\u0645\u06cc \u0622\u0688\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0634\u062f\u06c1 \u0645\u0644\u0679\u06cc \u0627\u06cc\u062c\u0646\u0679 \u0631\u06cc\u0633\u0631\u0686 \u0633\u0633\u0679\u0645 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u062e\u062a\u062a\u0627\u0645 \u06a9\u06cc\u0627\u06d4<\/p>\n<p>\u0627\u0648\u0631 \u0633\u0641\u0631 \u0627\u062a\u0646\u0627 \u0635\u0627\u0641 \u0633\u062a\u06be\u0631\u0627 \u0646\u06c1\u06cc\u06ba \u062a\u06be\u0627 \u062c\u062a\u0646\u0627 \"AI \u0646\u06d2 \u0627\u067e\u0646\u06cc \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u0628\u06c1\u062a\u0631 \u06a9\u0631\u0646\u0627 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u0627\u06d4\" V2 \u062a\u0631\u0642\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0628\u06c1\u062a \u0628\u06c1\u062a\u0631 \u0646\u0638\u0631 \u0622\u06cc\u0627 \u0644\u06cc\u06a9\u0646 \u062a\u0648\u062b\u06cc\u0642 \u0645\u06cc\u06ba \u0646\u0627\u06a9\u0627\u0645 \u0631\u06c1\u0627\u06d4 V3 \u0686\u06be\u0648\u0679 \u06af\u06cc\u0627 v1\u06d4 <code>0.0047<\/code> \u062a\u06cc\u0632 \u0646\u0627\u0642\u062f\u06cc\u0646 \u0646\u06d2 \u0627\u0633 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u0628\u06be\u06cc \u063a\u0644\u0637 \u0633\u0645\u062c\u06be\u0627 \u062c\u0633 \u06a9\u0627 \u0648\u06c1 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06d2 \u0631\u06c1\u06d2 \u062a\u06be\u06d2\u06d4<\/p>\n<p>\u0639\u062c\u06cc\u0628 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0648\u06c1 \u06af\u0646\u062f\u0627 \u062d\u0635\u06c1 \u062a\u06be\u0627 \u062c\u0633 \u0646\u06d2 \u062a\u062c\u0631\u0628\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0628\u0646\u0627 \u062f\u06cc\u0627\u06d4 \u0627\u0646\u06c1\u0648\u06ba \u0646\u06d2 \u0628\u0627\u0644\u06a9\u0644 \u0638\u0627\u06c1\u0631 \u06a9\u06cc\u0627 \u06a9\u06c1 \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u067e\u0631 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u06cc\u0648\u06ba \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0636\u0628\u0648\u0637 \u0645\u0636\u0628\u0648\u0637\u06cc \u06a9\u06cc \u062c\u0627\u0646\u0686 \u0627\u0648\u0631 \u06a9\u0644\u06cc\u0646 \u0633\u0646\u06af\u0644 \u0686\u06cc\u0646\u062c \u067e\u0631\u0627\u067e\u0631\u0679\u06cc\u0632 \u0633\u06d2 \u0644\u06d2 \u06a9\u0631 \u0622\u0632\u0627\u062f \u0646\u0627\u0642\u062f\u06cc\u0646 \u0627\u0648\u0631 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631 \u06a9\u06d2 \u0627\u0633\u062a\u062d\u06a9\u0627\u0645 \u06a9\u06d2 \u0679\u06cc\u0633\u0679 \u062a\u06a9 \u0628\u06c1\u062a\u0631\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0628\u06be\u06cc \u0628\u06be\u06cc \u06a9\u0627\u0641\u06cc \u06af\u0646\u062c\u0627\u0626\u0634 \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u06cc\u06a9\u0646 \u0628\u0627\u062a \u0633\u0627\u062f\u06c1 \u06c1\u06d2\u06d4 \u0627\u06cc\u062c\u0646\u0679 \u062a\u062d\u0642\u06cc\u0642\u06cc \u062e\u06cc\u0627\u0644\u0627\u062a \u067e\u06cc\u062f\u0627 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u0686\u06cc\u0644\u0646\u062c \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0648\u0627\u0642\u0639\u06cc \u0645\u0641\u06cc\u062f \u062b\u0627\u0628\u062a \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0646\u06c1\u06cc\u06ba \u0627\u0646 \u0634\u0648\u0627\u06c1\u062f \u067e\u0631 \u0642\u0627\u0628\u0648 \u0646\u06c1\u06cc\u06ba \u0631\u06a9\u06be\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u062c\u0648 \u06cc\u06c1 \u0637\u06d2 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u062e\u06cc\u0627\u0644 \u0632\u0646\u062f\u06c1 \u0631\u06c1\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u062a\u062c\u0627\u0631\u062a\u06cc \u062a\u062d\u0642\u06cc\u0642\u06cc \u0627\u06cc\u062c\u0646\u0679 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648\u0688 \u0644\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0628\u06cc\u06a9 \u0679\u06cc\u0633\u0679 \u0686\u0644\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0646\u062a\u0627\u0626\u062c \u06a9\u0627 \u0645\u0639\u0627\u0626\u0646\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u0646\u0627 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0634\u06a9\u0644 \u0645\u0633\u0626\u0644\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0646\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0644\u0648\u067e \u06a9\u0633\u06cc \u067e\u0631\u06a9\u0634\u0634 \u0628\u06cc\u06a9 \u0679\u06cc\u0633\u0679 \u06a9\u06cc \u0628\u06d2 \u0642\u0627\u0628\u0648 \u062a\u0644\u0627\u0634 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1 \u06c1\u0648\u06d4 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":27731,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-27730","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/27730","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=27730"}],"version-history":[{"count":1,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/27730\/revisions"}],"predecessor-version":[{"id":27732,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/27730\/revisions\/27732"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media\/27731"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=27730"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=27730"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=27730"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}