ห้องสมุด Python สำหรับการเงินทางคณิตศาสตร์
https://pypi.org/project/QFin/
pip install qfin
QFin กำลังถูกสร้างขึ้นใหม่เพื่อใช้ประโยชน์จากหลักการของการเขียนโปรแกรมเชิงวัตถุมากขึ้น หลายโมดูลในเวอร์ชันนี้เลิกใช้แล้วพร้อมกับโซลูชันสำหรับ PDE/SDE (ส่วนใหญ่อยู่ในโมดูลตัวเลือก)
ขณะนี้ QFin มีโมดูลที่เรียกว่า 'stochastics' ซึ่งจะรับผิดชอบส่วนใหญ่ในการสอบเทียบโมเดลและการกำหนดราคาออปชั่น Cython/C++ ที่เทียบเท่ากับ QFin กำลังถูกสร้างขึ้นเช่นกัน ดังนั้นโปรดคอยติดตาม!
สมการเชิงอนุพันธ์สุ่มที่สร้างแบบจำลองไดนามิกของสินทรัพย์พื้นฐานจะขยายคลาส 'StochasticModel' และมีรายการพารามิเตอร์โมเดลและฟังก์ชันสำหรับการกำหนดราคาพื้นฐาน การปรับเทียบพื้นผิวที่มีความผันผวนโดยนัย และการจำลองแบบมอนติคาร์โล (มีประโยชน์อย่างยิ่งหลังการสอบเทียบสำหรับตัวเลือกที่ขึ้นอยู่กับเส้นทางการกำหนดราคา)
ด้านล่างนี้เป็นตัวอย่างเล็กๆ น้อยๆ โดยใช้ ArithmeticBrownianMotion - ขั้นแรกให้นำเข้า StochasticModel...
จาก qfin.stochastics นำเข้า ArithmeticBrownianMotion
ถัดไปเริ่มต้นวัตถุคลาสโดยการกำหนดพารามิเตอร์โมเดล...
# abm กำหนดพารามิเตอร์โดย Bachelier vol = .3abm = ArithmeticBrownianMotion ([.3])
ตอนนี้ abm สามารถใช้เพื่อกำหนดราคาตัวเลือกการโทร/วางวานิลลา (ราคาเริ่มต้นคือ "CALL") ภายใต้ชุดพารามิเตอร์ที่กำหนด...
# F0 = 101# X = 100# T = 1abm.vanilla_pricing(101, 100, 1, "CALL")# ราคาโทร: 1.0000336233656906
การใช้ราคาใส่แบบ call-put parity ก็อาจได้รับเช่นกัน...
# F0 = 99# X = 100# T = 1abm.vanilla_pricing(99, 100, 1, "PUT")# ราคาใส่: 1.0000336233656952
มีการสอบเทียบและการจำลองกระบวนการในภายหลังด้วย โปรดทราบว่ากระบวนการบางอย่างมีความผันผวนคงที่และไม่สามารถปรับเทียบกับพื้นผิวไอโวลได้
การเคลื่อนที่แบบบราวเนียนทางคณิตศาสตร์อาจจำลองได้ดังนี้...
# F0 = 100# n (ขั้น) = 10000# dt = 1/252# T = 1abm.simulate(100, 10000, 1/252, 1)
ผลลัพธ์ของการจำลองพร้อมกับคุณลักษณะการจำลองจะถูกเก็บไว้ภายใต้ทูเพิล 'path_Characteristics' : (เส้นทาง, n, dt, T)
การใช้คุณลักษณะเส้นทางที่เก็บไว้ เราอาจค้นหาราคาของการโทรเหมือนเมื่อก่อนโดยการเฉลี่ยผลตอบแทนของเส้นทางที่มีส่วนลดแต่ละรายการ (สมมติว่าเป็นกระบวนการสต็อก) ด้วยอัตราศูนย์ เราสามารถหลีกเลี่ยงการลดราคาได้ดังต่อไปนี้ และค้นหาค่าตัวเลือกดังต่อไปนี้...
# รายการของเส้นทาง payoffspayoffs = []# option strike priceX = 99# การวนซ้ำผ่านค่าพาธเทอร์มินัลเพื่อระบุ payoff สำหรับพาธใน abm.path_Characteristics[0]: # ต่อท้าย CALL payoff payoffs.append(max((path[-1] - X) ), 0))# ค่าตัวเลือกวันนี้ np.average(ผลตอบแทน)# ราคาโทร: 1.0008974837343871
เราจะเห็นตรงนี้ว่าราคาจำลองกำลังมาบรรจบกับราคาในรูปแบบปิด
การกำหนดราคาตัวเลือกตามทฤษฎีสำหรับหุ้นที่ไม่จ่ายเงินปันผลมีอยู่ในคลาส BlackScholesCall และ BlackScholesPut
จาก qfin.options นำเข้า BlackScholesCallจาก qfin.options นำเข้า BlackScholesPut# 100 - ราคาสินทรัพย์อ้างอิงเริ่มต้น# .3 - ความผันผวนของสินทรัพย์อ้างอิง# 100 - ราคานัดหยุดงานของตัวเลือก# 1 - ระยะเวลาถึงกำหนด (ปี)# .01 - อัตราปลอดความเสี่ยงของดอกเบี้ย euro_call = แบล็คสโคลส์คอล(100, .3, 100, 1, .01)euro_put = แบล็คสโคลส์พุต(100, .3, 100, 1, .01)
print('ราคาโทร: ', euro_call.price)print('ใส่ราคา: ', euro_put.price)
Call price: 12.361726191532611 Put price: 11.366709566449416
มีอนุพันธ์บางส่วนในลำดับที่หนึ่งและลำดับที่สองของรูปแบบการกำหนดราคาของ Black-Scholes
อนุพันธ์บางส่วนลำดับที่หนึ่งตามราคาสินทรัพย์อ้างอิง
print('โทรเดลต้า: ', euro_call.delta)พิมพ์('ใส่เดลต้า: ', euro_put.delta)
Call delta: 0.5596176923702425 Put delta: -0.4403823076297575
อนุพันธ์บางส่วนอันดับสองที่เกี่ยวข้องกับราคาสินทรัพย์อ้างอิง
print('เรียก gamma: ', euro_call.gamma)print('ใส่ gamma: ', euro_put.gamma)
Call gamma: 0.018653923079008084 Put gamma: 0.018653923079008084
อนุพันธ์บางส่วนลำดับที่หนึ่งโดยคำนึงถึงความผันผวนของสินทรัพย์อ้างอิง
print('Call vega: ', euro_call.vega)print('ใส่ vega: ', euro_put.vega)
Call vega: 39.447933090788894 Put vega: 39.447933090788894
อนุพันธ์บางส่วนลำดับที่หนึ่งโดยคำนึงถึงระยะเวลาถึงกำหนด
print('Call theta: ', euro_call.theta)print('ใส่ theta: ', euro_put.theta)
Call theta: -6.35319039407325 Put theta: -5.363140560324083
การจำลองเส้นทางสินทรัพย์สามารถทำได้โดยใช้กระบวนการสุ่มทั่วไป
แบบจำลองมาตรฐานสำหรับการนำการเคลื่อนที่แบบบราวเนียนเชิงเรขาคณิตไปใช้
จาก qfin.simulations นำเข้า GeometricBrownianMotion# 100 - ราคาสินทรัพย์อ้างอิงเริ่มต้น# 0 - การเคลื่อนตัวของสินทรัพย์อ้างอิง (mu)# .3 - ความผันผวนของสินทรัพย์อ้างอิง# 1/52 - ขั้นตอนเวลา (dt)# 1 - เวลาที่ถึงกำหนด (ปี)gbm = เรขาคณิตบราวเนียนโมชั่น(100, 0, .3, 1/52, 1)
พิมพ์ (gbm.simulated_path)
[107.0025048205179, 104.82320056538235, 102.53591127422398, 100.20213816642244, 102.04283245358256, 97.75115579923988, 95.19613943526382, 96.9876745495834, 97.46055174410736, 103.93032659279226, 107.36331603194304, 108.95104494118915, 112.42823319947456, 109.06981862825943, 109.10124426285238, 114.71465058375804, 120.00234814086286, 116.91730159923688, 118.67452601825876, 117.89233466917202, 118.93541257993591, 124.36106523035058, 121.26088015675688, 120.53641952983601, 113.73881043255554, 114.91724168548876, 112.94192281337791, 113.55773877160591, 107.49491796151044, 108.0715118831013, 113.01893111071472, 110.39204535739405, 108.63917240906524, 105.8520395233433, 116.2907247951675, 114.07340779267213, 111.06821275009212, 109.65530380775077, 105.78971667172465, 97.75385009989282, 97.84501925249452, 101.90695475825825, 106.0493833583297, 105.48266575656817, 106.62375752876223, 112.39829297429974, 111.22855058562658, 109.89796974828265, 112.78068777325248, 117.80550869036715, 118.4680557054793, 114.33258212280838]
แบบจำลองความผันผวนของสุ่มอ้างอิงจากกระดาษของ Heston (1993)
จาก qfin.simulations นำเข้า StochasticVarianceModel# 100 - ราคาสินทรัพย์อ้างอิงเริ่มต้น# 0 - การเคลื่อนตัวของสินทรัพย์อ้างอิง (mu)# .01 - อัตราดอกเบี้ยปลอดความเสี่ยง# .05 - เงินปันผลต่อเนื่อง# 2 - อัตราที่ความแปรปรวนเปลี่ยนกลับไปเป็นระยะยาวโดยนัย ความแปรปรวน# .25 - ความแปรปรวนระยะยาวโดยนัยเนื่องจากเวลามีแนวโน้มเป็นอนันต์# -.7 - ความสัมพันธ์ของการเคลื่อนไหวที่สร้างขึ้น# .3 - ความแปรปรวน ความผันผวน# 1/52 - ขั้นตอนของเวลา (dt)# 1 - เวลาในการครบกำหนด (ปี)svm = StochasticVarianceModel(100, 0, .01, .05, 2, .25, -.7, .3, .09, 1 /52, 1)
พิมพ์ (svm.simulated_path)
[98.21311553503577, 100.4491317019877, 89.78475515902066, 89.0169762497475, 90.70468848525869, 86.00821802256675, 80.74984494892573, 89.05033807013137, 88.51410029337134, 78.69736798230346, 81.90948751054125, 83.02502248913251, 83.46375102829755, 85.39018282900138, 78.97401642238059, 78.93505221741903, 81.33268688455111, 85.12156706038515, 79.6351983987908, 84.2375291273571, 82.80206517176038, 89.63659376223292, 89.22438477640516, 89.13899271995662, 94.60123239511816, 91.200165507022, 96.0578905115345, 87.45399399599378, 97.908745925816, 97.93068975065052, 103.32091104292813, 110.58066464778392, 105.21520242908348, 99.4655106985056, 106.74882010453683, 112.0058519886151, 110.20930861932342, 105.11835510815085, 113.59852610881678, 107.13315204738092, 108.36549026977205, 113.49809943785571, 122.67910031073885, 137.70966794451425, 146.13877267735612, 132.9973784430374, 129.75750117504984, 128.7467891695649, 127.13115959080305, 130.47967713110302, 129.84273088908265, 129.6411527208744]
การกำหนดราคาจำลองสำหรับออปชั่นแปลกใหม่นั้นมีให้ภายใต้สมมติฐานที่เกี่ยวข้องกับกระบวนการสุ่มที่เกี่ยวข้อง การเคลื่อนที่แบบบราวเนียนเชิงเรขาคณิตเป็นกระบวนการสุ่มพื้นฐานที่ใช้ในการจำลองแบบมอนติคาร์โลแต่ละครั้ง อย่างไรก็ตาม หากมีการระบุพารามิเตอร์เพิ่มเติม กระบวนการสุ่มที่เหมาะสมจะถูกนำมาใช้เพื่อสร้างแต่ละเส้นทางตัวอย่าง
จาก qfin.simulations import MonteCarloCallจาก qfin.simulations import MonteCarloPut# 100 - ราคาใช้สิทธิ# 1000 - จำนวนเส้นทางราคาจำลอง# .01 - อัตราดอกเบี้ยปลอดความเสี่ยง# 100 - ราคาสินทรัพย์อ้างอิงเริ่มต้น# 0 - การเคลื่อนตัวของสินทรัพย์อ้างอิง (mu)# .3 - ความผันผวนของสินทรัพย์อ้างอิง# 1/52 - ขั้นตอนเวลา (dt)# 1 - เวลาในการครบกำหนด (ปี)call_option = MonteCarloCall(100, 1000, .01, 100, 0, .3, 1/52, 1)# พารามิเตอร์เพิ่มเติมเหล่านี้จะสร้างราคา Monte Carlo ตามกระบวนการสุ่มความผันผวน # 2 - อัตราที่ความแปรปรวน เปลี่ยนกลับไปเป็นความแปรปรวนระยะยาวโดยนัย # .25 - ความแปรปรวนระยะยาวโดยนัยตามเวลามีแนวโน้มที่จะไม่มีที่สิ้นสุด # -.5 - สหสัมพันธ์ของการเคลื่อนไหวที่สร้างขึ้น# .02 - การจ่ายเงินปันผลอย่างต่อเนื่อง# .3 - ตัวเลือกความผันผวนของความแปรปรวน = MonteCarloPut(100, 1000, .01, 100, 0, .3, 1/52, 1, 2, .25, -.5, . 02, .3)
พิมพ์(call_option.price)พิมพ์(put_option.price)
12.73812121792851 23.195814963576286
จาก qfin.simulations import MonteCarloBinaryCallจาก qfin.simulations import MonteCarloBinaryPut# 100 - ราคาใช้สิทธิ# 50 - การจ่ายเงิน binary option# 1000 - จำนวนเส้นทางราคาจำลอง# .01 - อัตราดอกเบี้ยปลอดความเสี่ยง# 100 - ราคาสินทรัพย์อ้างอิงเริ่มต้น# 0 - ข้อมูลอ้างอิง ดริฟท์สินทรัพย์ (mu)# .3 - ความผันผวนของสินทรัพย์อ้างอิง # 1/52 - ขั้นตอนของเวลา (dt)# 1 - เวลาในการครบกำหนด (ปี)binary_call = MonteCarloBinaryCall(100, 50, 1000, .01, 100, 0, .3, 1/52, 1)binary_put = MonteCarloBinaryPut(100, 50, 1000 , .01, 100, 0, .3, 1/52, 1)
พิมพ์(binary_call.price)พิมพ์(binary_put.price)
22.42462873441866 27.869902820039087
จาก qfin.simulations import MonteCarloBarrierCallจาก qfin.simulations import MonteCarloBarrierPut# 100 - ราคาใช้สิทธิ# 50 - การจ่ายเงิน binary option# 1000 - จำนวนเส้นทางราคาจำลอง# .01 - อัตราดอกเบี้ยปลอดความเสี่ยง# 100 - ราคาสินทรัพย์อ้างอิงเริ่มต้น# 0 - ข้อมูลอ้างอิง ดริฟท์สินทรัพย์ (mu)# .3 - ความผันผวนของสินทรัพย์อ้างอิง# 1/52 - ขั้นเวลา (dt)# 1 - เวลาในการครบกำหนด (ปี)# จริง/เท็จ - สิ่งกีดขวางขึ้นหรือลง# จริง/เท็จ - สิ่งกีดขวางอยู่ในหรือนอกอุปสรรค_call = MonteCarloBarrierCall(100, 1000, 150, .01, 100, 0 , .3, 1/52, 1, ขึ้น=True, ออก=True)barrier_put = MonteCarloBarrierCall(100, 1000, 95, .01, 100, 0, .3, 1/52, 1, ขึ้น=เท็จ, ออก=เท็จ)
พิมพ์(binary_call.price)พิมพ์(binary_put.price)
4.895841997908933 5.565856754630819
จาก qfin.simulations import MonteCarloAsianCallจาก qfin.simulations import MonteCarloAsianPut# 100 - ราคาใช้สิทธิ# 1000 - จำนวนเส้นทางราคาจำลอง# .01 - อัตราดอกเบี้ยปลอดความเสี่ยง# 100 - ราคาสินทรัพย์อ้างอิงเริ่มต้น# 0 - การเคลื่อนตัวของสินทรัพย์อ้างอิง (mu)# .3 - ความผันผวนของสินทรัพย์อ้างอิง # 1/52 - ขั้นตอนเวลา (dt) # 1 - เวลาในการ อายุครบกำหนด (ปี)asian_call = MonteCarloAsianCall(100, 1000, .01, 100, 0, .3, 1/52, 1)asian_put = MonteCarloAsianPut(100, 1000, .01, 100, 0, .3, 1/52, 1)
พิมพ์(asian_call.price)พิมพ์(asian_put.price)
6.688201154529573 7.123274528125894
จาก qfin.simulations import MonteCarloExtendibleCallจาก qfin.simulations import MontecarloExtendiblePut# 100 - ราคาใช้สิทธิ# 1000 - จำนวนเส้นทางราคาจำลอง# .01 - อัตราดอกเบี้ยปลอดความเสี่ยง# 100 - ราคาสินทรัพย์อ้างอิงเริ่มต้น# 0 - การเคลื่อนตัวของสินทรัพย์อ้างอิง (mu)# .3 - ความผันผวนของสินทรัพย์อ้างอิง # 1/52 - ขั้นตอนเวลา (dt)# 1 - ระยะเวลาครบกำหนด (ปี)# .5 - การขยายเวลาหากเงินหมดเมื่อหมดอายุextendible_call = MonteCarloExtendibleCall(100, 1000, .01, 100, 0, .3, 1/52, 1, .5)extendible_put = MonteCarloExtendiblePut( 100, 1,000, .01, 100, 0, .3, 1/52, 1, .5)
พิมพ์(extendible_call.price)พิมพ์(extendible_put.price)
13.60274931789973 13.20330578685724