Ejemplo n.º 1
0
    if len(old_series) == 0:
        return new_series
    if len(new_series) == 0:
        return old_series

    joint_data = pd.concat([old_series, new_series], axis=1)
    joint_data.columns = ["original", "new"]

    # fill to the left
    joint_data_filled_across = joint_data.bfill(1)
    merged_data = joint_data_filled_across["original"]

    return merged_data


all_labels_match = named_object("all labels match")
mismatch_on_last_day = named_object("mismatch_on_last_day")
original_index_matches_new = named_object("original index matches new")


def merge_data_series_with_label_column(original_data,
                                        new_data,
                                        col_names=dict(
                                            data="PRICE",
                                            label="PRICE_CONTRACT")):
    """
    For two pd.DataFrames with 2 columns, including a label column, update the data when the labels
      start consistently matching

    >>> s1=pd.DataFrame(dict(PRICE=[1,2,3,np.nan], PRICE_CONTRACT = ["a", "a", "b", "b"]), index=['a1','a2','a3','a4'])
    >>> s2=pd.DataFrame(dict(PRICE=[  7,3,4], PRICE_CONTRACT = [          "b", "b", "b"]), index=['a2','a3','a4'])
)

from sysproduction.reporting.report_configs import roll_report_config
from sysproduction.reporting.reporting_functions import run_report_with_data_blob

from sysproduction.data.positions import diagPositions, updatePositions
from sysproduction.data.contracts import dataContracts
from sysproduction.data.prices import diagPrices, get_valid_instrument_code_from_user

from sysproduction.reporting.data.rolls import (
    rollingAdjustedAndMultiplePrices,
    relative_volume_in_forward_contract_versus_price,
)


no_change_required = named_object("No roll required")
EXIT_CODE = "EXIT"


def interactive_update_roll_status():

    with dataBlob(log_name="Interactive_Update-Roll-Status") as data:
        function_to_call = get_rolling_master_function()
        function_to_call(data)


def get_rolling_master_function():
    MANUAL_INPUT = "Manually input instrument codes and manually decide when to roll"
    MENU_OPTIONS = [
        MANUAL_INPUT,
        "Cycle through instrument codes automatically, but manually decide when to roll",
Ejemplo n.º 3
0
import numpy as np

from syscore.genutils import sign
from syscore.objects import named_object
from sysexecution.orders.base_orders import Order
from sysexecution.trade_qty import tradeQuantity

override_close = named_object("Close")
override_no_trading = named_object("No trading")
override_reduce_only = named_object("Reduce only")
override_none = named_object("No override")
override_dict = {
    override_close: 0.0,
    override_none: 1.0,
    override_no_trading: -1.0,
    override_reduce_only: -2.0,
}

_override_lookup = []
for key, value in override_dict.items():
    _override_lookup.append((value, key))


def lookup_value_and_return_float_or_object(value):
    value_list = [entry[1] for entry in _override_lookup if entry[0] == value]
    if len(value_list) == 0:
        return value
    else:
        return value_list[0]

from sysobjects.adjusted_prices import futuresAdjustedPrices

from syscore.objects import success, failure, status, named_object

from sysobjects.production.roll_state import default_state, roll_adj_state, explain_roll_state_str, \
    allowable_roll_state_from_current_and_position, RollState

from sysproduction.reporting.report_configs import roll_report_config
from sysproduction.reporting.reporting_functions import run_report_with_data_blob, landing_strip

from sysproduction.data.positions import diagPositions, updatePositions
from sysproduction.data.contracts import dataContracts
from sysdata.data_blob import dataBlob
from sysproduction.data.prices import diagPrices, updatePrices, get_valid_instrument_code_from_user

no_state_available = named_object("No state available")


def interactive_update_roll_status():
    """
    Update the roll state for a particular instrument
    This includes the option, where possible, to switch the adjusted price series on to a new contract

    :param instrument_code: str
    :return: None
    """

    with dataBlob(log_name="Interactive_Update-Roll-Status") as data:
        do_another = True
        while do_another:
            instrument_code = get_valid_instrument_code_from_user(data=data)
Ejemplo n.º 5
0
    return no_change


def get_df_of_data_for_duplicate(mkt_data, all_markets: list) -> pd.DataFrame:
    mkt_data_for_duplicates = [
        get_market_data_for_duplicate(mkt_data, instrument_code)
        for instrument_code in all_markets
    ]

    mkt_data_for_duplicates = pd.DataFrame(mkt_data_for_duplicates,
                                           index=all_markets)

    return mkt_data_for_duplicates


no_good_markets = named_object("<No good markets>")


def get_best_market(mkt_data_for_duplicates: pd.DataFrame,
                    filters: tuple) -> str:
    max_cost, min_contracts, min_risk = filters
    only_valid = mkt_data_for_duplicates.dropna()
    only_valid = only_valid[only_valid.SR_cost <= max_cost]
    only_valid = only_valid[only_valid.volume_contracts > min_contracts]
    only_valid = only_valid[only_valid.volume_risk > min_risk]

    if len(only_valid) == 0:
        return no_good_markets

    only_valid = only_valid.sort_values("contract_size")
    best_market = only_valid.index[0]
Ejemplo n.º 6
0
 - is my status NO-RUN, STOP or GO?
 - have I run today and finished running?
"""

from copy import copy
import datetime
import os
import pandas as pd

from syscontrol.list_running_pids import list_of_all_running_pids
from syscore.fileutils import html_table
from syscore.dateutils import SECONDS_PER_DAY, last_run_or_heartbeat_from_date_or_none

from syscore.objects import (success, failure, named_object, missing_data)

process_stop = named_object("process stop")
process_no_run = named_object("process no run")
process_running = named_object("process running")

go_status = "GO"
no_run_status = "NO-RUN"
stop_status = "STOP"
default_process_id = 0

possible_status = [go_status, no_run_status, stop_status]

start_run_idx = 0
end_run_idx = 1

missing_date_str = ""
Ejemplo n.º 7
0
from collections import namedtuple

import pandas as pd

from syscore.objects import missing_order, named_object
from sysexecution.orders.list_of_orders import listOfOrders
from sysexecution.orders.base_orders import Order

Fill = namedtuple("Fill", ["date", "qty", "price"])

NOT_FILLED = named_object('not filled')


class listOfFills(list):
    def __init__(self, list_of_fills):
        list_of_fills = [
            fill for fill in list_of_fills if fill is not missing_order
        ]
        super().__init__(list_of_fills)

    def _as_dict_of_lists(self) -> dict:
        qty_list = [fill.qty for fill in self]
        price_list = [fill.price for fill in self]
        date_list = [fill.date for fill in self]

        return dict(qty=qty_list, price=price_list, date=date_list)

    def as_pd_df(self) -> pd.DataFrame:
        self_as_dict = self._as_dict_of_lists()
        date_index = self_as_dict.pop("date")
        df = pd.DataFrame(self_as_dict, index=date_index)