Skip to content

Commit 736f364

Browse files
committed
Make FinancePy an optional dependency
1 parent 4ac17a3 commit 736f364

File tree

5 files changed

+104
-58
lines changed

5 files changed

+104
-58
lines changed

finmarketpy/curve/volatility/fxoptionspricer.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,14 @@
2525
from finmarketpy.curve.abstractpricer import AbstractPricer
2626
from finmarketpy.curve.rates.fxforwardspricer import FXForwardsPricer
2727

28-
from financepy.utils.date import Date
29-
from financepy.models.black_scholes import BlackScholes
30-
from financepy.products.fx.fx_vanilla_option import FXVanillaOption
31-
from financepy.utils.global_types import OptionTypes
28+
# FinancePy is an optional dependency
29+
try:
30+
from financepy.utils.date import Date
31+
from financepy.models.black_scholes import BlackScholes
32+
from financepy.products.fx.fx_vanilla_option import FXVanillaOption
33+
from financepy.utils.global_types import OptionTypes
34+
except:
35+
pass
3236

3337
# from financepy.products.fx.FinFXMktConventions import *
3438

finmarketpy/curve/volatility/fxvolsurface.py

+18-16
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,24 @@
1919
import pandas as pd
2020
import numpy as np
2121

22-
from financepy.market.curves.discount_curve_flat import DiscountCurveFlat
23-
from financepy.utils.date import Date
24-
25-
# Tested with financepy 0.310 only
26-
27-
from financepy.market.volatility.fx_vol_surface_plus import \
28-
FXVolSurfacePlus \
29-
as FinFXVolSurface # So there is no clash with FXVolSurface from finmarketpy
30-
from financepy.market.volatility.fx_vol_surface_plus import FinFXATMMethod
31-
from financepy.market.volatility.fx_vol_surface_plus import \
32-
FinFXDeltaMethod
33-
from financepy.market.volatility.fx_vol_surface_plus import vol_function
34-
from financepy.market.volatility.fx_vol_surface_plus import \
35-
VolFunctionTypes
36-
37-
from financepy.utils.global_types import FinSolverTypes
22+
# FinancePy is an optional dependency
23+
try:
24+
from financepy.market.curves.discount_curve_flat import DiscountCurveFlat
25+
from financepy.utils.date import Date
26+
27+
from financepy.market.volatility.fx_vol_surface_plus import \
28+
FXVolSurfacePlus \
29+
as FinFXVolSurface # So there is no clash with FXVolSurface from finmarketpy
30+
from financepy.market.volatility.fx_vol_surface_plus import FinFXATMMethod
31+
from financepy.market.volatility.fx_vol_surface_plus import \
32+
FinFXDeltaMethod
33+
from financepy.market.volatility.fx_vol_surface_plus import vol_function
34+
from financepy.market.volatility.fx_vol_surface_plus import \
35+
VolFunctionTypes
36+
37+
from financepy.utils.global_types import FinSolverTypes
38+
except:
39+
pass
3840

3941
from findatapy.util.dataconstants import DataConstants
4042

finmarketpy_examples/vol_stats_examples.py

