Exemplo n.º 1
0
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')
Exemplo n.º 2
0
    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)