4
4
import logging
5
5
import pandas as pd
6
6
import opchain
7
+ import time
7
8
8
9
def eprint (* args , ** kwargs ):
9
10
print (* args , file = sys .stderr , ** kwargs )
@@ -12,9 +13,9 @@ def eprint(*args, **kwargs):
12
13
MIN_DMU2 = - 8.0
13
14
MIN_DME_U = - 999.0
14
15
MIN_MG = 0.5
15
- ODD_DAY_SYMBOLS = ["DJI.C" , "DIA" , "$SPX.X" , "SPY" , "$NDX.X" , "QQQ" , "$RUT.X" , "IWM" , "$VIX.X" , "VXX" ]
16
+ ODD_DAY_SYMBOLS = ["DJI.C" , "DIA" , "$SPX.X" , "SPY" , "$NDX.X" , "QQQ" , "$RUT.X" , "IWM" , "$VIX.X" , "VXX" , "EWZ" ] #brazil
16
17
MIN_DAY = 38
17
- MAX_DAY = 112
18
+ MAX_DAY = 78
18
19
MIN_EW = - 1.0
19
20
MIN_DME_W = 0.0
20
21
NUM_EWS = 30
@@ -37,12 +38,12 @@ def eprint(*args, **kwargs):
37
38
"dme" ,
38
39
#"DME_u",
39
40
"dme_w" ,
41
+ "e_w" ,
42
+ "mg_w" ,
40
43
"pop" ,
41
44
# "popt",
42
45
"width" ,
43
46
#"e_u",
44
- "e_w" ,
45
- "mg_w" ,
46
47
#"eml_u",
47
48
#"ml_u",
48
49
#"mg_u",
@@ -130,7 +131,7 @@ def getBestEw(df, daysToExpiration=None, count=1):
130
131
return rows
131
132
132
133
133
- def getBestEws (stocklist_file , rows , run_date = None , exp_days = None ):
134
+ def getBestEUs (stocklist_file , rows , run_date = None , exp_days = None ):
134
135
if not os .path .isfile (stocklist_file ):
135
136
eprint (f"{ stocklist_file } not found" )
136
137
sys .exit (1 )
@@ -183,6 +184,46 @@ def getBestEws(stocklist_file, rows, run_date=None, exp_days=None):
183
184
eprint (f"got data for { len (symbols )} symbols { symbols } from file: { stocklist_file } " )
184
185
185
186
187
+ def minmaxFilter (df , use_odd_day_symbols = False ):
188
+ logging .info (f"df minmaxstart: { len (df )} rows" )
189
+ df = df [df .days_exp >= MIN_DAY ]
190
+ df = df [df .days_exp <= MAX_DAY ]
191
+ logging .info (f"len after min/max days: { len (df )} " )
192
+ df = df [df .e_w > MIN_EW ]
193
+ logging .info (f"len after > MIN_EW: { len (df )} " )
194
+ #df = df.drop(df[df.dmu <= MIN_DMU].index)
195
+ df = df [df .dmu >= MIN_DMU ]
196
+ logging .info (f"len after <= MIN_DMU: { len (df )} " )
197
+ # df = df.drop(df[df.dmu2 <= MIN_DMU2].index)
198
+ df = df [df .dmu2 >= MIN_DMU2 ]
199
+ logging .info (f"len after <= MIN_DMU2: { len (df )} " )
200
+ # df = df.drop(df[df.dme_u <= MIN_DME_U].index)
201
+ logging .debug (f"dme_w max: { df .dme_w .max ()} " )
202
+ logging .debug (f"dme_w min: { df .dme_w .min ()} " )
203
+ #df = df.drop(df[df.dme_w <= MIN_DME_W].index)
204
+ df = df [df .dme_w > MIN_DME_W ]
205
+ logging .info (f"len after > MIN_DME_W: { len (df )} " )
206
+ # df = df.drop(df[df.mg <= MIN_MG].index)
207
+ df = df [df .mg >= MIN_MG ]
208
+ logging .info (f"len after <= MIN_MG: { len (df )} " )
209
+ if len (df ) == 0 :
210
+ logging .info ("no rows, returning empty dataframe" )
211
+ return df
212
+
213
+ #eprint("symbols:", df['symbol'])
214
+ eprint ("df minmaxstart start filter symbols:" , len (df ))
215
+ if use_odd_day_symbols :
216
+ df = df [df .symbol .isin (ODD_DAY_SYMBOLS )]
217
+ else :
218
+ eprint ("filtered symbols" )
219
+ df = df [~ df .symbol .isin (ODD_DAY_SYMBOLS )]
220
+
221
+ eprint ("trimed df:" , len (df ))
222
+
223
+ df = df .sort_values (by = "dme_w" , ascending = False ) # DME_u
224
+ return df
225
+
226
+
186
227
# main
187
228
#
188
229
if len (sys .argv ) < 2 or sys .argv [1 ] in ('-h' , '--help' ):
@@ -218,27 +259,29 @@ def getBestEws(stocklist_file, rows, run_date=None, exp_days=None):
218
259
219
260
# assume it's a csv file of symbols
220
261
rows = []
262
+ start_time = time .time ()
263
+ eprint ("getBestEUs start" )
221
264
for csv_file in csv_files :
222
- getBestEws (csv_file , rows , run_date = run_date , exp_days = exp_days )
223
-
265
+ getBestEUs (csv_file , rows , run_date = run_date , exp_days = exp_days )
266
+ eprint ( f"getBestEUs done - { int ( time . time () - start_time ) } " )
224
267
if not rows :
225
268
eprint ("no rows found!" )
226
269
sys .exit ()
227
270
# row = rows[0]
228
271
# columns = list(row.keys())
229
- df = pd .DataFrame (rows , columns = BEST_EW_COLUMNS )
272
+ df = pd .DataFrame (rows , columns = BEST_EW_COLUMNS , )
230
273
231
274
days = df ['days_exp' ]
232
275
print (df .columns )
233
276
print ("days:" , days )
234
- print ("fow count:" , len (df ))
277
+ print ("row count:" , len (df ))
235
278
days = list (set (list (days .values )))
236
279
days .sort ()
237
280
238
-
239
-
240
281
if out_dir :
241
282
original_stdout = sys .stdout # Save a reference to the original standard output
283
+ eprint (f"days start - { int (time .time () - start_time )} " )
284
+
242
285
for day in days :
243
286
if day < MIN_DAY :
244
287
#eprint(f"{day} less than {MIN_DAY}, skipping")
@@ -248,47 +291,32 @@ def getBestEws(stocklist_file, rows, run_date=None, exp_days=None):
248
291
continue
249
292
logging .info (f"running day: { day } " )
250
293
df_day = df [df .days_exp == day ]
251
- eprint (f"df_day: { len (df_day )} rows" )
294
+ logging . info (f"df_day: { len (df_day )} rows" )
252
295
if len (df_day .index ) == 0 :
253
- eprint ("no rows" )
296
+ logging . info ("no rows" )
254
297
continue # no rows
255
- df_day = df_day [df_day .e_w > MIN_EW ]
256
- logging .info (f"df_day pod e_w: { len (df_day )} rows" )
257
-
258
- df_day = df_day .drop (df_day [df_day .dmu <= MIN_DMU ].index )
259
- df_day = df_day .drop (df_day [df_day .dmu <= MIN_DMU ].index )
260
- df_day = df_day .drop (df_day [df_day .dmu2 <= MIN_DMU2 ].index )
261
- # df_day = df_day.drop(df_day[df_day.dme_u <= MIN_DME_U].index)
262
- df_day = df_day .drop (df_day [df_day .dme_w <= MIN_DME_W ].index )
263
- df_day = df_day .drop (df_day [df_day .mg <= MIN_MG ].index )
264
- for symbol in ODD_DAY_SYMBOLS :
265
- df_day = df_day .drop (df_day [df_day .symbol == symbol ].index )
266
- df_day = df_day .sort_values (by = "dme_w" , ascending = False ) # DME_u
267
-
298
+ df_day = minmaxFilter (df_day )
299
+
268
300
if len (df_day .index ) > 0 :
269
301
filename = f"{ out_dir } /best_ew_{ run_date } _{ day } .csv"
270
302
df_day = df_day .rename (columns = RENAME_COLUMNS )
271
303
with open (filename , 'w' ) as f :
272
304
sys .stdout = f # Change the standard output to the file we created.
273
305
output = df_day .to_csv (float_format = "%.2f" )
274
306
print (output )
307
+ eprint (f"days done - { int (time .time () - start_time )} " )
308
+
275
309
# odd days file
276
310
filename = f"{ out_dir } /best_ew_{ run_date } _index.csv"
277
- df_odd = df [df ["symbol" ].isin (ODD_DAY_SYMBOLS )]
278
- df_odd = df_odd [df_odd .e_w > MIN_EW ]
279
- df_odd = df_odd .drop (df_odd [df_odd .dmu <= MIN_DMU ].index )
280
- df_odd = df_odd .drop (df_odd [df_odd .dmu2 <= MIN_DMU2 ].index )
281
- # df_odd = df_odd.drop(df_odd[df_odd.dme_u <= MIN_DME_U].index)
282
- df_odd = df_odd .drop (df_odd [df_odd .dme_w <= MIN_DME_W ].index )
283
- df_odd = df_odd .drop (df_odd [df_odd .mg <= MIN_MG ].index )
284
- df_odd = df_odd .drop (df_odd [df_odd ["days_exp" ] < MIN_DAY ].index )
285
- df_odd = df_odd .drop (df_odd [df_odd ["days_exp" ] > MAX_DAY ].index )
286
- df_odd = df_odd .sort_values (by = "symbol" , ascending = False )
311
+ df = pd .DataFrame (rows , columns = BEST_EW_COLUMNS )
312
+ df_odd = minmaxFilter (df , use_odd_day_symbols = True )
287
313
df_odd = df_odd .rename (columns = RENAME_COLUMNS )
288
314
with open (filename , 'w' ) as f :
289
315
sys .stdout = f # Change the standard output to the file we created.
290
316
output = df_odd .to_csv (float_format = "%.2f" )
291
317
print (output )
318
+ eprint (f"odds done - { int (time .time () - start_time )} " )
319
+
292
320
293
321
sys .stdout = original_stdout # Reset the standard output to its original value
294
322
else :
0 commit comments