+77-35
Original file line numberDiff line numberDiff line change
@@ -52,34 +52,48 @@
5252
###### Looking at realized and implied volatility over GBPUSD in the overnight (ON) tenor
5353
if run_example == 1 or run_example == 0:
5454
# Download the whole all market data for GBPUSD for pricing options (vol surface)
55-
md_request = MarketDataRequest(start_date='01 Jun 2016', finish_date='02 Jul 2016',
56-
data_source='bloomberg', cut='10AM', category='fx-vol-market',
55+
md_request = MarketDataRequest(start_date='01 Jun 2016',
56+
finish_date='02 Jul 2016',
57+
data_source='bloomberg', cut='10AM',
58+
category='fx-vol-market',
5759
tickers=['GBPUSD'],
5860
cache_algo='cache_algo_return')
5961

6062
market_df = market.fetch_market(md_request)
6163

6264
# Download FX tick data for GBPUSD over Brexit vote and then convert into 1 minute data (open/high/low/close)
6365
# which are necessary for calculating realised volatility
64-
md_request = MarketDataRequest(start_date='01 Jun 2016', finish_date='02 Jul 2016',
65-
data_source='dukascopy', freq='tick', category='fx', fields=['bid', 'ask'],
66+
md_request = MarketDataRequest(start_date='01 Jun 2016',
67+
finish_date='02 Jul 2016',
68+
data_source='dukascopy', freq='tick',
69+
category='fx', fields=['bid', 'ask'],
6670
tickers=['GBPUSD'],
6771
cache_algo='cache_algo_return')
6872

6973
from findatapy.timeseries import Calculations
74+
7075
calc = Calculations()
7176

7277
tick_data = market.fetch_market(md_request)
73-
intraday_spot_df = calc.resample_tick_data_ohlc(tick_data, 'GBPUSD', freq='1min')
78+
intraday_spot_df = calc.resample_tick_data_ohlc(tick_data, 'GBPUSD',
79+
freq='1min')
7480

75-
vol_stats = VolStats(market_df=market_df, intraday_spot_df=intraday_spot_df)
81+
vol_stats = VolStats(market_df=market_df,
82+
intraday_spot_df=intraday_spot_df)
7683

77-
realized_vol = vol_stats.calculate_realized_vol('GBPUSD', tenor_label="ON", freq='intraday', freq_min_mult=1,
78-
hour_of_day=10, minute_of_day=0, field='close', timezone_hour_minute='America/New_York') * 100
84+
realized_vol = vol_stats.calculate_realized_vol('GBPUSD', tenor_label="ON",
85+
freq='intraday',
86+
freq_min_mult=1,
87+
hour_of_day=10,
88+
minute_of_day=0,
89+
field='close',
90+
timezone_hour_minute='America/New_York') * 100
7991

8092
implied_vol = pd.DataFrame(market_df['GBPUSDVON.close'])
8193

82-
vrp = vol_stats.calculate_vol_risk_premium('GBPUSD', tenor_label='ON', implied_vol=implied_vol, realized_vol=realized_vol)
94+
vrp = vol_stats.calculate_vol_risk_premium('GBPUSD', tenor_label='ON',
95+
implied_vol=implied_vol,
96+
realized_vol=realized_vol)
8397

8498
style = Style()
8599

@@ -99,15 +113,20 @@
99113

100114
# Download FX tick data for GBPUSD over Brexit vote and then convert into 1 minute data (open/high/low/close)
101115
# which are necessary for calculating realised volatility
102-
md_request = MarketDataRequest(start_date='01 Jun 2016', finish_date='02 Jul 2016',
103-
data_source='dukascopy', freq='tick', category='fx', fields=['bid', 'ask'],
116+
md_request = MarketDataRequest(start_date='01 Jun 2016',
117+
finish_date='02 Jul 2016',
118+
data_source='dukascopy', freq='tick',
119+
category='fx', fields=['bid', 'ask'],
104120
tickers=['GBPUSD'],
105121
cache_algo='cache_algo_return')
106122

107123
from findatapy.timeseries import Calculations
124+
108125
calc = Calculations()
109126

110-
intraday_spot_df = calc.resample_tick_data_ohlc(market.fetch_market(md_request), 'GBPUSD', freq='1min')['GBPUSD.close']
127+
intraday_spot_df = \
128+
calc.resample_tick_data_ohlc(market.fetch_market(md_request), 'GBPUSD',
129+
freq='1min')['GBPUSD.close']
111130

112131
vol_stats = VolStats()
113132

@@ -117,13 +136,18 @@
117136
realized_vol = []
118137

119138
for min in minute_frequencies:
120-
min_df = pd.DataFrame(intraday_spot_df.resample(str(min) + 'min').last().dropna())
139+
min_df = pd.DataFrame(
140+
intraday_spot_df.resample(str(min) + 'min').last().dropna())
121141

122142
rv = vol_stats.calculate_realized_vol('GBPUSD', spot_df=min_df,
123-
tenor_label="ON", freq='intraday', freq_min_mult=min,
124-
hour_of_day=10, minute_of_day=0, field='close', timezone_hour_minute='America/New_York') * 100
143+
tenor_label="ON",
144+
freq='intraday',
145+
freq_min_mult=min,
146+
hour_of_day=10, minute_of_day=0,
147+
field='close',
148+
timezone_hour_minute='America/New_York') * 100
125149

126-
rv.columns=[str(min) + 'min']
150+
rv.columns = [str(min) + 'min']
127151

128152
realized_vol.append(rv)
129153

@@ -144,19 +168,23 @@
144168
# Download the whole all market data for GBPUSD for pricing options (vol surface)
145169
# Note: 10AM prints for vol no longer published by Bloomberg, so later values are a weighted average of TOK and LDN
146170
# closes
147-
md_request = MarketDataRequest(start_date='01 May 2016', finish_date='02 Jul 2016',
148-
data_source='bloomberg', cut='10AM', category='fx-vol-market',
171+
md_request = MarketDataRequest(start_date='01 May 2016',
172+
finish_date='02 Jul 2016',
173+
data_source='bloomberg', cut='10AM',
174+
category='fx-vol-market',
149175
tickers=['GBPUSD'],
150176
cache_algo='cache_algo_return')
151177

152178
market_df = market.fetch_market(md_request)
153179

154180
from findatapy.timeseries import Calculations
181+
155182
calc = Calculations()
156183

157184
vol_stats = VolStats(market_df=market_df)
158185

159-
implied_addon = vol_stats.calculate_implied_vol_addon('GBPUSD', tenor_label='ON').dropna()
186+
implied_addon = vol_stats.calculate_implied_vol_addon('GBPUSD',
187+
tenor_label='ON').dropna()
160188

161189
style = Style()
162190

@@ -169,7 +197,6 @@
169197

170198
###### Look at the statistics for recent period for EURUSD comparing implied vs realized
171199
if run_example == 4 or run_example == 0:
172-
173200
import datetime
174201
from datetime import timedelta
175202

@@ -185,52 +212,67 @@
185212

186213
# Download the whole all market data for pricing options (vol surface)
187214
md_request = MarketDataRequest(start_date=month_before, finish_date=today,
188-
data_source='bloomberg', freq='intraday', fields='open',
189-
tickers=[asset + 'VON'], vendor_tickers=[asset + 'VON BGN Curncy'],
215+
data_source='bloomberg', freq='intraday',
216+
fields='open',
217+
tickers=[asset + 'VON'],
218+
vendor_tickers=[asset + 'VON BGN Curncy'],
190219
cache_algo='cache_algo_return')
191220

192221
from findatapy.timeseries import Calculations, Filter
222+
193223
calc = Calculations()
194224
filter = Filter()
195225

196226
freq_min_mult = 5
197227

198228
# Resample into 1 minute data and fill down all points
199-
implied_vol_df = market.fetch_market(md_request)[asset +'VON.open'].resample('1min').first().fillna(method='ffill')
229+
implied_vol_df = market.fetch_market(md_request)[
230+
asset + 'VON.open'].resample('1min').first().fillna(method='ffill')
200231

201232
# Filter data by 1000 New York time, and return back to UTC, remove any out of trading hours
202233
# Then strip of time of day from the timestamp
203-
implied_vol_df = filter.filter_time_series_by_time_of_day_timezone(10, 0, implied_vol_df, timezone_of_snap='America/New_York')
234+
implied_vol_df = filter.filter_time_series_by_time_of_day_timezone(10, 0,
235+
implied_vol_df,
236+
timezone_of_snap='America/New_York')
204237
implied_vol_df = filter.remove_out_FX_out_of_hours(implied_vol_df)
205238
implied_vol_df.index = pd.to_datetime(implied_vol_df.index.date)
206239
implied_vol_df = pd.DataFrame(implied_vol_df)
207240
implied_vol_df.columns = [asset + 'VON.close']
208241

209242
# Download FX intraday spot data, which will be used to calculate realized volatility
210-
md_request.tickers = asset; md_request.vendor_tickers = asset + ' BGN Curncy'
211-
intraday_spot_df = market.fetch_market(md_request).resample(str(freq_min_mult) + 'min').first()
212-
intraday_spot_df = filter.remove_out_FX_out_of_hours(intraday_spot_df).dropna()
243+
md_request.tickers = asset;
244+
md_request.vendor_tickers = asset + ' BGN Curncy'
245+
intraday_spot_df = market.fetch_market(md_request).resample(
246+
str(freq_min_mult) + 'min').first()
247+
intraday_spot_df = filter.remove_out_FX_out_of_hours(
248+
intraday_spot_df).dropna()
213249
intraday_spot_df.columns = [asset + '.close']
214250

215251
vol_stats = VolStats()
216252

217253
# Calculate realized vol with the intraday data, with daily cutoffs
218254
realized_vol = vol_stats.calculate_realized_vol(
219-
asset, tenor_label='ON', spot_df=intraday_spot_df, hour_of_day=10, minute_of_day=0,
220-
freq='intraday', timezone_hour_minute='America/New_York', freq_min_mult=freq_min_mult) * 100.0
221-
implied_vol_addon = vol_stats.calculate_implied_vol_addon(asset, implied_vol=implied_vol_df, tenor_label='ON',
222-
adj_ON_friday=True).dropna()
223-
224-
vrp = vol_stats.calculate_vol_risk_premium(asset, tenor_label='ON', implied_vol=implied_vol_df, realized_vol=realized_vol,
225-
adj_ON_friday=True)
255+
asset, tenor_label='ON', spot_df=intraday_spot_df, hour_of_day=10,
256+
minute_of_day=0,
257+
freq='intraday', timezone_hour_minute='America/New_York',
258+
freq_min_mult=freq_min_mult) * 100.0
259+
implied_vol_addon = vol_stats.calculate_implied_vol_addon(asset,
260+
implied_vol=implied_vol_df,
261+
tenor_label='ON',
262+
adj_ON_friday=True).dropna()
263+
264+
vrp = vol_stats.calculate_vol_risk_premium(asset, tenor_label='ON',
265+
implied_vol=implied_vol_df,
266+
realized_vol=realized_vol,
267+
adj_ON_friday=True)
226268

227269
style = Style()
228270

229271
style.title = asset + ' ON implied volatility vs realized'
230272
style.scale_factor = 3
231273
style.source = 'Bloomberg'
232274

233-
to_plot = vrp[[asset + 'UON.close', asset +'HON.close']].dropna()
275+
to_plot = vrp[[asset + 'UON.close', asset + 'HON.close']].dropna()
234276

235277
chart.plot(to_plot, style=style)
236278

pyproject.toml

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ requires-python = ">=3.9"
99
dependencies = [
1010
"blosc>=1.11.2",
1111
"chartpy",
12-
"financepy==0.360",
1312
"findatapy",
1413
"matplotlib>=3.9.4",
1514
"numba>=0.60.0",

setup.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,5 @@
2525
"seasonal",
2626
"scikit-learn",
2727
"matplotlib",
28-
"numba",
29-
"financepy==0.360"],
28+
"numba"],
3029
zip_safe=False)

0 commit comments

Comments
 (0)