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)
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
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
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
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
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
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
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)
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]))
def _add_finance_field(section, finance, field_name): section.add(field_name, _format_float(_get(finance, common.field_var(field_name))))