Wednesday, 23 August 2017

การย้าย ค่าเฉลี่ย ครอสโอเวอร์ backtest


Backtesting Crossover เฉลี่ยเคลื่อนที่ใน Python กับ pandas ในบทความก่อนหน้านี้เกี่ยวกับ Research Backtesting Environments ใน Python ด้วย Pandas เราได้สร้างสภาพแวดล้อม backtesting เชิงวัตถุขึ้นบนพื้นฐานของการวิจัยและทดสอบกับกลยุทธ์การคาดการณ์แบบสุ่ม ในบทความนี้เราจะใช้ประโยชน์จากเครื่องจักรที่เรานำมาใช้เพื่อดำเนินการวิจัยเกี่ยวกับกลยุทธ์ที่แท้จริง ได้แก่ Crossover Moving Average ใน AAPL Moving Average Crossover Strategy เทคนิค Moving Average Crossover เป็นกลยุทธ์โมเมนตัมที่เป็นที่รู้จักอย่างมาก ถือเป็นตัวอย่างของ Hello World สำหรับการซื้อขายเชิงปริมาณ กลยุทธ์ที่ระบุไว้ในที่นี้มีมานานแล้ว มีการสร้างตัวกรองแบบเคลื่อนที่เฉลี่ย 2 ตัวแยกกันโดยมีช่วงเวลามองย้อนกลับที่แตกต่างกันของชุดเวลาหนึ่ง ๆ สัญญาณที่จะซื้อสินทรัพย์เกิดขึ้นเมื่อค่าเฉลี่ยเคลื่อนที่แบบย้อนกลับที่สั้นกว่าค่าเฉลี่ยเคลื่อนที่ที่ยาวนานกว่า หากค่าเฉลี่ยยาวนานเกินกว่าค่าเฉลี่ยที่สั้นลงสินทรัพย์จะถูกขายคืน กลยุทธ์ทำงานได้ดีเมื่อชุดข้อมูลในช่วงเวลาเข้าสู่ช่วงที่มีแนวโน้มที่แข็งแกร่งและจากนั้นจะกลับทิศทางอย่างช้าๆ สำหรับตัวอย่างนี้ฉันได้เลือก Apple, Inc. (AAPL) เป็นชุดข้อมูลระยะเวลาโดยมองย้อนกลับไปในระยะสั้น 100 วันและย้อนกลับยาวนาน 400 วัน นี่คือตัวอย่างที่จัดทำโดยไลบรารีการค้าอัลกอริธึม zipline ดังนั้นถ้าเราต้องการที่จะใช้ backtester ของเราเองเราจำเป็นต้องให้แน่ใจว่ามันตรงกับผลลัพธ์ใน zipline เป็นวิธีพื้นฐานของการตรวจสอบ การติดตั้งอย่าลืมทำตามคำแนะนำก่อนหน้านี้ที่นี่ ซึ่งอธิบายว่าลำดับชั้นของวัตถุเริ่มต้นสำหรับ backtester ถูกสร้างขึ้นมิฉะนั้นโค้ดด้านล่างจะไม่ทำงาน สำหรับการใช้งานนี้ฉันได้ใช้ไลบรารีต่อไปนี้: การใช้งาน macross. py ต้องใช้ backtest. py จากบทแนะนำก่อนหน้านี้ ขั้นตอนแรกคือการนำเข้าโมดูลและออบเจ็กต์ที่จำเป็นเช่นในบทแนะนำก่อนหน้านี้เราจะจัดชั้นเรียนย่อยชั้นกลยุทธ์เพื่อสร้าง MovingAverageCrossStrategy ซึ่งมีรายละเอียดทั้งหมดเกี่ยวกับวิธีสร้างสัญญาณเมื่อค่าเฉลี่ยเคลื่อนที่ของ AAPL ข้ามกันและกัน วัตถุต้องมี shortwindow และ longwindow ที่จะใช้งาน ค่าได้รับการตั้งค่าเป็นค่าเริ่มต้นเป็น 100 วันและ 400 วันตามลำดับซึ่งเป็นพารามิเตอร์เดียวกับที่ใช้ในตัวอย่างหลักของ zipline ค่าเฉลี่ยเคลื่อนที่จะถูกสร้างขึ้นโดยใช้ฟังก์ชัน rollingmean ของแพนด้าบนแท่งปิดราคาปิดของสต็อก AAPL เมื่อสร้างค่าเฉลี่ยเฉพาะแต่ละซีรี่ส์สัญญาณจะถูกสร้างขึ้นโดยการตั้งค่าศูนย์ให้เท่ากับ 1.0 เมื่อค่าเฉลี่ยเคลื่อนที่สั้นมากกว่าค่าเฉลี่ยเคลื่อนที่ที่ยาวหรือ 0.0 มิลลิวินาที จากนี้คำสั่งตำแหน่งสามารถสร้างขึ้นเพื่อแสดงสัญญาณการซื้อขายได้ MarketOnClosePortfolio ถูกแบ่งย่อยจาก Portfolio ซึ่งพบได้ใน backtest. py เกือบจะเหมือนกันกับการดำเนินการที่อธิบายไว้ในกวดวิชาก่อนหน้านี้โดยมีข้อยกเว้นว่าขณะนี้ธุรกิจการค้าดำเนินการบนพื้นฐาน Close-to-Close แทนที่จะเป็นแบบ Open-to-Open สำหรับรายละเอียดเกี่ยวกับวิธีกำหนดเป้าหมาย Portfolio ให้ดูบทแนะนำก่อนหน้านี้ Ive ซ้ายรหัสเพื่อความสมบูรณ์และเพื่อให้กวดวิชานี้มีอยู่ด้วยตนเอง: ตอนนี้ที่มีการกำหนดคลาส MovingAverageCrossStrategy และ MarketOnClosePortfolio แล้วฟังก์ชันหลักจะถูกเรียกให้ผูกฟังก์ชันการทำงานทั้งหมดเข้าด้วยกัน นอกจากนี้ประสิทธิภาพของกลยุทธ์จะถูกตรวจสอบผ่านพล็อตของเส้นโค้งส่วนได้เสีย ออบเจ็กต์ DataReader ของแพนด้าดาวน์โหลดราคา OHLCV ของสต็อค AAPL สำหรับช่วงตั้งแต่ 1 ม. ค. 1990 ถึง 1 มกราคม 2002 ณ จุดนี้จะสร้างสัญญาณ DataFrame เพื่อสร้างสัญญาณแบบยาวเท่านั้น ต่อจากนั้นจะมีการสร้างพอร์ตการลงทุนโดยมีฐานเงินทุนเริ่มแรก 100,000 เหรียญสหรัฐและผลตอบแทนจะคำนวณจากส่วนของส่วนของผู้ถือหุ้น ขั้นตอนสุดท้ายคือการใช้ matplotlib เพื่อวางแผนพล็อตสองตัวเลขของทั้งสองราคา AAPL ซ้อนทับกับค่าเฉลี่ยเคลื่อนที่และสัญญาณ buysell รวมทั้งเส้นโค้งส่วนที่มีสัญญาณ buysell เดียวกัน รหัสวางแผนถูกนำมา (และแก้ไข) จากตัวอย่างการใช้ zipline ผลลัพธ์แบบกราฟิกของโค้ดมีดังนี้ ฉันใช้คำสั่งวาง IPython เพื่อใส่ข้อมูลนี้ลงในคอนโซล IPython โดยตรงใน Ubuntu เพื่อให้เอาต์พุตแบบกราฟิกอยู่ในมุมมอง การปรับขึ้นค่าสีชมพูหมายถึงการซื้อหุ้นในขณะที่ downticks สีดำเป็นตัวแทนขายมันกลับมา: ตามที่สามารถเห็นได้กลยุทธ์สูญเสียเงินในช่วงที่มีห้าธุรกิจการท่องเที่ยวรอบ นี้ไม่น่าแปลกใจที่ได้รับพฤติกรรมของ AAPL ในช่วงเวลาซึ่งอยู่ในแนวโน้มลดลงเล็กน้อยตามด้วยการเริ่มต้นขึ้นอย่างมากจุดเริ่มต้นในปี 1998 ระยะเวลา lookback ของสัญญาณเฉลี่ยเคลื่อนไหวค่อนข้างใหญ่และส่งผลกระทบต่อกำไรของการค้าขั้นสุดท้าย ซึ่งอาจทำให้กลยุทธ์มีกำไร ในบทความต่อ ๆ ไปเราจะสร้างวิธีการวิเคราะห์ประสิทธิภาพที่ซับซ้อนขึ้นและอธิบายถึงวิธีเพิ่มระยะเวลาการมองย้อนกลับของแต่ละค่าเฉลี่ยที่เคลื่อนที่ได้ เพิ่งเริ่มต้นกับการซื้อขายเชิงปริมาณกลยุทธ์การซื้อขายครอสโอเวอร์เฉลี่ยย้อนหลังบททดสอบใน Python 8211 V 2.0 นี่คือข้อความโฆษณาทดสอบยินดีต้อนรับ back8230 โพสต์นี้จะจัดการกับคำถามสองข้อที่ฉันได้รับในส่วนความคิดเห็นของโพสต์ก่อนหน้าที่เกี่ยวข้องกับการย้าย กลยุทธ์การซื้อขายครอสโอเวอร์เฉลี่ย 8211 บทความสามารถพบได้ที่นี่ คำถามที่ฉันได้รับในตอนแรกถามว่าโค้ดสำหรับการทำ backtest สามารถปรับเปลี่ยนให้สอดคล้องกับกฎต่อไปนี้ได้หรือไม่ (1) หากค่าเฉลี่ยเคลื่อนที่สั้น ๆ เหนือค่าเฉลี่ยเคลื่อนที่ยาวไปเป็นเวลานาน x วัน (2) หากค่าเฉลี่ยเคลื่อนที่สั้น ๆ ต่ำกว่าค่าเฉลี่ยเคลื่อนที่ยาวเป็นเวลา x วัน (3a) หากมีการครอสโอเวอร์เพิ่มในระหว่างช่วงเวลาการถือครองอย่าลืม (3b) ถ้าไม่มี crossovers ถือเงินสดนี่คือโค้ดต้นฉบับ: import pandas นำเข้าโมดูลที่เกี่ยวข้องเช่น pd import numpy เป็น np จากข้อมูลการนำเข้า pandasdatareader จากการนำเข้า sqrt นำเข้าทางคณิตศาสตร์ matplotlib. pyplot as plt ดาวน์โหลดข้อมูลลงใน DataFrame และสร้างคอลัมน์ moving spreads โดยเฉลี่ย sp500 ข้อมูล DataReader (GSPC, yahoo, start112000) spell42d np. round (sp500Close. rolling (window42).mean (), 2) sp500252d np. round (sp500Close) กลิ้ง (window252).mean (), 2) สร้างคอลัมน์ที่มีค่าเฉลี่ยกระจายกระจาย sp50042-252 sp50042d - sp500252d กำหนดจำนวนจุดที่ต้องการเป็นเกณฑ์สำหรับการกระจายความแตกต่างและสร้างคอลัมน์ที่มีกลยุทธ์ Stance X 50 sp500Stance np. where (sp50042-252 sp500Stance. valuecounts () สร้างคอลัมน์ที่มีผลตอบแทนเข้าสู่ตลาดรายวันและผลตอบแทนการเข้าสู่ระบบแบบรายวัน sp500Market ส่งคืน np. log (sp500Close sp500Close. shift (1)) s p500Strategy sp500Market ส่งคืน sp500Stance. shift (1) กำหนดกลยุทธ์เริ่มต้นทุนเป็น 1 (เช่น 100) และสร้างส่วนได้เสีย sp500Strategy Equity sp500Strategy. cumsum () 1 แสดงกราฟผันผวนของส่วน sp500Strategy Equity. plot () และนี่คือโค้ดที่รวมเอากฎข้างต้น: import pandas นำเข้าโมดูลที่เกี่ยวข้องเป็น pd นำเข้า numpy เป็น np จากการนำเข้า pandasdatareader ข้อมูลจากคณิตศาสตร์นำเข้า sqrt นำเข้า matplotlib. pyplot เป็น plt matplotlib inline ดาวน์โหลดข้อมูลลงใน DataFrame และสร้างคอลัมน์ค่าเฉลี่ยเคลื่อนที่ sp500 data DataReader (GSPC, yahoo, start112014) spell4000 np. round (sp500Close. rolling (window42).mean (), 2 ) sp500252d np. round (sp500Close. rolling (window252).mean (), 2) สร้างคอลัมน์ที่มีค่าเฉลี่ยกระจายกระจาย sp50042-252 sp50042d - sp500252d ตั้งค่าจำนวนจุดที่ต้องการเป็นเกณฑ์สำหรับการกระจายความแตกต่างและสร้างคอลัมน์ที่มีกลยุทธ์ Stance X 50 (sp50042-252 lt-X, -1, sp500Stance) sp500Stance. valuecounts () สร้างคอลัมน์ที่มีผลตอบแทนจากการเข้าสู่ระบบของตลาดรายวันและกลยุทธ์ ret log รายวัน sp500Stance. shift (1) ตั้งค่าคอลัมน์ใหม่เพื่อรักษาท่าทางของเราที่เกี่ยวข้องกับระยะเวลาการถือครองที่กำหนดไว้ sp500Stance2 0 กำหนดระยะเวลาการถือครองที่กำหนดไว้ล่วงหน้าแล้วหลังจากนั้นเวลา เราจะกลับไปถือครองเงินสดและรอให้มีการข้ามค่าเฉลี่ยถัดไป - นอกจากนี้เรายังไม่สนใจ crossovers พิเศษใด ๆ ในช่วงวันที่มีการถือครองวันที่ 50 ผ่านทาง DataFrame และอัปเดตคอลัมน์ quotStance2quot เพื่อถือท่าทางที่น่าสนใจสำหรับ i ในช่วง (X , len (sp500)): การทดสอบตรรกะเพื่อตรวจสอบ 1) ข้ามไปสั้นกว่า MA ยาว 2) ว่าเรากำลังอยู่ในเงินสดถ้า (sp500Stance. iloci gt sp500Stance. iloci-1) และ (sp500Stance. iloci-1 0) (sp500Stance2.ilocik 1 sp500Stance2.ilocik1 0): เติมข้อมูล DataFrame ไปข้างหน้าในเวลาสำหรับจำนวนวันในระยะเวลาการถือครองของเราสำหรับ k ในช่วง (วัน): ลอง: sp500Stance2.ilocik 1 sp500Stance2.ilocik1 0 ยกเว้น: ผ่านการทดสอบเชิงตรรกะเพื่อตรวจสอบ สำหรับ 1) ข้ามสั้นใต้ยาว MA 2) T (sp500Stance. iloci lt sp500Stance. iloci-1) และ (sp500Stance. iloci-1 0) และ (sp500Stance2.iloci-1 0): เติมข้อมูล DataFrame ไปข้างหน้าในเวลาสำหรับจำนวนวันใน ระยะเวลาการถือครองของ k ในช่วง (วัน): ลอง: sp500Stance2.ilocik -1 sp500Stance2.ilocik1 0 ยกเว้น: pass คำนวณผลตอบแทนของตลาดรายวันและกลยุทธ์รายวัน sp500Market ส่งคืน (sp500Close sp500Close. shift (1)) sp500Strategy sp500Market ผลตอบแทน sp500Stance2.shift (1) พล็อตผลตอบแทนทางกลยุทธ์กับผลตอบแทนของตลาด sp500Market Returns, Strategy. cumsum () พล็อต (gridTrue, figsize (8,5)) plt. show () ตั้งค่าสตาร์ทให้กับ 1 (คือ 100) และสร้างส่วนได้เสีย sp500Strategy Equity sp500Strategy. cumsum () 1 กราฟแสดงเส้นโค้งส่วนได้เสีย sp500Strategy Equity. plot (gridTrue, figsize (8,5)) plt. show () หลังจากโพสต์โค้ดนี้ฉันได้รับคำถามต่อไปนี้ : 8220 ขอขอบคุณสำหรับการตอบกลับ ฉันมีปัญหาในการทำความเข้าใจโค้ดนี้ รหัสกำลังทำงาน แต่ฉันต้องการทำความเข้าใจให้ดีขึ้น ฉันสับสนกับ iloc ส่วนใหญ่และ k และ I. ฉันไม่เข้าใจจริงๆว่าผู้ที่อยู่ที่ไหนหรือกำลังดึงข้อมูลมาจากไหน ความชัดเจนใด ๆ จะนิยมมาก 8221 So8230 Here8217s พยายามของฉันที่พยายามชี้แจงความคิดของฉันคิดในขณะที่เขียนโค้ดและพยายามอธิบายสิ่งที่เกิดขึ้นในบรรทัดโดยบรรทัด Let8217s เริ่มต้นด้วย 8220iloc8221 นี่คือข้อมูลจากเอกสาร Pandas อย่างเป็นทางการ:.iloc เป็นตำแหน่งหลักตามจำนวนเต็ม (จาก 0 ถึง 1 ยาวของแกน) แต่อาจใช้กับอาร์เรย์แบบบูล iloc จะเพิ่ม IndexError หากตัวสร้างดัชนีที่ต้องการอยู่นอกขอบเขตยกเว้นดัชนีเซ็ตเตอร์ซึ่งยอมให้มีการจัดทำดัชนีนอกขอบเขต (สอดคล้องกับความหมายของชิ้นส่วน pythonnumpy) ปัจจัยการผลิตที่อนุญาตคือจำนวนเต็มเช่น 5 อาร์เรย์หรืออาร์เรย์ของจำนวนเต็ม 4, 3, 0 วัตถุชิ้นที่มี ints 1: 7 อาร์เรย์แบบบูลลีนฟังก์ชัน callable ที่มีอาร์กิวเมนต์หนึ่งชุด (ชุดเรียก, DataFrame หรือแผงควบคุม) และส่งคืนผลลัพธ์ที่ถูกต้องสำหรับการจัดทำดัชนี (หนึ่งในข้อ ) 8220iloc8221 เป็นเพียงวิธีง่ายๆในการอ้างอิงตำแหน่งแถวใน DataFrame 8211 ของคุณแบบง่ายๆ ถ้าเราสร้าง DataFrame ต่อไปนี้และแสดงให้เราได้รับ: ย้ำผ่าน DataFrame และอัปเดตคอลัมน์ quotStance2quot เพื่อถือท่าทางที่น่าสนใจสำหรับ i ในช่วง (X, len (sp500)): ใช้ฟังก์ชัน 8220range8221 เพื่อสร้างรายการ ค่าเริ่มต้นที่ 8220X8221 และขึ้นไป (แต่ไม่รวมถึง) ค่าของระยะเวลาที่ Sp500 DataFrame จะใช้ฟังก์ชัน 8220len8221 ดังนั้นถ้า X เท่ากับ 50 และความยาวของ Sp500 DataFrame เท่ากับ 500 รายการค่าที่เราจะย้ำจะใช้งานได้ตั้งแต่ 50 ถึง 499 8211 นั่นคือตั้งแต่วันที่ 50 ใน DataFrame ไปจนถึงช่วงสุดท้าย เมื่อเรารวม 8220.iloc8221 และ 8220for i ใน range8221 และส่งผ่านค่า 8220i8221 ไปยัง 8220iloc8221 เป็น 8220.iloci8221 8211 เราสามารถใช้ iterator 8220i8221 ซึ่งเพิ่มขึ้นทีละลูปแต่ละครั้งที่ทำงาน, เพื่อเข้าถึงดัชนีแถวข้อมูลของ DataFrame แต่ละอันต่อกัน ถูกต้องดังนั้นตอนนี้เราควรทำความเข้าใจเกี่ยวกับหลัก 8220for i ในช่วง (X, len (sp500)): 8221 loop 8211 เราสามารถอ่านซ้ำได้ทีละแถวใน DataFrame ทีละแถวเริ่มจากแถว X และลงท้ายที่ end ของ DataFrame (โดยทางเทคนิคเราจะสิ้นสุดในวันที่สองเป็นช่วงสุดท้ายเนื่องจากฟังก์ชันช่วงสร้างรายการที่ขึ้นไป แต่ doesn8217t รวมค่าที่สองผ่าน 8211 แต่เพื่อวัตถุประสงค์ของเราในวันสุดท้ายที่สองไม่มีผลต่อ เอาท์พุท) ดังนั้นตอนนี้ let8217s พยายามที่จะแก้ไขปัญหาเหล่านี้ทั้งหมด 8220if8221 และ 8220for k8221 ลูปและการทดสอบภายในวงแหวนภายนอกด้านนอก 8220for8221 อธิบายข้างต้น การทดสอบ 8220if8221 กำลังใช้การทดสอบตรรกะคู่หนึ่งชุดใน DataFrame แต่ละแถวที่เรากำลังทำซ้ำจาก 8211 การทดสอบลอจิคัลแบบแรกจะจัดการกับไขว้เมื่อค่าเฉลี่ยเคลื่อนที่สั้น ๆ อยู่เหนือค่าเฉลี่ยเคลื่อนที่นานและใช้ค่าในคอลัมน์ 8220Stance8221 ก่อนอื่น เพื่อตรวจสอบว่าค่าจะเปลี่ยนจาก 0 เป็น 1 จากวันที่ 8220T-18221 เป็นวันที่ 8220T8221 หรือไม่และค่าในคอลัมน์ 8220Stance28221 ณ วันที่ 8220T-18221 ก็เป็น 0 8211 ด้วยเช่นกันซึ่งหมายความว่าค่าเฉลี่ยเคลื่อนที่สั้น ๆ ได้ข้ามไปเป็นระยะยาวแล้ว เฉลี่ยแล้วเราควรเข้าสู่ตำแหน่ง ถ้านี่เป็นเหตุผลที่ชัดเจน 8211 ต้องใช้เวลาสักนิดในการคิดถึงตรรกะ เราจำเป็นต้องใช้คอลัมน์ 8220Stance8221 เพื่อเลื่อนจาก 0 เป็น 1 เพื่อให้มีความหมายสั้น ๆ เหนือครอสโอเวอร์ MA แบบยาว แต่เราต้องใช้คอลัมน์ 8220Stance28221 ในวันที่ 8220T-18221 เป็น 0 เช่นถ้าไม่มีตำแหน่งใดที่มีอยู่ในปัจจุบัน ถูกป้อนเข้า ถ้า 8220Stance28221 ณ วันที่ 8220T-18221 ไม่ได้เป็นศูนย์แล้วแสดงว่าเราอยู่ในตำแหน่งแล้วและไม่มีสิ่งใดควรทำแม้ว่าการทดสอบตรรกะครั้งแรกจะแสดงครอสโอเวอร์ค่าเฉลี่ยเคลื่อนที่ ฉันขอขอบคุณที่ทำเช่นนี้อาจต้องใช้เวลาสักเล็กน้อยในการทำงานและทำให้หัวของคุณรอบ ๆ ตัว แต่สิ่งที่ฉันสามารถพูดได้คือการทดสอบตรรกะตามที่กำหนดไว้ในโค้ดทำตามขั้นตอนที่ปรากฏในคำถามเบื้องต้น ชุดทดสอบ 8220if8221 ชุดที่สองเป็นเพียงภาพสะท้อนของ 8211 แรกและจัดการกับไขว้เมื่อมีค่าเฉลี่ยเคลื่อนที่โดยเฉลี่ยต่ำกว่าค่าเฉลี่ยเคลื่อนที่ที่ยาวนาน (เช่นโคลน) และทั้งหมดที่เรามีเหลือในการจัดการคือการใช้ 8220k8221 ใน 8220for k ในช่วง (วัน) 8221 ลูป ประการแรก 8220days8221 เป็นเพียงตัวแปรที่มีจำนวนวันที่เราต้องการจะดำรงตำแหน่งของเราไว้ก่อนที่จะออกจากตำแหน่งเหล่านั้นโดยอัตโนมัติ 8220days8221 ถูกตั้งค่าไว้ที่ 50 ในโค้ด แต่สามารถตั้งค่าเป็นค่าใดก็ได้ที่ต้องการสำหรับกลยุทธ์เฉพาะของตน ดังนั้นเมื่อทราบว่า 8220for k ในช่วง (วัน) 8221 ลูปจะทำงานได้ถ้าหากการทดสอบตรรกะก่อนหน้านี้มีความพึงพอใจและกลยุทธ์ของเรากำลังบอกให้เราเปิดตำแหน่ง (ไม่ว่าจะยาวหรือสั้น) ถ้ามีการแสดงสัญญาณเข้าเราจะย้ำเวลาล่วงหน้าโดย 8220k8221 วัน (เริ่มต้นที่ 8220i8221 8211 ในวันที่เราใช้ 8220ik8221 เป็นวันเริ่มต้นของเรา) และตั้ง 8220Stance28221 เป็น 1 หรือ -1 (ขึ้นอยู่กับว่าสัญญาณยาวหรือไม่ หรือสัญญาณตำแหน่งสั้น) นี่เป็นเวลาที่เราต้องการจะรักษาตำแหน่งของเราไว้ก่อนที่จะออกไปโดยอัตโนมัติ ดังนั้นหากมีการสร้างสัญญาณเข้าในวันที่ 100 (ที่จุด i จะเท่ากับ 100) ท่าทางในวัน 8220i k8221 จะตั้งค่าเป็น -1 หรือ 1 k จะเริ่มต้นที่ 0 และวิ่งไปที่ 49 โดยเพิ่มทีละหนึ่งค่า เรียกใช้ลูป in8221 8220for k ดังนั้นจุดยืนในวันที่ 8220i k8221 จะกำหนดวัน 100 0 ถึง 1 หรือ -1 จากนั้นให้เลือกวันที่ 100 1 จากนั้น 100 2 ฯลฯ จนกว่าตำแหน่งจะออกในวันที่ 100 49 และท่าทางในวันที่ 100 50 จะตั้งเป็นศูนย์เพื่อ แสดงตำแหน่งที่ราบเรียบ คู่ของอาจเพิ่มความสับสนให้กับตรรกะข้างต้นและในบรรทัดต่อไปนี้: สำหรับ k ในช่วง (วัน): ลอง: sp500Stance2.ilocik 1 sp500Stance2.ilocik1 0 ยกเว้น: pass ใช้บรรทัดที่สอง 8220sp5008216Stance28217.ilocik1 08221 8211 I ได้รวมเอาไว้เพื่อให้แน่ใจว่าคอลัมน์ 8220Stance28221 ถูกรีเซ็ตเป็น 0 เมื่อเราออกจากตำแหน่งของเราและตอนนี้แบนอีกครั้ง 8211 ท่าทางแบนนี้ตั้งไว้สำหรับวันหลังจากที่เราออกจากตำแหน่ง 8211 ในวันที่มีผล (ik1) ประการที่สองอาจสับสนนอกจากนี้คือการใช้ 8220try และ except8221 เราใช้ข้อมูลนี้เพื่อให้หากเราไปถึงจุดสิ้นสุดของ DataFrame ขณะที่ยังคงทำซ้ำไปข้างหน้าในเวลาต่อวัน X แทนการโยนข้อมูล 8220index ออกจากข้อผิดพลาด bounds8221 และออกจากโค้ดรหัสจะส่งต่อและสิ้นสุดโดยไม่มีข้อผิดพลาด กรณีนี้อาจเกิดขึ้นได้เช่นถ้าพูดว่าหน้าต่าง 8220days8221 ของเรามีการตั้งค่าไว้ที่ 50 และมีข้อมูลเหลือเพียง 30 วันจะมีการสร้างรายการสัญญาณ 8211 ถ้าเราพยายามย้ำการส่งต่อไปข้างหน้า 50 วันในเวลาที่มีข้อมูลเพียงอย่างน้อย 82 วันโดยไม่มี tryexcept รหัสของเราจะพ่นผิดพลาดและออก หวังว่าการโพสต์นี้อธิบายและชี้แจงส่วนใหญ่ของรหัสที่เพิ่มขึ้น 8211 ถ้าไม่ได้แล้วโปรดอย่าทิ้งคำถามและความคิดเห็นด้านล่างของคุณและ I8217ll พยายามจัดการกับพวกเขา all8230 จนกว่าจะถึงเวลาที่ดีข้อมูล แต่ฉันต้องทราบว่าการออกแบบเว็บไซต์ก่อนหน้านี้ดีกว่านี้มาก ข้อความสีเทานั้นอ่านได้ยากฟังก์ชั่นการซูมเข้าไม่ทำงานในธีมนี้ เว็บไซต์ทั้งหมดทำงานช้ากว่าชุดรูปแบบเดิม อาจเนื่องจากปลั๊กอินหลายตัวติดตั้งเช่น Squirrly SEO, W3 Total Cache และ Jetpack เชื่อว่าฉันมีเนื้อหาที่ให้ข้อมูลดังกล่าวคุณ don8217t ต้องใช้ขยะ seo ทั้งหมดเลย สวัสดี there8230I ทั้งหมดเห็นด้วย I8217ve ให้กับ theme8230it ก่อนหน้านี้อยู่ไกลซับซ้อนเกินไปเบื้องหลังและฉันไม่สามารถได้รับอะไรที่จะมองในแบบที่ฉันต้องการมัน ดังนั้น I8217ve ตัดสินใจที่จะใช้รูปแบบใหม่นี้ตอนนี้ฉันจะสนใจที่จะได้ยินสิ่งที่คุณคิดว่าถ้ามันขอบคุณสำหรับข้อเสนอแนะ 8211 it8217s ชื่นชมมากและแน่นอน get8217s ฟังกลยุทธ์การซื้อขายเฉลี่ยไขว้ Backtest ใน Python นี่คือข้อความโฆษณาทดสอบ Hi all, สำหรับโพสต์นี้ฉันจะสร้างกลยุทธ์การซื้อขายครอสโอเวอร์ไขว้แบบง่ายๆใน Python ใช้ SampP500 เป็นตลาดเพื่อทดสอบ ข้ามง่ายข้ามกลยุทธ์เฉลี่ยอาจเป็นหนึ่งในถ้าไม่ใช่ตัวอย่างที่ง่ายที่สุดของกฎการซื้อขายตามกลยุทธ์โดยใช้ตัวชี้วัดทางเทคนิคดังนั้นฉันคิดว่านี่จะเป็นตัวอย่างที่ดีสำหรับการเรียนรู้ Python พยายามที่จะให้มันง่ายที่สุดและสร้าง ขึ้นจากที่นั่น ดังนั้นเสมอเมื่อใช้งูหลามสำหรับ shenanigans ข้อมูลที่เกี่ยวข้องกับเงิน it8217s เวลาที่จะนำเข้าโมดูลที่จำเป็นของเรา: pandas นำเข้าเป็น pd นำเข้า numpy เป็น np จาก pandasdatareader นำเข้าข้อมูลก่อนอื่นเราจะใช้ฟังก์ชั่น pandas-datareader เพื่อดาวน์โหลดข้อมูลราคาจากการซื้อขายครั้งแรก (GSPC, yahoo, start112000) นี่คือการทดสอบกลยุทธ์การซื้อขาย VIX อื่นจาก Logical-Invest ที่ดีเยี่ยม (ดูการทดสอบก่อนหน้านี้ของ บริษัท LIs Bollinger) วงดนตรี) เครื่องนี้ใช้ไขว้เฉลี่ยเคลื่อนที่ 515 วันเพื่อทำการค้า VIX ETPs เช่น XIV (หรือสั้น VXX) กราฟด้านล่างแสดงผลการซื้อขายกลยุทธ์ XIV (สีน้ำเงิน) เปรียบเทียบกับการซื้อและถือครอง XIV (สีเทา) จากกลางปี ​​2547 อ่านเกี่ยวกับสมมติฐานการทดสอบ หรือรับความช่วยเหลือตามกลยุทธ์นี้ กฎกลยุทธ์: ไปยาว XIV ที่ใกล้วันนี้ถ้าค่าเฉลี่ยเคลื่อนที่เฉลี่ย 5 วัน (SMA) จะปิดเหนือ SMA 15 วัน กดค้างไว้จนกว่า SMA 5 วันจะปิดตัวลงต่ำกว่า SMA 15 วันแล้วย้ายไปเป็นเงินสด กลยุทธ์ (เช่นรูปแบบวง Bollinger) อยู่ในทิศทางกลมเป็นยุทธศาสตร์โมเมนตัม กลยุทธ์มีการซื้อ XIV เมื่อแสดงความแข็งแกร่งล่าสุดและถือครองไว้จนกว่า XIV จะกลับมาอยู่ต่ำกว่าค่าเฉลี่ยระยะกลาง โปรดทราบว่า backtest ของเราแตกต่างจากการทดสอบ Logical-Invests เดิมใน 3 วิธีคือการทดสอบ LIs เริ่มขึ้นในช่วงต้นปีพ. ศ. 2552 ใดก็ตามเราเพิ่มเกือบ 5 ปีข้อมูลจำลองเพิ่มเติม (1) การทดสอบ LIs ถือว่าเราขาดแคลน VXX ในขณะที่ Ive แสดงผลการซื้อขายยาว XIV เพื่อให้สามารถเปรียบเทียบแอปเปิ้ลกับแอปเปิ้ลกับ backtests อื่น ๆ ได้ที่ความผันผวน Made Simple การทดสอบ LIs ถือว่าเราดำเนินการเทรดในวันถัดไปแทนที่จะเป็นวันที่ใกล้ ฉันทดสอบที่ใกล้ชิดเพราะไม่มีวิธีการที่เชื่อถือได้สำหรับการจำลองข้อมูลก่อนปี 2009 สำหรับการเปิด ตามที่คุณคาดหวังอย่างสังหรณ์ใจตามกฎของยุทธศาสตร์การทำงานที่ดีของมันหลีกเลี่ยงการเบี่ยงเบนอย่างมีนัยสำคัญมากที่สุดของ XIV เนื่องจากการบังคับให้กลยุทธ์เป็นเงินสดเมื่อ XIV เริ่มเคลื่อนย้ายผู้ค้าโดยไม่คำนึงถึงข้อควรพิจารณาอื่น ๆ ทั้งหมดเช่นสถานะของฟิวเจอร์ส VIX โครงสร้างระยะยาว ฯลฯ แต่ความกระตือรือร้นที่จะออกจากตำแหน่งได้อย่างรวดเร็วยังออกกำไรมากในตารางเมื่อ XIV อยู่ในแนวโน้มขาขึ้นอย่างสม่ำเสมอ (เช่น VXX อยู่ในขาลงที่แข็งแกร่ง) เช่นเคยเป็นกรณีที่ 2 ปีที่ผ่านมา กลยุทธ์ของกลุ่ม Bollinger ที่เราทดสอบก่อนหน้านี้ช่วยตอบได้โดยทำให้ยากที่จะออกจากตำแหน่ง (ดูโพสต์เพื่อดูรายละเอียด) ขึ้นอยู่กับการทดสอบอีกต่อไป Ive นำเสนอที่นี่ของทั้งสองรูปแบบที่ฉันชอบวง Bollinger หนึ่ง ขอขอบคุณคุณ Logical-Invest สำหรับการโพสต์กลยุทธ์นี้ เมื่อกลยุทธ์ที่เราครอบคลุมในบล็อกของเรา (รวมถึงข้อมูลนี้) จะแสดงการซื้อขายใหม่เราจะรวมการแจ้งเตือนในรายงานประจำวันที่ส่งถึงสมาชิก นี่เป็นสัญญาณที่ไม่เกี่ยวข้องกับสัญญาณของยุทธศาสตร์ของเราเพียงแค่ทำหน้าที่เพิ่มสีเล็ก ๆ น้อย ๆ ในรายงานประจำวันและช่วยให้สมาชิกเห็นว่ากลยุทธ์เชิงปริมาณอื่น ๆ มีการพูดถึงตลาดอย่างไร คลิกเพื่อดูความผันผวนของ Simples ตัวเองโซลูชันที่หรูหราเพื่อปริศนา VIX ETP การซื้อขายที่ดี, ความผันผวนทำได้ง่าย Wonk note: ข้อมูลก่อนการเปิดตัว XIV ได้รับการจำลองแล้ว สามารถทำสิ่งนี้ได้อย่างถูกต้องโดยใช้ดัชนีและข้อมูลฟิวเจอร์สที่มีการใช้ ETP นี้ อ่านเพิ่มเติมเกี่ยวกับการจำลองข้อมูลสำหรับ VIX ETPs โพสต์หมวดหมู่บทความล่าสุด

No comments:

Post a Comment