Example #1
0
def kazuyo_katsuma(data, yn, stock_data, share_data, verbose=False):
    meta = stock_data[common.META]
    daily = stock_data[common.DAILY]
    finance = stock_data[common.FINANCE]

    section = data.add_section(u'勝間和代')
    section.add(*_pass(yn))

    for y in (common.LAST_4Q_YEAR, meta[common.LAST_YEAR]):
        y_f = finance[y]
        y_sec = section
        if verbose:
            y_sec = section.add_section(y)
        _add_finance_field(y_sec, y_f, u'權責發生額')
        if verbose:
            for f in (u'本期稅後淨利', u'來自營運之現金流量'):
                _add_finance_field(y_sec, y_f, f)

    for q in meta[common.QUARTERS][:5]:
        q_f = finance[q]
        if verbose:
            roa_sec = section.add_section(q)
            var_name = u'總資產報酬率'
        else:
            roa_sec = section.add_section(u'總資產報酬率')
            var_name = q
        roa_sec.add(var_name, _get(q_f, common.field_var(u'總資產報酬率')))
        if verbose:
            for f in (u'稅前純利', u'資產總額'):
                _add_finance_field(roa_sec, q_f, f)
Example #2
0
def _gather_info(finance, year):
    fields = (u'稅前淨利', u'營業收入淨額', u'營業毛利', u'營業費用', u'營業利益')
    info = {}
    for f in fields:
        info[f] = finance[year][common.field_var(f)]

    # Hack it
    q_fields = (u'來自營運之現金流量', u'投資活動之現金流量')
    all_q = (u'.1Q', u'.2Q', u'.3Q', u'.4Q')
    if all((year + q in finance for q in all_q)):
        for f in q_fields:
            info[f] = sum(finance[year + q][common.field_var(f)]
                          for q in (u'.1Q', u'.2Q', u'.3Q', u'.4Q'))
    else:
        raise Exception('missing finance report!')

    return info
Example #3
0
def calculate_day(day, stock_data, average_data, stock_no=None):
    average_day = average_data.setdefault(day, {})

    finance = stock_data[common.FINANCE]

    daily_prices = stock_data[common.DAILY]
    daily = daily_prices[day]
    price = daily[common.field_var(u'股價')]

    last_year = stock_data[common.META].get(common.LAST_YEAR, None)

    for y, field in ((common.LAST_4Q_YEAR, u'4Q本益比'), (last_year, u'本益比')):
        f = finance.get(y, None)
        if not f:
            continue
        try:
            # per 本益比 = 股價 / 每股盈餘(元)
            eps = f.get(common.field_var(u'每股盈餘(元)'), 0)
            if eps > 0:
                per = price / eps
            else:
                per = 0
            field_name = common.field_var(field)
            daily[field_name] = per

            # data for average per
            for postfix in (common.AVG_SUM, common.AVG_COUNT):
                k = field_name + postfix
                if k not in average_day:
                    average_day[k] = 0
            if per > 0:
                average_day[field_name + common.AVG_SUM] += per
                average_day[field_name + common.AVG_COUNT] += 1
        except Exception as e:
            msg = '%s: %s, per failed: %s %s' % (stock_no, y, type(e),
                                                 e.message)
            common.report_error(msg)

    # 殖利率 = 股價 / 最近一年股利
    f = finance.get(last_year, None)
    if f and price:
        dividend = f.get(common.field_var(u'股利'), 0)
        if dividend:
            yield_rate = dividend / price
            daily[common.field_var(u'殖利率')] = yield_rate
Example #4
0
def _prepare_per(stock_data, share_data):
    daily_data = stock_data[common.DAILY]
    day = sorted(daily_data.keys(), reverse=True)[0]
    var_per = common.field_var(u'本益比')
    c_key = stock_data[common.META][common.META_CATEGORY_KEY]

    per = daily_data[day][var_per]
    avg_per = share_data['categories'][c_key][day][var_per]
    return per, avg_per
Example #5
0
def calculate_average_per(average_day, total):
    average_day[common.TOTAL] = total
    for field in (u'4Q本益比', u'本益比'):
        field_name = common.field_var(field)
        count = average_day[field_name + common.AVG_COUNT]
        if count:
            avg = average_day[field_name + common.AVG_SUM] / count
        else:
            avg = 0
        average_day[field_name] = avg
Example #6
0
def _prepare_amount(stock_data, share_data):
    daily_data = stock_data[common.DAILY]
    days = sorted(daily_data.keys(), reverse=True)
    latest_day = days[0]
    exam_days = days[1:6]

    var_amount = common.field_var(u'成交量')

    avg_amount = sum(
        (daily_data[d][var_amount] for d in exam_days)) / len(exam_days)
    latest_amount = daily_data[latest_day][var_amount]
    return latest_amount, avg_amount
Example #7
0
def format_basic(stock_data, data=None):
    """ format basic info """
    meta = stock_data[common.META]
    daily = stock_data[common.DAILY]

    latest_day = common.get_latest_day(stock_data)
    day = daily[latest_day]

    data = data if data is not None else PresentData(u'股票')
    data.add(u'號碼', _get(meta, common.META_STOCK_NO))
    data.add(u'名稱', _get(meta, common.META_NAME))
    data.add(u'資料日期', latest_day)
    for f in (u'股價', u'成交量'):
        var = common.field_var(f)
        data.add(f, _format_float(_get(day, var)))
    return data
Example #8
0
def _per(data, yn, stock_data, share_data, title, verbose=False):
    meta = stock_data[common.META]
    daily = stock_data[common.DAILY]

    section = data.add_section(u'本益比')
    section.add(*_pass(yn, title=title))
    if verbose:
        day = common.get_latest_day(stock_data)
        var_per = common.field_var(u'本益比')
        c_key = meta[common.META_CATEGORY_KEY]

        per = daily[day][var_per]
        avg_per = share_data['categories'][c_key][day][var_per]
        section.add(u'本益比', _format_float(per))
        section.add(u'分類平均', _format_float(avg_per))
        section.add(u'比例', _format_float(per / avg_per))
        section.add(u'分類', c_key)
Example #9
0
def _amount(data, yn, stock_data, share_data, title, verbose=False):
    meta = stock_data[common.META]
    daily = stock_data[common.DAILY]

    section = data.add_section(u'成交量')
    section.add(*_pass(yn, title=title))

    days = meta[common.META_DAYS]
    latest_day = days[0]
    exam_days = days[1:6]

    var_amount = common.field_var(u'成交量')

    avg_amount = sum(
        (daily[d][var_amount] for d in exam_days)) / len(exam_days)
    latest_amount = daily[latest_day][var_amount]

    section.add(latest_day, _format_float(latest_amount))
    section.add(u'前五日平均', _format_float(avg_amount))
    section.add(u'比例', _format_float(latest_amount / avg_amount))
    if verbose:
        for d in exam_days:
            section.add(d, _format_float(daily[d][var_amount]))
Example #10
0
def _add_finance_field(section, finance, field_name):
    section.add(field_name,
                _format_float(_get(finance, common.field_var(field_name))))