├── .gitignore ├── README.md ├── WHERE ARE THE NOTEBOOKS.txt ├── append.py ├── append_small.py ├── extra_reading.txt └── get_data.py /.gitignore: -------------------------------------------------------------------------------- 1 | data/* 2 | *DS_Store 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Financial Engineering and Artificial Intelligence in Python 2 | =========================================================== 3 | 4 | Link to the course: 5 | 6 | https://deeplearningcourses.com/c/ai-finance 7 | 8 | Most of the course is done using Google Colab. This repository contains supplementary files such as data downloaders and references. 9 | 10 | 11 | 12 | Why you should not fork this repo 13 | ================================= 14 | 15 | I've noticed that many people have out-of-date forks. Thus, I recommend not forking this repository if you take one of my courses. I am constantly updating my courses, and your fork will soon become out-of-date. You should clone the repository instead to make it easy to get updates (i.e. just "git pull" randomly and frequently). -------------------------------------------------------------------------------- /WHERE ARE THE NOTEBOOKS.txt: -------------------------------------------------------------------------------- 1 | As stated in the "where to get the code" / "where to get the notebooks" lecture, the notebooks are NOT on Github. 2 | 3 | If you missed this, please review the lecture for the actual location of the notebooks. 4 | 5 | If, after reviewing it, you still need assistance, please contact info@deeplearningcourses.com. -------------------------------------------------------------------------------- /append.py: -------------------------------------------------------------------------------- 1 | # https://www.udemy.com/course/ai-finance 2 | import pandas as pd 3 | from glob import glob 4 | 5 | files = glob('data/*.csv') 6 | full_df = None 7 | for f in files: 8 | print(f) 9 | df = pd.read_csv(f) 10 | 11 | symbol = f.split('/')[1].split('.')[0] 12 | df['Name'] = symbol 13 | 14 | if full_df is None: 15 | full_df = df 16 | else: 17 | full_df = full_df.append(df, ignore_index=True) 18 | 19 | full_df.to_csv('sp500full.csv', index=False) -------------------------------------------------------------------------------- /append_small.py: -------------------------------------------------------------------------------- 1 | # https://www.udemy.com/course/ai-finance 2 | import random 3 | import pandas as pd 4 | import os 5 | 6 | 7 | symbols = ['MMM','ABT','ABBV','ACN','ATVI','AYI','ADBE','AMD','AAP','AES','AET', 8 | 'AMG','AFL','A','APD','AKAM','ALK','ALB','ARE','ALXN','ALGN','ALLE', 9 | 'AGN','ADS','LNT','ALL','GOOGL','GOOG','MO','AMZN','AEE','AAL','AEP', 10 | 'AXP','AIG','AMT','AWK','AMP','ABC','AME','AMGN','APH','APC','ADI','ANDV', 11 | 'ANSS','ANTM','AON','AOS','APA','AIV','AAPL','AMAT','APTV','ADM','ARNC', 12 | 'AJG','AIZ','T','ADSK','ADP','AZO','AVB','AVY','BHGE','BLL','BAC','BK', 13 | 'BAX','BBT','BDX','BRK.B','BBY','BIIB','BLK','HRB','BA','BWA','BXP','BSX', 14 | 'BHF','BMY','AVGO','BF.B','CHRW','CA','COG','CDNS','CPB','COF','CAH','CBOE', 15 | 'KMX','CCL','CAT','CBG','CBS','CELG','CNC','CNP','CTL','CERN','CF','SCHW', 16 | 'CHTR','CHK','CVX','CMG','CB','CHD','CI','XEC','CINF','CTAS','CSCO','C','CFG', 17 | 'CTXS','CLX','CME','CMS','KO','CTSH','CL','CMCSA','CMA','CAG','CXO','COP', 18 | 'ED','STZ','COO','GLW','COST','COTY','CCI','CSRA','CSX','CMI','CVS','DHI', 19 | 'DHR','DRI','DVA','DE','DAL','XRAY','DVN','DLR','DFS','DISCA','DISCK','DISH', 20 | 'DG','DLTR','D','DOV','DWDP','DPS','DTE','DRE','DUK','DXC','ETFC','EMN','ETN', 21 | 'EBAY','ECL','EIX','EW','EA','EMR','ETR','EVHC','EOG','EQT','EFX','EQIX','EQR', 22 | 'ESS','EL','ES','RE','EXC','EXPE','EXPD','ESRX','EXR','XOM','FFIV','FB','FAST', 23 | 'FRT','FDX','FIS','FITB','FE','FISV','FLIR','FLS','FLR','FMC','FL','F','FTV', 24 | 'FBHS','BEN','FCX','GPS','GRMN','IT','GD','GE','GGP','GIS','GM','GPC','GILD', 25 | 'GPN','GS','GT','GWW','HAL','HBI','HOG','HRS','HIG','HAS','HCA','HCP','HP','HSIC', 26 | 'HSY','HES','HPE','HLT','HOLX','HD','HON','HRL','HST','HPQ','HUM','HBAN','HII', 27 | 'IDXX','INFO','ITW','ILMN','IR','INTC','ICE','IBM','INCY','IP','IPG','IFF','INTU', 28 | 'ISRG','IVZ','IQV','IRM','JEC','JBHT','SJM','JNJ','JCI','JPM','JNPR','KSU','K','KEY', 29 | 'KMB','KIM','KMI','KLAC','KSS','KHC','KR','LB','LLL','LH','LRCX','LEG','LEN','LUK', 30 | 'LLY','LNC','LKQ','LMT','L','LOW','LYB','MTB','MAC','M','MRO','MPC','MAR','MMC','MLM', 31 | 'MAS','MA','MAT','MKC','MCD','MCK','MDT','MRK','MET','MTD','MGM','KORS','MCHP','MU', 32 | 'MSFT','MAA','MHK','TAP','MDLZ','MON','MNST','MCO','MS','MOS','MSI','MYL','NDAQ', 33 | 'NOV','NAVI','NTAP','NFLX','NWL','NFX','NEM','NWSA','NWS','NEE','NLSN','NKE','NI', 34 | 'NBL','JWN','NSC','NTRS','NOC','NCLH','NRG','NUE','NVDA','ORLY','OXY','OMC','OKE', 35 | 'ORCL','PCAR','PKG','PH','PDCO','PAYX','PYPL','PNR','PBCT','PEP','PKI','PRGO','PFE', 36 | 'PCG','PM','PSX','PNW','PXD','PNC','RL','PPG','PPL','PX','PCLN','PFG','PG','PGR', 37 | 'PLD','PRU','PEG','PSA','PHM','PVH','QRVO','PWR','QCOM','DGX','RRC','RJF','RTN','O', 38 | 'RHT','REG','REGN','RF','RSG','RMD','RHI','ROK','COL','ROP','ROST','RCL','CRM','SBAC', 39 | 'SCG','SLB','SNI','STX','SEE','SRE','SHW','SIG','SPG','SWKS','SLG','SNA','SO','LUV', 40 | 'SPGI','SWK','SBUX','STT','SRCL','SYK','STI','SYMC','SYF','SNPS','SYY','TROW','TPR', 41 | 'TGT','TEL','FTI','TXN','TXT','TMO','TIF','TWX','TJX','TMK','TSS','TSCO','TDG','TRV', 42 | 'TRIP','FOXA','FOX','TSN','UDR','ULTA','USB','UAA','UA','UNP','UAL','UNH','UPS','URI', 43 | 'UTX','UHS','UNM','VFC','VLO','VAR','VTR','VRSN','VRSK','VZ','VRTX','VIAB','V','VNO', 44 | 'VMC','WMT','WBA','DIS','WM','WAT','WEC','WFC','HCN','WDC','WU','WRK','WY','WHR','WMB', 45 | 'WLTW','WYN','WYNN','XEL','XRX','XLNX','XL','XYL','YUM','ZBH','ZION','ZTS'] 46 | 47 | small_symbols = {'MMM', 'ABT', 'ABBV', 'ACN', 'ATVI', 'ADBE', 'AMD', 'AAP', 'AES', 48 | 'AFL', 'AKAM', 'IBM', 'GOOG', 'SBUX', 'AAPL', 'SPY'} 49 | 50 | sample = random.sample(symbols, 100) 51 | 52 | small_symbols = small_symbols | set(sample) 53 | 54 | full_df = None 55 | for symbol in small_symbols: 56 | f = f"data/{symbol}.csv" 57 | if os.path.exists(f): 58 | df = pd.read_csv(f) 59 | df['Name'] = symbol 60 | if full_df is None: 61 | full_df = df 62 | else: 63 | full_df = full_df.append(df, ignore_index=True) 64 | 65 | full_df.to_csv('sp500sub.csv', index=False) 66 | 67 | -------------------------------------------------------------------------------- /extra_reading.txt: -------------------------------------------------------------------------------- 1 | Convex Optimization by Boyd and Vandenberghe 2 | http://stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf 3 | 4 | The Statistics of Sharpe Ratios by Andrew W. Lo 5 | https://www.researchgate.net/publication/228139699_The_Statistics_of_Sharpe_Ratios 6 | 7 | Maximizing the Sharpe ratio 8 | http://people.stat.sc.edu/sshen/events/backtesting/reference/maximizing%20the%20sharpe%20ratio.pdf 9 | 10 | Benchmarks as Limits to Arbitrage: Understanding the Low Volatility Anomaly 11 | https://papers.ssrn.com/sol3/papers.cfm?abstract_id=1585031 12 | 13 | Risk Reduction in Large Portfolios: Why Imposing the Wrong Constraints Helps 14 | https://www.nber.org/papers/w8922 15 | 16 | Honey, I Shrunk the Sample Covariance Matrix 17 | https://repositori.upf.edu/bitstream/handle/10230/560/691.pdf?sequence=1 18 | 19 | A Step-by-Step Guide to the Black-Litterman Model 20 | https://faculty.fuqua.duke.edu/~charvey/Teaching/BA453_2006/Idzorek_onBL.pdf 21 | 22 | The Black-Litterman Approach: Original Model and Extensions 23 | https://papers.ssrn.com/sol3/papers.cfm?abstract_id=1117574 -------------------------------------------------------------------------------- /get_data.py: -------------------------------------------------------------------------------- 1 | # https://www.udemy.com/course/ai-finance 2 | import yfinance as yf 3 | import os 4 | 5 | 6 | symbols = ['MMM','ABT','ABBV','ACN','ATVI','AYI','ADBE','AMD','AAP','AES','AET', 7 | 'AMG','AFL','A','APD','AKAM','ALK','ALB','ARE','ALXN','ALGN','ALLE', 8 | 'AGN','ADS','LNT','ALL','GOOGL','GOOG','MO','AMZN','AEE','AAL','AEP', 9 | 'AXP','AIG','AMT','AWK','AMP','ABC','AME','AMGN','APH','APC','ADI','ANDV', 10 | 'ANSS','ANTM','AON','AOS','APA','AIV','AAPL','AMAT','APTV','ADM','ARNC', 11 | 'AJG','AIZ','T','ADSK','ADP','AZO','AVB','AVY','BHGE','BLL','BAC','BK', 12 | 'BAX','BBT','BDX','BRK.B','BBY','BIIB','BLK','HRB','BA','BWA','BXP','BSX', 13 | 'BHF','BMY','AVGO','BF.B','CHRW','CA','COG','CDNS','CPB','COF','CAH','CBOE', 14 | 'KMX','CCL','CAT','CBG','CBS','CELG','CNC','CNP','CTL','CERN','CF','SCHW', 15 | 'CHTR','CHK','CVX','CMG','CB','CHD','CI','XEC','CINF','CTAS','CSCO','C','CFG', 16 | 'CTXS','CLX','CME','CMS','KO','CTSH','CL','CMCSA','CMA','CAG','CXO','COP', 17 | 'ED','STZ','COO','GLW','COST','COTY','CCI','CSRA','CSX','CMI','CVS','DHI', 18 | 'DHR','DRI','DVA','DE','DAL','XRAY','DVN','DLR','DFS','DISCA','DISCK','DISH', 19 | 'DG','DLTR','D','DOV','DWDP','DPS','DTE','DRE','DUK','DXC','ETFC','EMN','ETN', 20 | 'EBAY','ECL','EIX','EW','EA','EMR','ETR','EVHC','EOG','EQT','EFX','EQIX','EQR', 21 | 'ESS','EL','ES','RE','EXC','EXPE','EXPD','ESRX','EXR','XOM','FFIV','FB','FAST', 22 | 'FRT','FDX','FIS','FITB','FE','FISV','FLIR','FLS','FLR','FMC','FL','F','FTV', 23 | 'FBHS','BEN','FCX','GPS','GRMN','IT','GD','GE','GGP','GIS','GM','GPC','GILD', 24 | 'GPN','GS','GT','GWW','HAL','HBI','HOG','HRS','HIG','HAS','HCA','HCP','HP','HSIC', 25 | 'HSY','HES','HPE','HLT','HOLX','HD','HON','HRL','HST','HPQ','HUM','HBAN','HII', 26 | 'IDXX','INFO','ITW','ILMN','IR','INTC','ICE','IBM','INCY','IP','IPG','IFF','INTU', 27 | 'ISRG','IVZ','IQV','IRM','JEC','JBHT','SJM','JNJ','JCI','JPM','JNPR','KSU','K','KEY', 28 | 'KMB','KIM','KMI','KLAC','KSS','KHC','KR','LB','LLL','LH','LRCX','LEG','LEN','LUK', 29 | 'LLY','LNC','LKQ','LMT','L','LOW','LYB','MTB','MAC','M','MRO','MPC','MAR','MMC','MLM', 30 | 'MAS','MA','MAT','MKC','MCD','MCK','MDT','MRK','MET','MTD','MGM','KORS','MCHP','MU', 31 | 'MSFT','MAA','MHK','TAP','MDLZ','MON','MNST','MCO','MS','MOS','MSI','MYL','NDAQ', 32 | 'NOV','NAVI','NTAP','NFLX','NWL','NFX','NEM','NWSA','NWS','NEE','NLSN','NKE','NI', 33 | 'NBL','JWN','NSC','NTRS','NOC','NCLH','NRG','NUE','NVDA','ORLY','OXY','OMC','OKE', 34 | 'ORCL','PCAR','PKG','PH','PDCO','PAYX','PYPL','PNR','PBCT','PEP','PKI','PRGO','PFE', 35 | 'PCG','PM','PSX','PNW','PXD','PNC','RL','PPG','PPL','PX','PCLN','PFG','PG','PGR', 36 | 'PLD','PRU','PEG','PSA','PHM','PVH','QRVO','PWR','QCOM','DGX','RRC','RJF','RTN','O', 37 | 'RHT','REG','REGN','RF','RSG','RMD','RHI','ROK','COL','ROP','ROST','RCL','CRM','SBAC', 38 | 'SCG','SLB','SNI','STX','SEE','SRE','SHW','SIG','SPG','SWKS','SLG','SNA','SO','LUV', 39 | 'SPGI','SWK','SBUX','STT','SRCL','SYK','STI','SYMC','SYF','SNPS','SYY','TROW','TPR', 40 | 'TGT','TEL','FTI','TXN','TXT','TMO','TIF','TWX','TJX','TMK','TSS','TSCO','TDG','TRV', 41 | 'TRIP','FOXA','FOX','TSN','UDR','ULTA','USB','UAA','UA','UNP','UAL','UNH','UPS','URI', 42 | 'UTX','UHS','UNM','VFC','VLO','VAR','VTR','VRSN','VRSK','VZ','VRTX','VIAB','V','VNO', 43 | 'VMC','WMT','WBA','DIS','WM','WAT','WEC','WFC','HCN','WDC','WU','WRK','WY','WHR','WMB', 44 | 'WLTW','WYN','WYNN','XEL','XRX','XLNX','XL','XYL','YUM','ZBH','ZION','ZTS'] 45 | 46 | symbols.append('SPY') 47 | 48 | 49 | 50 | if not os.path.exists('data'): 51 | os.mkdir('data') 52 | 53 | for symbol in symbols: 54 | if not os.path.exists(f"data/{symbol}.csv"): 55 | data = yf.download(symbol, start="2010-01-01", end="2018-12-31") 56 | if data.size > 0: 57 | data.to_csv(f"data/{symbol}.csv") 58 | else: 59 | print("Not saving...") 60 | 61 | 62 | for symbol in symbols: 63 | s = open(f"data/{symbol}.csv").readlines() 64 | if len(s) < 10: 65 | os.system(f"rm data/{symbol}.csv") 66 | 67 | 68 | 69 | --------------------------------------------------------------------------------