پیچیدگی محاسبه امتیاز نماد براساس فرمول‌های جدید پابلیشر

در حال حاضر به دلیل مشکلات performance، همه‌ی فرمول‌های امتیاز نماد از روی یک فرمول امتیاز پابلیشر خاص محاسبه می‌شود. یعنی اگر بخواهیم به ازای هر فرمول امتیاز نماد، از فرمول امتیاز پابلیشر مختص به آن استفاده کنیم، پیچیدگی و زمان اجرای کد به شدت افزایش می‌یابد.

در ابتدا برای تست فرمول‌های جدید امتیاز پابلیشر و میزان ارزش آن‌ها، به شکل دستی بخشی از کد را ویرایش می‌کنم که بتوان برای تنها یک فرمول جدید، امتیاز نماد را از روی فرمول‌های جدید پابلیشر محاسبه کرد.
در آینده باید ساختار کد را به طور کل ویرایش کنیم.

فعلا یکبار تسک جدید رو اجرا کردم. (با استفاده از فرمول پایه نماد و فرمول تریدر sharpe ratio) نتیجه رو اینجا میتونید ببینید.
https://metabase.sahmeto.com/question/484-asset-high-precision-custom-score-with-new-formula

یک کلاس با عنوان AssetScoreUpdaterV2 ساخته شد. فرمول‌هایی که در این مدل استفاده میشه، باید به فرمت پایتون باشن.
برای اجرا باید یکی از دو متد update_for_datetime یا update_for_date کال بشه. در حاضر حاضر دو مدل برای ذخیره‌ی تاریخچه داریم که یکی برحسب تاریخ-زمان و اون یکی برحسب تاریخ هست. در هر دو صورت مدل اصلی، یعنی AssetCustomScore آپدیت میشه.
در هر دو مورد اگر update_all False و تاریخ مربوط به امروز باشه، تنها امتیاز مربوط به assetهایی که در دو ساعت اخیر سیگنال خرید یا فروش داشتن، آپدیت میشه.
در حال حاضر به شکل پیشفرض برای محاسبه امتیاز asset از سیگنال‌های ۷ روز استفاده میشه. (asset_score_calculation_range=7) در مدل قبلی، در صورتی که فقط تاریخ به مدل updater داده میشد، فقط سیگنال‌هایی که قبل از اون تاریخ بودن، در محاسبه‌ی امتیاز لحاظ میشد. برای مثال اگر امروز نهم باشه، فقط سیگنال‌های مربوط به سوم تا هشتم در نظر گرفته میشد. در مدل جدید این مشکل رو رفع کردیم که مشابه حالتی که از datetime استفاده میشه، سیگنال‌های همون روز هم در نظر گرفته بشه.

به تسک‌های task_update_asset_scores.py و task_update_high_precision_asset_scores.py پارامتری با عنوان updater_version اضافه شده که مشخص میکنه با مدل قدیم آپدیت انجام بشه یا مدل جدید.
همچنین قبلا برای آپدیت تاریخچه، از قدیم به جدید آپدیت ترندها انجام میشد. این مورد رو برعکس کردم که مشابه بقیه‌ی تسک‌ها، آپدیت ترندها از جدید به قدیم باشه.

در محاسبه‌ی امتیاز asset، به ازای هرکدام از سیگنال‌ها یک دیکشنری از اطلاعاتش ساخته میشه که به تابع eval داده میشه. در حال حاضر در فرمول‌هایی که داریم، تنها به ۷ مورد از اطلاعات سیگنال نیاز پیدا میکنیم. بنابراین فعلا فقط این موارد رو به دیکشنری اضافه کردم.
signal_value, forget_factor, is_unique, signal_timeout_duration, publisher_rank_on_signal_date, market_cap, publisher_score_on_current_date
اما معماری به صورتی است که اگر به هرکدام از اطلاعاتی که در مدل قدیم وارد اکسل میشد، نیاز پیدا کردیم، بتونیم به دیکشنری اضافه کنیم. (با توجه به بار محاسباتی، publisher_trend رو از محاسبات حذف کردم. در صورت نیاز، مشابه publisher_score_trends میشه اون رو اضافه کرد.)
همچنین در محاسبات قبلی، publisher_rank از خود مدل publisher (یا ترندش) خونده میشد که میدونیم مشکل داره. در مدل جدید، مشابه امتیاز تریدر، از مدل publisherscore و ترندش خونده میشه.

سرعت اجرای ورژن جدید تسک update asset score از سرعت اجرای تسک آپدیت cross_relative بیشتر بود و باعث میشد هنگام ساخته شدن تاریخچه، صف اجرای تسک‌ها پر شود.
برای حل این مشکل، به تسک task_update_asset_cross_relative_score.py یک ورودی با عنوان formula_version اضافه شد. (به مدل CrossRelativeScoreUpdater نیز همین پارامتر اضافه شد) در صورتی که این مقدار None باشد مشابه قبل، به ازای همه‌ی فرمول‌ها آپدیت می‌شود.

همچنین اسم متغیر updater_version که در تسک‌های task_update_asset_scores.py و task_update_high_precision_asset_scores.py وجود داشت، به formula_version تغییر کرد.