def price_section(df, period: str): """ 获取某个周期的boll上下轨的值 以及 收敛情况 :param df: 包含boll数据 的DateFrame :param period: 自定义周期 :return: 返回boll上下轨的值 及 收敛情况 """ last_df = df.iloc[-1, :] boll_up = last_df['boll_up'] boll_low = last_df['boll_low'] boll_sd_df = df['boll_SD'] sd_mean = boll_sd_df[-10:].mean() # print(sd_mean) boll_sd = '正常' if boll_sd_df.iloc[-1] > sd_mean: boll_sd = '发散' if boll_sd_df.iloc[-1] < sd_mean: boll_sd = '收敛' return { f'{period}_boll_up': get_float(boll_up), f'{period}_boll_low': get_float(boll_low), f'{period}_boll_sd': boll_sd, f'{period}_close': get_float(last_df['close']), f'{period}_high': get_float(last_df['high']), f'{period}_low': get_float(last_df['low']), }
def trade_day(stock_code, asset='E'): start_day = datetime.datetime.strptime(str( datetime.date.today()), '%Y-%m-%d') + datetime.timedelta(days=-200) start_date = start_day.date().strftime('%Y%m%d') day_df = ts.pro_bar(ts_code=stock_code, start_date=start_date, asset=asset, freq='D', adj='qfq') day_df.sort_values(by='trade_date', inplace=True) my_BOLL(day_df) my_MA(day_df) my_MA(day_df, item='vol', timeperiod=(10, )) my_swing(day_df) my_MACD(day_df) my_KDJ(day_df) # day_df.to_csv('kdj.csv') price_res = price_section(day_df, period='day') trend_res = trend(day_df) probab_res = probability(day_df) deviation_res = deviation(day_df) res_day = dict(**price_res, **probab_res, **trend_res, **deviation_res) advice = give_advice(res_day) # trend_res.get('ma_trend') # trend_res.get('trend_go_on') section = '' if '买入' in advice: section_low = get_float(float(price_res.get('day_boll_low')) * 0.98) section_up = get_float(float(price_res.get('day_boll_low')) * 1.02) section += f'交易区间:({section_low},{section_up})' elif '卖出' in advice: section_low = get_float(float(price_res.get('day_boll_up')) * 0.98) section_up = get_float(float(price_res.get('day_boll_up')) * 1.02) section += f'交易区间:({section_low},{section_up})' else: pass html_day = f""" <div> <div style="color: magenta;height: 10px"><b>日参考:</b></div> <ul> <li>趋势:<b style="color: blue">{' ++ '.join(trend_res.values())}</b></li> <li>背离:<b style="color: red">{' ++ '.join(deviation_res.values())}</b></li> <li>KDJ:【{probab_res.get('buy_sell')}】 快值K:{probab_res.get('value').get('kdj_k')} 慢值D:{probab_res.get('value').get('kdj_D')}</li> <li>BOLL:<b>{price_res.get('day_boll_sd')}</b> 区间:【{price_res.get('day_boll_low')},{price_res.get('day_boll_up')}】</li> <li>交易参考:<b style="color: blue">{advice}</b> {section}</li> </ul> </div> """ # return report_body return html_day
def fromMillimeters(self, value): """Scale a value from an equivalent distance in millimeters. fromMillimeters(value) """ _v = util.get_float(value) if self.__unit == Unit.MILLIMETERS: _sv = _v elif self.__unit == Unit.MICROMETERS: _sv = _v * 1e3 elif self.__unit == Unit.METERS: _sv = _v * 1e-3 elif self.__unit == Unit.KILOMETERS: _sv = _v * 1e-6 elif self.__unit == Unit.INCHES: _sv = _v / 25.4 elif self.__unit == Unit.FEET: _sv = _v / 304.8 elif self.__unit == Unit.YARDS: _sv = _v / 914.4 elif self.__unit == Unit.MILES: _sv = _v / 1609344.4 else: raise ValueError, "Undefined unit value! " + str(self.__unit) return _sv
def probability(df): # 1. kdj指标 K、D的值与20 80 比较 给出超买 超卖结论 last_kdj = df.iloc[-1, :] k_value = last_kdj['kdj_K'] d_value = last_kdj['kdj_D'] buy_sell = '合理' if d_value > 80 or k_value > 80: buy_sell = '超买' if d_value < 20 or k_value < 20: buy_sell = '超卖' res = { 'buy_sell': buy_sell, 'value': { 'kdj_k': get_float(k_value, 2), 'kdj_D': get_float(d_value, 2) } } return res
def get_market(): #util.clean_market(0) url = 'http://pregao-online.bmfbovespa.com.br/Cotacoes.aspx' soup = BeautifulSoup(urlfetch.fetch(url, deadline=50).content, 'lxml') rate = util.get_exchange() #dt = get_datetime() dt = datetime.datetime.now(tz.tzstr('EBST3EBDT')) market = Market(ref=0, date=dt.date(), time=dt.time(), exchange_rate=rate) market.put() table = soup('table', attrs={'id': 'ctl00_DefaultContent_GrdCarteiraIndice'})[0] for tr in table('tr')[1:]: tds = tr('td') code = str(tds[0].string) name = util.clean_string(tds[1].string) value = util.get_float(tds[2].string) diff = util.get_float(tds[3].text.strip()) stock = Stock(name=util.get_or_create_name(0, code, name), value=value, diff=diff, market=market.key()) stock.put()
def week_price_section(df_month, df_week): """ 根据boll来判断价格区间 :param df_month: :param df_week: :return: """ # 1. 月线boll线上下轨 last_month_df = df_month.iloc[-1, :] second_month_df = df_month.iloc[-2, :] next_month_boll_up = last_month_df['boll_up'] * 2 - second_month_df[ 'boll_up'] next_month_boll_low = last_month_df['boll_low'] * 2 - second_month_df[ 'boll_low'] # 2. 周线boll线上下轨 标准差收敛情况 week_boll_up_df = df_week['boll_up'] week_boll_low_df = df_week['boll_low'] week_boll_mid_df = df_week['boll_mid'] # 计算收敛情况 week_boll_sd_df = df_week['boll_SD'] sd_mean = week_boll_sd_df[-10:].mean() # print(sd_mean) week_boll_sd = '正常' if week_boll_sd_df.iloc[-1] > sd_mean: week_boll_sd = '发散' if week_boll_sd_df.iloc[-1] < sd_mean: week_boll_sd = '收敛' # 计算下一周的boll上下轨价格 next_week_up = week_boll_up_df.iloc[-1] * 2 - week_boll_up_df.iloc[-2] next_week_low = week_boll_low_df.iloc[-1] * 2 - week_boll_low_df.iloc[-2] next_week_mid = week_boll_mid_df.iloc[-1] * 2 - week_boll_mid_df.iloc[-2] # 3. 计算周线boll线上轨附近卖出价格区间 下轨附近买入区间 last_week_df = df_week.iloc[-1, :] last_close = last_week_df['close'] risk_rate_income, section = 0, 0 # 进入观察区的价格浮动比率 look_k = 0.05 # 买入价格浮动比率 k = 0.025 # 回报风险比 income_rate_risk = 0 # boll线,上轨附近,卖出 给出价格区间 # boll线上轨附近 if abs(last_close - next_week_up) < next_week_mid * look_k: section = (get_float(next_week_up - k * week_boll_mid_df.iloc[-1]), get_float(next_week_up + k * week_boll_mid_df.iloc[-1])) # 卖出 收益风险比很小 income_rate_risk = 0.01 # boll线下轨 买入 给出买入区间 if abs(last_close - next_week_low) < week_boll_mid_df.iloc[-1] * look_k: section = (get_float(next_week_low - k * week_boll_mid_df.iloc[-1]), get_float(next_week_low + k * week_boll_mid_df.iloc[-1])) try: income_rate_risk = (next_week_mid - last_close) / (last_close - next_week_low) - 1 except: income_rate_risk = 6 if income_rate_risk > 5 or -2 < income_rate_risk < -1: income_rate_risk = 5 res = { # 本月boll上轨 'month_boll_up': get_float(next_month_boll_up), 'month_boll_low': get_float(next_month_boll_low), # 下周boll 'next_week_up': get_float(next_week_up), 'next_week_mid': get_float(next_week_mid), 'next_week_low': get_float(next_week_low), # 'last_week_high':last_week_df['high'], # 'last_week_low':last_week_df['low'], 'week_boll_sd': week_boll_sd, # 风险回报比 'income_risk': get_float(income_rate_risk), # 价格参考区间 'section': section, } return res