def run(): config = ConfigParser() config.read('./config.ini') API_KEY = config['ALPACA']['API_KEY'] SECRET_KEY = config['ALPACA']['SECRET_KEY'] api = REST(key_id=API_KEY, secret_key=SECRET_KEY) GOOGLE_SA_PATH = './service_account.json' assert os.path.exists( GOOGLE_SA_PATH ), "Unable to locate Google Sheets service account credentials" #Google Sheets Auth gs = auth(GOOGLE_SA_PATH) #Get params from Sheets params = { row[0]: row[1] for row in get_range(gs, config['SHEETS']['SPREADSHEET_ID'], config['SHEETS'] ['PARAM_SHEET'], config['SHEETS']['PARAM_RANGE']) } #Read params into variables POWER = try_cast(params['POWER'], float, 1 / 3) PERCENT_HOLD = try_cast(params['PERCENT_HOLD'], float, 1 / 20) df = pd.DataFrame(get_range(gs, config['SHEETS']['SPREADSHEET_ID'], config['SHEETS']['STOCK_SHEET'], config['SHEETS']['STOCK_RANGE']), columns=['Symbol', 'Name', 'Price', 'Market Cap']) #Convert string numbers into floats df['Price'] = df['Price'].str.replace(',', '').str.replace('$', '').astype(np.double) df['Market Cap'] = df['Market Cap'].str.replace(',', '').str.replace( '$', '').astype(np.double) #Get cash available to trade buying_power = get_buying_power(api) * (1 - PERCENT_HOLD) #Get currently held positions positions = get_positions(api) df = df.merge(positions, on='Symbol', how='left').fillna('0').astype({'Total Value': np.double}) df['Derived Percentage'] = np.power(df['Market Cap'], POWER) / np.power( df['Market Cap'], POWER).sum() df['Current Percentage'] = df['Total Value'] / df['Total Value'].sum() df['Transaction Percentage'] = df['Derived Percentage'] - df[ 'Current Percentage'] df = df[df['Transaction Percentage'] > 0] df['Purchase Value'] = (df['Transaction Percentage'] / df['Transaction Percentage'].sum()) * buying_power api.cancel_all_orders() for r in df[df['Purchase Value'] > 5].to_dict(orient='records'): put_fractional_order(api, r['Symbol'], r['Purchase Value'], 'buy')
df = df.merge(positions, on='Symbol', how='left').fillna('0').astype({'Total Value': np.double}) df['Derived Percentage'] = np.power(df['Market Cap'], POWER) / np.power( df['Market Cap'], POWER).sum() df['Current Percentage'] = df['Total Value'] / df['Total Value'].sum() df['Transaction Percentage'] = df['Derived Percentage'] - df[ 'Current Percentage'] df = df[df['Transaction Percentage'] > 0] df['Purchase Value'] = (df['Transaction Percentage'] / df['Transaction Percentage'].sum()) * buying_power print_df(df) if MAKE_TRADES: api.cancel_all_orders() for r in df[df['Purchase Value'] > 1].to_dict(orient='records'): print(r['Symbol']) data = { "symbol": r["Symbol"], "notional": r["Purchase Value"], "side": "buy", "type": "market", "time_in_force": "day" } # r = api._request('POST', '/orders', data=data) if LOG_POSITIONS: df['Date'] = date.today() # log_positions_to_s3(positions, S3_BUCKET_NAME, LOGGING_PATH, overwrite=True)