def yield_rate_plot(data: pd.DataFrame, stocks: []): """ 收益率图表 :param data: 数据 :param stocks: 股票 :return: """ time = data.loc[(data["symbol"] == stocks[0])]['time'] time = timestamp_2_date(time.tolist()) min_date = time[0] max_date = time[-1] df = pd.DataFrame(index=time[1:]) for stock in stocks: stock_data = data.loc[(data['symbol'] == stock)] logging.info('%s data size %s', stock, len(stock_data)) ln_return_rate = log_yield_rate(list(stock_data['close'])) df[stock] = np.cumsum(ln_return_rate) print(np.cumsum(ln_return_rate)) g = sns.lineplot(data=df) # X轴刻度设置 g.format_xdata = dates.AutoDateFormatter(dates.MonthLocator()) plt.legend() plt.title('ETF累计收益率({0} - {1})'.format(date_2_month(min_date), date_2_month(max_date))) plt.show()
def week_line_overlay_plot(data: pd.DataFrame, stocks: []): time = data.loc[(data["symbol"] == stocks[0])]['time'] time = timestamp_2_date(time) df = pd.DataFrame(index=time) for stock in stocks: stock_data = data.loc[(data["symbol"] == stock)] df[stock] = normalize(stock_data, 'close') g = sns.lineplot(data=df) # X轴刻度设置 g.format_xdata = dates.AutoDateFormatter(dates.WeekdayLocator()) plt.legend() plt.show()
def linear_regression_plot(data: pd.DataFrame, stocks: [], base_stock: str): """ 线性回归图 :param data: 数据 :param stocks: 票代码 :return: 基准票代码 """ spy_data = data.loc[(data['symbol'] == base_stock)] return_spy = spy_data['close'].pct_change().dropna() time = timestamp_2_date(spy_data['time'].tolist()) min_date = time[0] max_date = time[-1] m, n = subplot_num(len(stocks) - 1) fig = plt.figure() idx = 1 for stock in stocks: if stock == base_stock: continue stock_data = data.loc[(data["symbol"] == stock)] logging.info("%s data size %s", stock, len(stock_data)) return_stock = list(stock_data['close'].pct_change().dropna()) alpha_spy, beta_spy = alpha_beta(return_spy, return_stock) x2 = np.linspace(return_spy.min(), return_spy.max(), 100) y_hat = x2 * beta_spy + alpha_spy ax = fig.add_subplot(m, n, idx) ax.scatter(list(return_spy), return_stock, alpha=0.3) ax.plot(x2, y_hat, alpha=0.9) plt.xlabel('{0} Return'.format(base_stock)) plt.ylabel('{0} Return'.format(stock)) idx += 1 plt.suptitle('以{0}为基准的线性回归({1} - {2})'.format(base_stock, date_2_month(min_date), date_2_month(max_date))) plt.show()
def line_overlay_plot(data: pd.DataFrame, stocks: [], plotDateType: PlotDateType): """ 拆线叠加图 :param data: :param stocks: :param plotDateType: :return: """ time = data.loc[(data["symbol"] == stocks[0])]['time'] time = timestamp_2_date(time.tolist()) min_date = time[0] max_date = time[-1] df = pd.DataFrame(index=time) for stock in stocks: stock_data = data.loc[(data["symbol"] == stock)] # logging.info(timestamp_2_month(stock_data['time'])) stock_data = list(normalize(stock_data, 'close')) logging.info('%s %s', stock, len(stock_data)) df[stock] = stock_data g = sns.lineplot(data=df) # X轴刻度设置 date_locator = None if plotDateType == PlotDateType.MONTH: date_locator = dates.AutoDateFormatter(dates.MonthLocator()) elif plotDateType == PlotDateType.WEEK: date_locator = dates.AutoDateFormatter(dates.WeekdayLocator()) elif plotDateType == PlotDateType.DAY: date_locator = dates.AutoDateFormatter(dates.DateLocator()) g.format_xdata = date_locator # 鼠标hover 事件 # plt.gcf().canvas.mpl_connect('motion_notify_event', onpick) plt.title('ETF价格叠加图({0} - {1})'.format(date_2_month(min_date), date_2_month(max_date))) plt.legend() plt.show()
def correlation_coefficient_plot(data: pd.DataFrame, stocks: []): """ 计算关联系数 :param data: :param stocks: :return: """ time = data.loc[(data["symbol"] == stocks[0])]['time'] time = timestamp_2_date(time.tolist()) min_date = time[0] max_date = time[-1] df = pd.DataFrame() for stock in stocks: stock_data = data.loc[(data["symbol"] == stock)] df[stock] = stock_data['close'].values corr = df.corr() plt.figure(figsize=(12, 10)) foo = sns.heatmap(corr, vmax=0.6, square=True, annot=True) plt.show()