بیاموزید که چگونه با یک خط کد پایتون گزارش های عملکرد جامع تولید کنید!
این سومین بخش از مجموعه مقالات در مورد بک تست استراتژی های معاملاتی در پایتون است. مطالب قبلی موضوعات زیر را شرح دادند:
- معرفی فریم ورک زیپ لاین و ارائه نحوه تست استراتژی های پایه (لینک)
- وارد کردن داده های سفارشی برای استفاده با زیپ لاین (لینک)
این بار، هدف مقاله نشان دادن چگونگی ارزیابی سریع و کارآمد عملکرد استراتژیهایمان با استفاده از کتابخانهای به نام pyfolio (توسعهیافته توسط Quantopian، سازندگان zipline) است. pyfolio را می توان به عنوان یک کتابخانه مستقل استفاده کرد و نتایج عملکرد را تنها بر اساس یک سری بازگشت ارائه شده ارائه کرد. با این حال، با زیپ لاین کارآمد است و من این ترکیب را در این مقاله ارائه می کنم.
استراتژی میانگین متحرک ساده
در این مقاله، من فقط یک استراتژی اساسی را نشان می دهم، زیرا تمرکز اصلی بر ارزیابی عملکرد است. برای این منظور، استراتژی را بر اساس میانگین متحرک ساده (SMA) انتخاب کردم. منطق استراتژی را می توان در موارد زیر خلاصه کرد:
- وقتی قیمت از SMA 20 روزه به سمت بالا عبور کرد - 20 سهم بخرید
- هنگامی که قیمت از SMA 20 روزه به سمت پایین عبور کرد - همه سهام را بفروشید
- ما در هر زمان می توانیم حداکثر 20 سهم داشته باشیم
- هیچ کوتاه فروشی در استراتژی وجود ندارد
من با استفاده از سهام IBM طی سالهای 2016-2017، یک آزمون بکآست از استراتژی را اجرا کردم. برای جزئیات در مورد چگونگی ایجاد چنین استراتژی و آنچه که اجزای خاص واقعاً انجام می دهند، لطفاً به مقاله قبلی من مراجعه کنید.
من با بارگیری کتابخانه های مورد نیاز شروع می کنم:
سپس، استراتژی را اجرا می کنم:
zipline به طور خودکار یک DataFrame عملکردی ایجاد می کند که می توانید آن را در خروجی کد نیز مشاهده کنید. برای راحتی، من خروجی را در یک فایل pickle به نام simple_moving_average. pkl ذخیره کردم. برای اینکه تجزیه و تحلیل را تا حد ممکن صاف کنیم، میتوانیم از یک تابع ابزار ارائه شده توسط pyfolio استفاده کنیم و 3 عنصر مهم DataFrame را بارگذاری کنیم - بازده، موقعیتها و تراکنشها. برای انجام این کار، من از pf. utils. extract_rets_pos_txn_from_zipline استفاده می کنم.
اکنون می توانیم عناصر استخراج شده را بررسی کنیم:
در 20 روز اول معاملاتی 2016 هیچ بازدهی وجود ندارد، زیرا هنوز دوره گرم شدن میانگین متحرک است.
پوزیشن DataFrame شامل ورودیهایی برای هر روزی است که در داراییهای در نظر گرفته شده موقعیت داریم و تقسیم سرمایه بین سهام و وجه نقد را نشان میدهد. می بینیم که با خرید 20 سهم IBM هنوز اکثریت سرمایه را نقد نگه می داریم. برای استراتژی های پیشرفته تر، می توانیم با استفاده از order_percent درصدی از سرمایه را به هر سفارش اختصاص دهیم.
DataFrame تراکنش ها شامل تمام تراکنش های انجام شده توسط استراتژی معاملاتی است – ما هم شاهد خرید و هم سفارش های فروش هستیم.
ورقه پارگی ساده
برای ارزیابی عملکرد استراتژیها، پورتفولیوها یا حتی داراییهای منفرد، از pyfolio برای ایجاد یک صفحه پارگی استفاده میکنیم. برگه پارگی یک سند مختصر (اغلب یک صفحه ای) است که حاوی مهم ترین اطلاعات - مانند معیارهای مالی - در مورد یک شرکت سهامی عام است. pyfolio قابلیتهای بسیار بیشتری از آنچه که در یک صفحه کاغذ وجود دارد ارائه میکند، اما برای سادگی، ما با یک صفحه پارگی ساده شروع میکنیم که فقط حاوی حیاتیترین اطلاعات است.
برای ایجاد آن، موارد زیر را اجرا می کنیم:
چیزی که واقعاً در مورد «pyfolio» قابل توجه است این است که اطلاعات بسیار زیادی را با یک خط کد تولید می کند!
جدول اول که می بینیم تاریخ آزمون را نشان می دهد ، چند ماه به طول انجامید و معیارهای مالی زیادی مانند:
- بازده سالانه/انحراف استاندارد
- Skewness - لحظه سوم توصیف می کند که توزیع چقدر است
- Kurtosis - لحظه چهارم نشان می دهد که آیا جرم بیشتری در دم توزیع وجود دارد
- نسبت شارپ - یک معیار خطر بسیار محبوب. این میزان بازده اضافی (بیش از نرخ ریسک) در هر واحد ریسک (اندازه گیری شده توسط انحراف استاندارد) را نشان می دهد.
- نسبت Sortino - یک نسخه اصلاح شده از نسبت شارپ ، که در آن انحراف استاندارد با انحراف نزولی جایگزین می شود. انحراف نزولی فقط نوسانات منفی این سریال را اندازه گیری می کند ، به شدت در زیر یک سطح از پیش تعریف شده به نام حداقل بازده قابل قبول صحبت می کند.
- نسبت امگا-نوع دیگری از متریک عملکرد بازگرداندن ریسک. بزرگترین مزیت آن نسبت به نسبت شارپ این است که - با ساخت و ساز - تمام لحظات آماری را در نظر می گیرد ، در حالی که نسبت شارپ فقط دو مورد اول را در نظر می گیرد.
- حداکثر کشش - نشانگر بزرگترین (بیان در ٪) بین اوج و دره است
- ارزش روزانه در معرض خطر-یکی دیگر از متریک های خطرناک بسیار محبوب. در این حالت ، این نشان می دهد که در 95 ٪ موارد ، ما با نگه داشتن موقعیت/نمونه کارها برای 1 روز بیشتر ، بیش از 0. 5 ٪ از دست نخواهیم داد.
3 گلوله اول به حقایق سبک شده بازده دارایی متصل شده اند ، که من در یکی از مقالات قبلی توضیح دادم.
نمودار بعدی بازده های تجمعی در استراتژی ما را نشان می دهد - ما می توانیم در طی دو سال اجرای این استراتژی ، تحول ارزش نمونه کارها را مشاهده کنیم. دوره های مسطح دوره هایی را نشان می دهد که ما هیچ دارایی نداریم.
ما همچنین می توانیم نسبت Rolling Sharpe را مشاهده کنیم ، که بینش بیشتری در مورد ثبات استراتژی ما ارائه می دهد. ما می بینیم که نسبت شارپ کلی گزارش شده 0. 84 است ، با این حال ، وقتی به نورد نگاه می کنیم ، می بینیم که با گذشت زمان چقدر بی ثبات است (با استفاده از 6 ماه از داده ها محاسبه می شود ، نه کل نمونه!).
نمودار آخر - طرح زیر آب - سرمایه گذاری را از دیدگاه بدبینانه نشان می دهد. منظور من این است که بر روی ضرر و زیان متمرکز است. این نشان می دهد که کاهش می یابد و نشان می دهد که پس از تحمل ضرر ، ارزش نمونه کارها به اوج قبلی رسیده است. این نمودار تمایز بین دوره های طبیعی و طولانی ضرر را آسان می کند.
ما تمام این توطئه ها را با عبور از شیء بازگشت به عملکرد ایجاد کردیم. ما همچنین می توانیم موقعیت ها و معاملات قبلاً استخراج شده را منتقل کنیم تا به طور خودکار اطلاعات بیشتری را در مورد برگه اشک ساده دریافت کنیم!علاوه بر این ، ما همچنین می توانیم یک Live_Start_date را مشخص کنیم ، که دوره ها را به آزمون های پشتی و بازرگانی زنده تقسیم می کند (Zipline چنین امکان را ارائه می دهد). برای انجام این کار ، ما به سادگی اجرا می کنیم:
در جدول زیر بلافاصله تغییرات را مشاهده می کنیم:
- دو دوره جداگانه برای تجزیه و تحلیل وجود دارد
- ارائه موقعیت ها و داده های مربوط به معاملات منجر به معیارهای اضافی مانند اهرم ناخالص و گردش مالی اضافی شد
برگه اشک ساده همچنین شامل توطئه های بیشتری مربوط به موقعیت ها و معاملات است ، با این حال ، من آنها را برای کوتاه بودن نشان نمی دهم.
ورق اشک کامل
در قسمت قبلی ، ما فقط یک برگه اشک ساده ایجاد کردیم که یک نمای کلی از عملکرد استراتژی ارائه داد. با ایجاد یک برگه کامل اشک ، می توان اطلاعات بسیار بیشتری کسب کرد (این سطح از جزئیات نیز به اطلاعات ارائه شده بستگی دارد - در اینجا ما فقط از بازده استفاده می کنیم).
من مجموعه ای از جداول/نمودارهای جدید موجود در برگه کامل اشک را ارائه می دهم:
- یک جدول که 5 مورد برتر از بدترین ها را ارائه می دهد ، همراه با اطلاعاتی مانند تاریخ اوج/دره و مدت زمان
- 5 دوره برتر در حال تجسم در بالای بازده های تجمعی. در مورد ما ، دوره های فروپاشی تقریباً کل افق سرمایه گذاری را پوشش می دهد. یکی از دلایل این است که برای مدت زمان طولانی ما هیچ موقعیت باز نداریم ، بنابراین بازده تجمعی تغییر نمی کند ، بنابراین زمان بهبودی را افزایش می دهد.
- یک نقشه ساده که نشان می دهد روزانه با گذشت زمان بازده می شود. دوره های مسطح منعکس کننده زمانهایی است که ما هیچ موقعیتی در دارایی زیربنایی نداریم.
- مجموعه ای از توطئه های خلاصه بازده استراتژی با تجزیه آنها به: بازده ماهانه (جداگانه در هر سال) ، بازده سالانه در هر سال ، یک هیستوگرام ارائه بازده ماهانه و در نهایت مقدار بازده بیان شده در فرکانس های مختلف.
نتیجه گیری
در این مقاله ، من نشان دادم که چگونه می توان از Pyfolio استفاده کرد تا به راحتی تعداد زیادی از معیارها و توطئه های مالی را توصیف کند که عملکرد دارایی/استراتژی/نمونه کارها را توصیف می کند. این پست مقدمه ای سطح بالا را ارائه می دهد ، در حالی که هنوز جنبه های زیادی برای پوشش دادن وجود دارد.
برخی از ویژگی های دیگر Pyfolio شامل موارد زیر است:
- به توطئه ها می توان بدون ایجاد یک برگه اشک ساده/کامل به صورت دستی دسترسی پیدا کرد - به عنوان مثال ، ما می توانیم با اجرای pf. plot_drawdown_periods "5 طرح برتر بدترین" ایجاد کنیم (بازگشت ، بالا = 5)
- ما می توانیم ضمن ایجاد ورق های اشک آور ، لغزش را حساب کنیم
- ورق های اشکی بیزی ایجاد کنید (بر اساس PYMC3 ، به وابستگی های جداگانه نصب شده نیاز دارید)
Quantopian همچنین کتابخانه ای به نام Empyrical منتشر کرد که برای محاسبه تمام معیارهای ریسک مورد استفاده در Pyfolio استفاده می شود. یکی از مزیت های احتمالی استفاده از آن زمانی است که ما صرفاً علاقه مند به محاسبه یک متریک ، مانند نسبت امگا یا نسبت Sortino هستیم. اگر اینگونه باشد ، من مطمئناً Empyrical را برای این کار توصیه می کنم.
Kudos به Quantopian برای ایجاد کتابخانه های جامع مانند Zipline ، Pyfolio و Empyrical!
مثل همیشه ، از هر بازخورد سازنده استقبال می شود. می توانید در توییتر یا نظرات به من دسترسی پیدا کنید. می توانید کد مورد استفاده برای این مقاله را در GitHub من پیدا کنید.
در زیر می توانید سایر مقالات موجود در این سریال را پیدا کنید:
- ساخت استراتژی های تجارت الگوریتمی بر اساس تجزیه و تحلیل فنی (LINK)
- ساختمان استراتژی های تجارت الگوریتمی بر اساس تجزیه و تحلیل میانگین واریانس (LINK)
من به تازگی کتابی در مورد استفاده از پایتون برای حل کارهای عملی در حوزه مالی منتشر کردم. اگر علاقه مند هستید ، من مقاله ای را معرفی کردم که مطالب کتاب را معرفی می کند. می توانید کتاب را در وب سایت Amazon یا Packt دریافت کنید.