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 +21 -0
- fima-0.1.0/PKG-INFO +270 -0
- fima-0.1.0/README.md +244 -0
- fima-0.1.0/fima/Bonds.py +102 -0
- fima-0.1.0/fima/Options.py +675 -0
- fima-0.1.0/fima/__init__.py +9 -0
- fima-0.1.0/fima.egg-info/PKG-INFO +270 -0
- fima-0.1.0/fima.egg-info/SOURCES.txt +15 -0
- fima-0.1.0/fima.egg-info/dependency_links.txt +1 -0
- fima-0.1.0/fima.egg-info/requires.txt +9 -0
- fima-0.1.0/fima.egg-info/top_level.txt +2 -0
- fima-0.1.0/pyproject.toml +16 -0
- fima-0.1.0/setup.cfg +4 -0
- fima-0.1.0/setup.py +27 -0
- fima-0.1.0/test/TestBonds.py +26 -0
- fima-0.1.0/test/TestOptions.py +123 -0
- fima-0.1.0/test/__init__.py +0 -0
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
|
fima-0.1.0/fima/Bonds.py
ADDED
|
@@ -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
|