fima 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
fima-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Your Name
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
fima-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,270 @@
1
+ Metadata-Version: 2.4
2
+ Name: fima
3
+ Version: 0.1.0
4
+ Summary: fima – A Python package for scraping and analyzing Iran’s financial market data. It currently supports bonds and options, with tools for calculating BSM prices, greeks, and implied volatility. Future versions will expand to include other instruments such as commodities and more.
5
+ Home-page: https://github.com/hemoboghosian/fima
6
+ Author: Hemo Boghosian
7
+ Author-email: Hemo Boghosian <HemoBoghosian@gmail.com>
8
+ License: MIT
9
+ Project-URL: Homepage, https://github.com/hemoboghosian/fima
10
+ Requires-Python: >=3.10
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: pandas
14
+ Requires-Dist: requests
15
+ Requires-Dist: jdatetime
16
+ Requires-Dist: numpy
17
+ Requires-Dist: scipy
18
+ Requires-Dist: bs4
19
+ Requires-Dist: selenium
20
+ Requires-Dist: mibian
21
+ Requires-Dist: lxml
22
+ Dynamic: author
23
+ Dynamic: home-page
24
+ Dynamic: license-file
25
+ Dynamic: requires-python
26
+
27
+ # fima
28
+ ## معرفی و هدف
29
+
30
+
31
+ این کتابخانه جهت دسترسی آسان و سریع به داده‌های بازارهای مالی ایران با زبان برنامه‌نویسی پایتون پیاده‌سازی شده است. هدف نهایی این پروژه، ساخت کتابخانه‌ای جامع جهت استخراج، ساختاردهی و تحلیل داده‌های مالی از منابع مختلف موجود است.
32
+ **این کتابخانه هنوز در حال توسعه و تکامل است و ممکن است در برخی قسمت‌ها اشتباهاتی داشته باشد. لطفاً اگر خطا یا نقصی دیدید اطلاع دهید.**
33
+
34
+ ## اطلاعات تماس
35
+ * ایمیل: HemoBoghosian@gmail.com
36
+ * تلگرام: @HemoBoghosian
37
+
38
+ ## نصب کتابخانه
39
+ ```
40
+ pip install fima
41
+ ```
42
+
43
+ ## توابع مربوط به اختیارهای معامله
44
+ ### فراخوانی تمام توابع
45
+
46
+ ```python
47
+ from fima.Options import *
48
+ ```
49
+
50
+ ### دریافت سابقه قیمت اختیار معامله و دارایی پایه آن
51
+
52
+ ```python
53
+ from fima.Options import download_historical_data
54
+
55
+ option_historical_data, ua_historical_data = download_historical_data(ticker='ضهرم4018', start_date='1404-01-01',
56
+ end_date='1404-01-31')
57
+ ```
58
+ #### ورودی
59
+ * ticker: نماد اختیار معامله
60
+ * start_date: تاریخ شروع داده‌ها
61
+ * end_date: تاریخ پایان داده‌ها
62
+
63
+ #### خروجی
64
+ * option_historical_data: سابقه قیمت اختیار معامله
65
+ * ua_historical_data: سابقه قیمت دارایی پایه نماد وارد شده
66
+
67
+ ##### توجه: در صورت وارد نکردن تاریخ شروع و پایان، خروجی تابع تمام سابقه قیمت اختیار معامله و دارایی پایه آن خواهد بود.
68
+
69
+ ### دریافت اطلاعات لحظه‌ای یک نماد اختیار معامله
70
+
71
+ ```python
72
+ from fima.Options import ticker_info
73
+
74
+ ticker_info_data = ticker_info(ticker='ضهرم4018', j_date=True)
75
+ ```
76
+
77
+ #### ورود
78
+ * ticker: نماد اختیار معامله مد نظرم
79
+ * j_date: تاریخ شمسی
80
+
81
+ #### خروجی
82
+ * ticker_info_data: اطلاعات لحظه‌ای مربوط به نماد مد نظر
83
+
84
+ ### دریافت زنجیره قراردادهای یک دارایی پایه
85
+
86
+ ```python
87
+ from fima.Options import download_chain_contracts
88
+
89
+ chain_contracts = download_chain_contracts(underlying_ticker='اهرم', j_date=True, bsm=False, greeks=False,
90
+ implied_volatility=False)
91
+ ```
92
+ #### ورودی
93
+ * underlying_ticker: نماد دارایی پایه
94
+ * j_date: تاریخ شمسی
95
+ * bsm: محاسبه ارزش اختیار معامله با مدل بلک، شولز و مرتون
96
+ * greeks: محاسبه دلتا، تتا، گاما، رو و وگا
97
+ * implied_volatility: محاسبه نوسانات ضمنی
98
+
99
+ #### خروجی
100
+ * chain_contracts: اطلاعات تمامی زنجیره قراردادهای مربوط به دارایی پایه مد نظر
101
+
102
+ ##### توجه: برای محاسبات مربوط به مدل بلک، شولز و مرتون از میانگین نرخ بازده تا سررسید اسناد خزانه در آخرین تاریخ (دریافت‌شده از سایت فرابورس ایران) به عنوان نرخ بازده بدون ریسک استفاده می‌شود.
103
+
104
+ ### دریافت دیده‌بان بازار
105
+
106
+ ```python
107
+ from fima.Options import download_market_watch
108
+
109
+ market_watch = download_market_watch(market='All', stack='Vertical', j_date=True, bsm=False, greeks=False,
110
+ implied_volatility=False)
111
+ ```
112
+ #### ورودی
113
+ * market: بازار معامله اختیار معامله
114
+ * 'TSE': بورس اوراق بهادار تهران
115
+ * 'IFB': فرابورس ایران
116
+ * 'All': تمامی اختیارهای معامله
117
+ * stack: نحوه چینش داده‌ها
118
+ * 'Vertical': چینش عمودی داده‌ها
119
+ * 'Horizontal': چینش افقی داده‌ها
120
+ * j_date: تاریخ شمسی
121
+ * bsm: محاسبه ارزش اختیار معامله با مدل بلک، شولز و مرتون
122
+ * greeks: محاسبه دلتا، تتا، گاما، رو و وگا
123
+ * implied_volatility: محاسبه نوسانات ضمنی
124
+
125
+ #### خروجی
126
+ * market_watch: اطلاعات تمامی اختیارهای معامله بازار مد نظر
127
+
128
+ ##### توجه: برای محاسبات مربوط به مدل بلک، شولز و مرتون از میانگین نرخ بازده تا سررسید اسناد خزانه در آخرین تاریخ (دریافت‌شده از سایت فرابورس ایران) به عنوان نرخ بازده بدون ریسک استفاده می‌شود.
129
+
130
+ ### دریافت ارزش محاسبه‌شده توسط مدل بلک، شولز و مرتون برای یک نماد
131
+
132
+ ```python
133
+ from fima.Options import black_scholes_merton
134
+
135
+ volatility, bsm_price = black_scholes_merton(ticker='ضهرم4018')
136
+ ```
137
+ #### ورودی
138
+ * ticker: نماد اختیار معامله مد نظر
139
+
140
+ #### خروجی
141
+ * volatility: نوسانات دارایی پایه محاسبه‌شده در مدل
142
+ * bsm_price: ارزش محاسبه‌شده اختیار معامله مد نظر با مدل بلک، شولز و مرتون
143
+
144
+ ##### توجه
145
+ * توجه: در صورت عدم وارد کردن متغیر مربوط به نرخ بازده بدون ریسک، برای محاسبات مربوط به مدل بلک، شولز و مرتون از میانگین نرخ بازده تا سررسید اسناد خزانه در آخرین تاریخ (دریافت‌شده از سایت فرابورس ایران) به عنوان نرخ بازده بدون ریسک استفاده می‌شود.
146
+ * در صورتی که روزهای باقی‌مانده تا سررسید اختیار معامله کمتر از ۱۰ روز باشند، به دلیل احتمال خطا، مدل بلک، شولز و مرتون اعمال نخواهد شد.
147
+
148
+ ### دریافت گریکز برای یک نماد
149
+
150
+ ```python
151
+ from fima.Options import get_greeks
152
+
153
+ ticker_greeks = get_greeks(ticker='ضهرم4018')
154
+ ```
155
+ #### ورودی
156
+ * ticker: نماد اختیار معامله مد نظر
157
+ * r_f: نرخ بازده بدون ریسک
158
+ * minimum_required_history: کمینه دیتای مورد نیاز برای دارایی پایهجهت محاسبه نوسانات که به صورت پیش‌فرض ۳۰ روز در نظر گرفته شده است.
159
+
160
+ #### خروجی
161
+ * ticker_greeks: دلتا، تتا، گاما، وگا و رو برای نماد مد نظر
162
+
163
+ ##### توجه
164
+ * در صورت عدم وارد کردن متغیر مربوط به نرخ بازده بدون ریسک، برای محاسبات مربوط به مدل بلک، شولز و مرتون از میانگین نرخ بازده تا سررسید اسناد خزانه در آخرین تاریخ (دریافت‌شده از سایت فرابورس ایران) به عنوان نرخ بازده بدون ریسک استفاده می‌شود.
165
+ * در صورتی که روزهای باقی‌مانده تا سررسید اختیار معامله کمتر از ۱۰ روز باشند، به دلیل احتمال خطا، مدل بلک، شولز و مرتون اعمال نخواهد شد.
166
+
167
+ ### دریافت نوسانات ضمنی برای یک نماد
168
+
169
+ ```python
170
+ from fima.Options import get_implied_volatility
171
+
172
+ ticker_implied_volatility = get_implied_volatility(ticker='ضهرم4018')
173
+ ```
174
+ #### ورودی
175
+ * ticker: نماد اختیار معامله مد نظر
176
+ * r_f: نرخ بازده بدون ریسک
177
+ * minimum_required_history: کمینه دیتای مورد نیاز برای دارایی پایهجهت محاسبه نوسانات که به صورت پیش‌فرض ۳۰ روز در نظر گرفته شده است.
178
+
179
+ #### خروجی
180
+ * ticker_implied_volatility: نوسانات ضمنی برای نماد مد نظر
181
+
182
+ ##### توجه
183
+ * در صورت عدم وارد کردن متغیر مربوط به نرخ بازده بدون ریسک، برای محاسبات مربوط به مدل بلک، شولز و مرتون از میانگین نرخ بازده تا سررسید اسناد خزانه در آخرین تاریخ (دریافت‌شده از سایت فرابورس ایران) به عنوان نرخ بازده بدون ریسک استفاده می‌شود.
184
+ * در صورتی که روزهای باقی‌مانده تا سررسید اختیار معامله کمتر از ۱۰ روز باشند، به دلیل احتمال خطا، مدل بلک، شولز و مرتون اعمال نخواهد شد.
185
+
186
+ ### دریافت تمامی نمادهای دارای اختیار معامله
187
+
188
+ ```python
189
+ from fima.Options import download_all_underlying_assets
190
+
191
+ all_underlying_assets = download_all_underlying_assets(market='All')
192
+ ```
193
+ #### ورودی
194
+ * market: بازار معامله اختیار معامله
195
+ * 'TSE': بورس اوراق بهادار تهران
196
+ * 'IFB': فرابورس ایران
197
+ * 'All': تمامی اختیارهای معامله (حالت پیش‌فرض)
198
+
199
+ #### خروجی
200
+ * all_underlying_assets: اطلاعات مربوط به نمادهای دارای اختیار معامله
201
+
202
+ #### توجه: در صورت عدم وارد کردن market، تمامی اختیارهای معامله دریافت خواهد شد.
203
+
204
+ ### توابع مربوط به محاسبات
205
+
206
+ ```python
207
+ from fima.Options import (calculate_black_scholes_merton, calculate_delta, calculate_vega,
208
+ calculate_theta, calculate_gamma, calculate_rho)
209
+
210
+ bsm_price = calculate_black_scholes_merton(s=550, k=28000, option_type='Call', t=71, sigma=0.9588, r_f=0.3372)
211
+ delta = calculate_delta(s=550, k=28000, option_type='Call', t=71, sigma=0.9588, r_f=0.3372)
212
+ theta = calculate_theta(s=550, k=28000, option_type='Call', t=71, sigma=0.9588, r_f=0.3372)
213
+ gamma = calculate_gamma(s=550, k=28000, t=71, sigma=0.9588, r_f=0.3372)
214
+ rho = calculate_rho(s=550, k=28000, option_type='Call', t=71, sigma=0.9588, r_f=0.3372)
215
+ vega = calculate_vega(s=550, k=28000, t=71, sigma=0.9588, r_f=0.3372)
216
+ ```
217
+
218
+ ## توابع مربوط به اوراق درآمد ثابت
219
+ ### فراخوانی تمام توابع
220
+
221
+ ```python
222
+ from fima.Bonds import *
223
+ ```
224
+
225
+ ### دریافت سابقه قیمت اختیار معامله و دارایی پایه آن
226
+
227
+ ```python
228
+ from fima.Bonds import get_risk_free_rate
229
+
230
+ risk_free_rate = get_risk_free_rate()
231
+ ```
232
+
233
+ #### خروجی
234
+ * risk_free_rate: میانگین نرخ بازده تا سررسید اسناد خزانه در آخرین تاریخ (دریافت‌شده از سایت فرابورس ایران)
235
+
236
+ ### دریافت اوراق درآمد ثابت بدون کوپن
237
+
238
+ ```python
239
+ from fima.Bonds import get_all_bonds_without_coupons
240
+
241
+ all_bonds_without_coupons = get_all_bonds_without_coupons(deprecated=True)
242
+ ```
243
+
244
+ #### ورودی
245
+ * deprecated:
246
+ * True: اوراق سررسید شده نیز در خروجی بیاید
247
+ * False: اوراق سررسید شده در خروجی نیاید
248
+ #### خروجی
249
+ * all_bonds_without_coupons: اطلاعات مربوط به اوراق درآمد ثابت بدون کوپن (دریاقت‌شده از سایت فرابورس ایران)
250
+
251
+ ### دریافت اوراق درآمد ثابت با کوپن
252
+
253
+ ```python
254
+ from fima.Bonds import get_all_bonds_with_coupons
255
+
256
+ all_bonds_with_coupons = get_all_bonds_with_coupons(deprecated=True)
257
+ ```
258
+
259
+ #### ورودی
260
+ * deprecated:
261
+ * True: اوراق سررسید شده نیز در خروجی بیاید
262
+ * False: اوراق سررسید شده در خروجی نیاید
263
+ #### خروجی
264
+ * all_bonds_without_coupons: اطلاعات مربوط به اوراق درآمد ثابت با کوپن (دریاقت‌شده از سایت فرابورس ایران)
265
+
266
+ ## نقشه راه
267
+ 1. [ ] عیب‌یابی و بهبود توابع پیاده‌سازی‌شده
268
+ 2. [ ] دریافت اطلاعات از سایت tgju
269
+ 3. [ ] دریافت اطلاعات از سایت tsetmc
270
+ 4. [ ] دریافت و پاکسازی اطلاعات سایت codal
fima-0.1.0/README.md ADDED
@@ -0,0 +1,244 @@
1
+ # fima
2
+ ## معرفی و هدف
3
+
4
+
5
+ این کتابخانه جهت دسترسی آسان و سریع به داده‌های بازارهای مالی ایران با زبان برنامه‌نویسی پایتون پیاده‌سازی شده است. هدف نهایی این پروژه، ساخت کتابخانه‌ای جامع جهت استخراج، ساختاردهی و تحلیل داده‌های مالی از منابع مختلف موجود است.
6
+ **این کتابخانه هنوز در حال توسعه و تکامل است و ممکن است در برخی قسمت‌ها اشتباهاتی داشته باشد. لطفاً اگر خطا یا نقصی دیدید اطلاع دهید.**
7
+
8
+ ## اطلاعات تماس
9
+ * ایمیل: HemoBoghosian@gmail.com
10
+ * تلگرام: @HemoBoghosian
11
+
12
+ ## نصب کتابخانه
13
+ ```
14
+ pip install fima
15
+ ```
16
+
17
+ ## توابع مربوط به اختیارهای معامله
18
+ ### فراخوانی تمام توابع
19
+
20
+ ```python
21
+ from fima.Options import *
22
+ ```
23
+
24
+ ### دریافت سابقه قیمت اختیار معامله و دارایی پایه آن
25
+
26
+ ```python
27
+ from fima.Options import download_historical_data
28
+
29
+ option_historical_data, ua_historical_data = download_historical_data(ticker='ضهرم4018', start_date='1404-01-01',
30
+ end_date='1404-01-31')
31
+ ```
32
+ #### ورودی
33
+ * ticker: نماد اختیار معامله
34
+ * start_date: تاریخ شروع داده‌ها
35
+ * end_date: تاریخ پایان داده‌ها
36
+
37
+ #### خروجی
38
+ * option_historical_data: سابقه قیمت اختیار معامله
39
+ * ua_historical_data: سابقه قیمت دارایی پایه نماد وارد شده
40
+
41
+ ##### توجه: در صورت وارد نکردن تاریخ شروع و پایان، خروجی تابع تمام سابقه قیمت اختیار معامله و دارایی پایه آن خواهد بود.
42
+
43
+ ### دریافت اطلاعات لحظه‌ای یک نماد اختیار معامله
44
+
45
+ ```python
46
+ from fima.Options import ticker_info
47
+
48
+ ticker_info_data = ticker_info(ticker='ضهرم4018', j_date=True)
49
+ ```
50
+
51
+ #### ورود
52
+ * ticker: نماد اختیار معامله مد نظرم
53
+ * j_date: تاریخ شمسی
54
+
55
+ #### خروجی
56
+ * ticker_info_data: اطلاعات لحظه‌ای مربوط به نماد مد نظر
57
+
58
+ ### دریافت زنجیره قراردادهای یک دارایی پایه
59
+
60
+ ```python
61
+ from fima.Options import download_chain_contracts
62
+
63
+ chain_contracts = download_chain_contracts(underlying_ticker='اهرم', j_date=True, bsm=False, greeks=False,
64
+ implied_volatility=False)
65
+ ```
66
+ #### ورودی
67
+ * underlying_ticker: نماد دارایی پایه
68
+ * j_date: تاریخ شمسی
69
+ * bsm: محاسبه ارزش اختیار معامله با مدل بلک، شولز و مرتون
70
+ * greeks: محاسبه دلتا، تتا، گاما، رو و وگا
71
+ * implied_volatility: محاسبه نوسانات ضمنی
72
+
73
+ #### خروجی
74
+ * chain_contracts: اطلاعات تمامی زنجیره قراردادهای مربوط به دارایی پایه مد نظر
75
+
76
+ ##### توجه: برای محاسبات مربوط به مدل بلک، شولز و مرتون از میانگین نرخ بازده تا سررسید اسناد خزانه در آخرین تاریخ (دریافت‌شده از سایت فرابورس ایران) به عنوان نرخ بازده بدون ریسک استفاده می‌شود.
77
+
78
+ ### دریافت دیده‌بان بازار
79
+
80
+ ```python
81
+ from fima.Options import download_market_watch
82
+
83
+ market_watch = download_market_watch(market='All', stack='Vertical', j_date=True, bsm=False, greeks=False,
84
+ implied_volatility=False)
85
+ ```
86
+ #### ورودی
87
+ * market: بازار معامله اختیار معامله
88
+ * 'TSE': بورس اوراق بهادار تهران
89
+ * 'IFB': فرابورس ایران
90
+ * 'All': تمامی اختیارهای معامله
91
+ * stack: نحوه چینش داده‌ها
92
+ * 'Vertical': چینش عمودی داده‌ها
93
+ * 'Horizontal': چینش افقی داده‌ها
94
+ * j_date: تاریخ شمسی
95
+ * bsm: محاسبه ارزش اختیار معامله با مدل بلک، شولز و مرتون
96
+ * greeks: محاسبه دلتا، تتا، گاما، رو و وگا
97
+ * implied_volatility: محاسبه نوسانات ضمنی
98
+
99
+ #### خروجی
100
+ * market_watch: اطلاعات تمامی اختیارهای معامله بازار مد نظر
101
+
102
+ ##### توجه: برای محاسبات مربوط به مدل بلک، شولز و مرتون از میانگین نرخ بازده تا سررسید اسناد خزانه در آخرین تاریخ (دریافت‌شده از سایت فرابورس ایران) به عنوان نرخ بازده بدون ریسک استفاده می‌شود.
103
+
104
+ ### دریافت ارزش محاسبه‌شده توسط مدل بلک، شولز و مرتون برای یک نماد
105
+
106
+ ```python
107
+ from fima.Options import black_scholes_merton
108
+
109
+ volatility, bsm_price = black_scholes_merton(ticker='ضهرم4018')
110
+ ```
111
+ #### ورودی
112
+ * ticker: نماد اختیار معامله مد نظر
113
+
114
+ #### خروجی
115
+ * volatility: نوسانات دارایی پایه محاسبه‌شده در مدل
116
+ * bsm_price: ارزش محاسبه‌شده اختیار معامله مد نظر با مدل بلک، شولز و مرتون
117
+
118
+ ##### توجه
119
+ * توجه: در صورت عدم وارد کردن متغیر مربوط به نرخ بازده بدون ریسک، برای محاسبات مربوط به مدل بلک، شولز و مرتون از میانگین نرخ بازده تا سررسید اسناد خزانه در آخرین تاریخ (دریافت‌شده از سایت فرابورس ایران) به عنوان نرخ بازده بدون ریسک استفاده می‌شود.
120
+ * در صورتی که روزهای باقی‌مانده تا سررسید اختیار معامله کمتر از ۱۰ روز باشند، به دلیل احتمال خطا، مدل بلک، شولز و مرتون اعمال نخواهد شد.
121
+
122
+ ### دریافت گریکز برای یک نماد
123
+
124
+ ```python
125
+ from fima.Options import get_greeks
126
+
127
+ ticker_greeks = get_greeks(ticker='ضهرم4018')
128
+ ```
129
+ #### ورودی
130
+ * ticker: نماد اختیار معامله مد نظر
131
+ * r_f: نرخ بازده بدون ریسک
132
+ * minimum_required_history: کمینه دیتای مورد نیاز برای دارایی پایهجهت محاسبه نوسانات که به صورت پیش‌فرض ۳۰ روز در نظر گرفته شده است.
133
+
134
+ #### خروجی
135
+ * ticker_greeks: دلتا، تتا، گاما، وگا و رو برای نماد مد نظر
136
+
137
+ ##### توجه
138
+ * در صورت عدم وارد کردن متغیر مربوط به نرخ بازده بدون ریسک، برای محاسبات مربوط به مدل بلک، شولز و مرتون از میانگین نرخ بازده تا سررسید اسناد خزانه در آخرین تاریخ (دریافت‌شده از سایت فرابورس ایران) به عنوان نرخ بازده بدون ریسک استفاده می‌شود.
139
+ * در صورتی که روزهای باقی‌مانده تا سررسید اختیار معامله کمتر از ۱۰ روز باشند، به دلیل احتمال خطا، مدل بلک، شولز و مرتون اعمال نخواهد شد.
140
+
141
+ ### دریافت نوسانات ضمنی برای یک نماد
142
+
143
+ ```python
144
+ from fima.Options import get_implied_volatility
145
+
146
+ ticker_implied_volatility = get_implied_volatility(ticker='ضهرم4018')
147
+ ```
148
+ #### ورودی
149
+ * ticker: نماد اختیار معامله مد نظر
150
+ * r_f: نرخ بازده بدون ریسک
151
+ * minimum_required_history: کمینه دیتای مورد نیاز برای دارایی پایهجهت محاسبه نوسانات که به صورت پیش‌فرض ۳۰ روز در نظر گرفته شده است.
152
+
153
+ #### خروجی
154
+ * ticker_implied_volatility: نوسانات ضمنی برای نماد مد نظر
155
+
156
+ ##### توجه
157
+ * در صورت عدم وارد کردن متغیر مربوط به نرخ بازده بدون ریسک، برای محاسبات مربوط به مدل بلک، شولز و مرتون از میانگین نرخ بازده تا سررسید اسناد خزانه در آخرین تاریخ (دریافت‌شده از سایت فرابورس ایران) به عنوان نرخ بازده بدون ریسک استفاده می‌شود.
158
+ * در صورتی که روزهای باقی‌مانده تا سررسید اختیار معامله کمتر از ۱۰ روز باشند، به دلیل احتمال خطا، مدل بلک، شولز و مرتون اعمال نخواهد شد.
159
+
160
+ ### دریافت تمامی نمادهای دارای اختیار معامله
161
+
162
+ ```python
163
+ from fima.Options import download_all_underlying_assets
164
+
165
+ all_underlying_assets = download_all_underlying_assets(market='All')
166
+ ```
167
+ #### ورودی
168
+ * market: بازار معامله اختیار معامله
169
+ * 'TSE': بورس اوراق بهادار تهران
170
+ * 'IFB': فرابورس ایران
171
+ * 'All': تمامی اختیارهای معامله (حالت پیش‌فرض)
172
+
173
+ #### خروجی
174
+ * all_underlying_assets: اطلاعات مربوط به نمادهای دارای اختیار معامله
175
+
176
+ #### توجه: در صورت عدم وارد کردن market، تمامی اختیارهای معامله دریافت خواهد شد.
177
+
178
+ ### توابع مربوط به محاسبات
179
+
180
+ ```python
181
+ from fima.Options import (calculate_black_scholes_merton, calculate_delta, calculate_vega,
182
+ calculate_theta, calculate_gamma, calculate_rho)
183
+
184
+ bsm_price = calculate_black_scholes_merton(s=550, k=28000, option_type='Call', t=71, sigma=0.9588, r_f=0.3372)
185
+ delta = calculate_delta(s=550, k=28000, option_type='Call', t=71, sigma=0.9588, r_f=0.3372)
186
+ theta = calculate_theta(s=550, k=28000, option_type='Call', t=71, sigma=0.9588, r_f=0.3372)
187
+ gamma = calculate_gamma(s=550, k=28000, t=71, sigma=0.9588, r_f=0.3372)
188
+ rho = calculate_rho(s=550, k=28000, option_type='Call', t=71, sigma=0.9588, r_f=0.3372)
189
+ vega = calculate_vega(s=550, k=28000, t=71, sigma=0.9588, r_f=0.3372)
190
+ ```
191
+
192
+ ## توابع مربوط به اوراق درآمد ثابت
193
+ ### فراخوانی تمام توابع
194
+
195
+ ```python
196
+ from fima.Bonds import *
197
+ ```
198
+
199
+ ### دریافت سابقه قیمت اختیار معامله و دارایی پایه آن
200
+
201
+ ```python
202
+ from fima.Bonds import get_risk_free_rate
203
+
204
+ risk_free_rate = get_risk_free_rate()
205
+ ```
206
+
207
+ #### خروجی
208
+ * risk_free_rate: میانگین نرخ بازده تا سررسید اسناد خزانه در آخرین تاریخ (دریافت‌شده از سایت فرابورس ایران)
209
+
210
+ ### دریافت اوراق درآمد ثابت بدون کوپن
211
+
212
+ ```python
213
+ from fima.Bonds import get_all_bonds_without_coupons
214
+
215
+ all_bonds_without_coupons = get_all_bonds_without_coupons(deprecated=True)
216
+ ```
217
+
218
+ #### ورودی
219
+ * deprecated:
220
+ * True: اوراق سررسید شده نیز در خروجی بیاید
221
+ * False: اوراق سررسید شده در خروجی نیاید
222
+ #### خروجی
223
+ * all_bonds_without_coupons: اطلاعات مربوط به اوراق درآمد ثابت بدون کوپن (دریاقت‌شده از سایت فرابورس ایران)
224
+
225
+ ### دریافت اوراق درآمد ثابت با کوپن
226
+
227
+ ```python
228
+ from fima.Bonds import get_all_bonds_with_coupons
229
+
230
+ all_bonds_with_coupons = get_all_bonds_with_coupons(deprecated=True)
231
+ ```
232
+
233
+ #### ورودی
234
+ * deprecated:
235
+ * True: اوراق سررسید شده نیز در خروجی بیاید
236
+ * False: اوراق سررسید شده در خروجی نیاید
237
+ #### خروجی
238
+ * all_bonds_without_coupons: اطلاعات مربوط به اوراق درآمد ثابت با کوپن (دریاقت‌شده از سایت فرابورس ایران)
239
+
240
+ ## نقشه راه
241
+ 1. [ ] عیب‌یابی و بهبود توابع پیاده‌سازی‌شده
242
+ 2. [ ] دریافت اطلاعات از سایت tgju
243
+ 3. [ ] دریافت اطلاعات از سایت tsetmc
244
+ 4. [ ] دریافت و پاکسازی اطلاعات سایت codal
@@ -0,0 +1,102 @@
1
+ import requests
2
+ import pandas as pd
3
+ import numpy as np
4
+ from bs4 import BeautifulSoup
5
+ from io import StringIO
6
+ import jdatetime as jd
7
+
8
+
9
+ def get_risk_free_rate() -> float:
10
+ all_bonds_without_coupons = get_all_bonds_without_coupons(deprecated=False)
11
+ all_t_notes = all_bonds_without_coupons[all_bonds_without_coupons['Ticker'].str.contains('سخاب|اخزا')].copy()
12
+ today_date = jd.date.today()
13
+ all_t_notes['DaysTillMaturity'] = (all_t_notes['MaturityDate'] - today_date).apply(lambda delta: delta.days)
14
+ last_traded_t_notes = all_t_notes[all_t_notes['LastTradedDate'] == all_t_notes['LastTradedDate'].max()]
15
+ rf = last_traded_t_notes['YTM'].mean()
16
+ return rf
17
+
18
+
19
+ def get_all_bonds_without_coupons(deprecated: bool = True) -> pd.DataFrame:
20
+ url = "https://ifb.ir/YTM.aspx"
21
+
22
+ session = requests.Session()
23
+ response = session.get(url)
24
+
25
+ if response.status_code != 200:
26
+ print(f"Failed to access page. Status code: {response.status_code}")
27
+ return None
28
+
29
+ soup = BeautifulSoup(response.content, "html.parser")
30
+ table = soup.find("table", {"id": "ContentPlaceHolder1_grdytmforkhazaneh", "class": "KhazanehGrid"})
31
+
32
+ if table is None:
33
+ print("Table not found.")
34
+ return None
35
+
36
+ df_list = pd.read_html(StringIO(str(table)))
37
+ bonds_without_coupons = df_list[0]
38
+
39
+ if ~deprecated:
40
+ bonds_without_coupons = bonds_without_coupons[bonds_without_coupons['YTM'] != 'سررسید شده'].copy()
41
+
42
+ bonds_without_coupons.columns = ['Index', 'Ticker', 'LastTradedPrice', 'LastTradedDate', 'MaturityDate', 'YTM', 'SimpleReturn']
43
+
44
+ bonds_without_coupons['LastTradedDate'] = \
45
+ bonds_without_coupons['LastTradedDate'].apply(lambda str_date: jd.date(year=int(str_date[:4]),
46
+ month=int(str_date[5:7]),
47
+ day=int(str_date[8:])))
48
+
49
+ bonds_without_coupons['MaturityDate'] = \
50
+ bonds_without_coupons['MaturityDate'].apply(lambda str_date: jd.date(year=int(str_date[:4]),
51
+ month=int(str_date[5:7]),
52
+ day=int(str_date[8:])))
53
+
54
+ bonds_without_coupons['YTM'] = \
55
+ bonds_without_coupons['YTM'].apply(lambda str_ytm: float(str_ytm.replace('/', '.').replace('%', '')) / 100)
56
+ bonds_without_coupons['SimpleReturn'] = \
57
+ bonds_without_coupons['SimpleReturn'].apply(lambda str_ytm: float(str_ytm.replace('/', '.').replace('%', '')) / 100)
58
+
59
+ bonds_without_coupons.drop('Index', inplace=True, axis=1)
60
+ bonds_without_coupons.reset_index(inplace=True, drop=True)
61
+
62
+ return bonds_without_coupons
63
+
64
+
65
+ def get_all_bonds_with_coupons(deprecated: bool = True) -> pd.DataFrame:
66
+ url = "https://ifb.ir/YTM.aspx"
67
+
68
+ session = requests.Session()
69
+ response = session.get(url)
70
+
71
+ if response.status_code != 200:
72
+ print(f"Failed to access page. Status code: {response.status_code}")
73
+ return None
74
+
75
+ soup = BeautifulSoup(response.content, "html.parser")
76
+ table = soup.find("table", {"id": "ContentPlaceHolder1_grdytm", "class": "mGrid"})
77
+
78
+ if table is None:
79
+ print("Table not found.")
80
+ return None
81
+
82
+ df_list = pd.read_html(StringIO(str(table)))
83
+ bonds_with_coupons = df_list[0]
84
+
85
+ if ~deprecated:
86
+ bonds_with_coupons = bonds_with_coupons[bonds_with_coupons['YTM'] != 'سررسید شده'].copy()
87
+
88
+ bonds_with_coupons.columns = ['Index', 'Ticker', 'LastTradedPrice', 'LastTradedDate', 'MaturityDate', 'YTM']
89
+
90
+ bonds_with_coupons['LastTradedDate'] = bonds_with_coupons['LastTradedDate'].apply(
91
+ lambda str_date: jd.date(year=int(str_date[:4]), month=int(str_date[5:7]), day=int(str_date[8:])) if pd.notna(str_date) else np.nan)
92
+
93
+ bonds_with_coupons['MaturityDate'] = bonds_with_coupons['MaturityDate'].apply(
94
+ lambda str_date: jd.date(year=int(str_date[:4]), month=int(str_date[5:7]), day=int(str_date[8:])) if str_date != '0' else np.nan)
95
+
96
+ bonds_with_coupons['YTM'] = bonds_with_coupons['YTM'].apply(
97
+ lambda str_ytm: float(str_ytm.replace('/', '.').replace('%', '')) / 100 if (pd.notna(str_ytm) and str_ytm != 'سررسید شده') else np.nan)
98
+
99
+ bonds_with_coupons.drop('Index', inplace=True, axis=1)
100
+ bonds_with_coupons.reset_index(inplace=True, drop=True)
101
+
102
+ return bonds_with_coupons