ИТ
December 1, 2024

Создайте Telegram-бота с графиками цен на акции и свечами с помощью Python

Mike Soft Labs

Создание Telegram-бота с графиками цен акций и свечей с помощью Python

Программируйте с силой, только с Майком!

В этом уроке мы проведем вас через шаги по созданию Telegram-бота, который получает последнюю цену акций и отображает свечной график для любого заданного тикера акции. К концу этого руководства у вас будет полнофункциональный бот, который может предоставлять данные об акциях в режиме реального времени, с дополнительным свечным графиком для технического анализа.

Зачем создавать стокового бота?

Автоматизация выборки цен на акции может быть невероятно полезной для мониторинга инвестиций или исследования рыночных тенденций. Этот бот позволит вам быстро получать актуальные цены на акции и визуализировать движение цен с помощью свечного графика, используя данные Yahoo Finance. Это практичный инструмент для трейдеров и энтузиастов финансов.

Необходимые условия

Прежде чем мы углубимся в программирование, убедитесь, что у вас есть следующее:

  • Python установлен на вашем компьютере.
  • Токен Telegram-бота от BotFather.
  • Базовое понимание Python.

Шаг 1: Настройка базового бота Telegram

Для начала создадим скелет нашего бота. Это будет включать в себя основные команды, такие как и ./start/help

Установите необходимые библиотеки

Вам понадобятся следующие библиотеки:

  • python-telegram-bot: Для сборки интерфейса бота.
  • yfinance: Для получения данных о ценах на акции.
  • mplfinance: Для создания свечных графиков.
  • matplotlib: Для стандартной печати (используется в базовой команде)./stock

Выполните следующую команду для установки этих зависимостей:

pip install python-telegram-bot yfinance mplfinance matplotlib

Базовый код бота

Вот простой бот, который реагирует на команды and. Он также настраивает кнопки для базового взаимодействия./start/help

from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkupfrom telegram.ext import CommandHandler, CallbackQueryHandler, Application, ContextTypesAPI_TOKEN = 'YOUR_API_TOKEN'async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:    await update.message.reply_text("Welcome to the Simple Telegram Bot!")    await show_option_buttons(update, context)async def show_option_buttons(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:    keyboard = [        [InlineKeyboardButton("Option 1", callback_data='button_1')],        [InlineKeyboardButton("Option 2", callback_data='button_2')],        [InlineKeyboardButton("Option 3", callback_data='button_3')],    ]    reply_markup = InlineKeyboardMarkup(keyboard)    await update.message.reply_text('Please choose an option:', reply_markup=reply_markup)async def button_selection_handler(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:    query = update.callback_query    await query.answer()    await query.edit_message_text(f'You selected option: {query.data.split("_")[1]}')async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:    await update.message.reply_text(        'I can respond to the following commands:\n/start - Start the bot\n/help - Get help information'    )def main():    application = Application.builder().token(API_TOKEN).build()    application.add_handler(CommandHandler('start', start))    application.add_handler(CommandHandler('help', help_command))    application.add_handler(CallbackQueryHandler(button_selection_handler, pattern='^button_'))    application.run_polling()if __name__ == '__main__':    main()

Шаг 2: Добавление восстановления цены акций с помощью Yahoo Finance

Теперь давайте добавим функцию для получения последних цен на акции. Мы будем использовать библиотеку для получения биржевых данных.yfinance

Создать команду/stock

Команда получит цену закрытия акции за последние 14 дней и построит базовый график цены./stock

import yfinance as yffrom matplotlib import pyplot as pltimport datetimeimport osfrom telegram import InputFile# Command to fetch stock price and basic line graphasync def stock_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:    try:        ticker = context.args[0].upper()        stock = yf.Ticker(ticker)        end_date = datetime.datetime.now()        start_date = end_date - datetime.timedelta(days=14)        data = stock.history(start=start_date.strftime('%Y-%m-%d'), end=end_date.strftime('%Y-%m-%d'))        if data.empty:            await update.message.reply_text(f"No data found for {ticker}. Please check the ticker symbol.")            return        latest_price = data['Close'].iloc[-1]        fig, ax = plt.subplots(figsize=(10, 5))        data['Date'] = data.index        ax.plot(data.index, data['Close'], label='Close Price')        ax.set_title(f'{ticker} Price - Last 14 Days', fontsize=14)        ax.set_xlabel('Date')        ax.set_ylabel('Price')        ax.legend()        chart_filename = f'{ticker}_chart.png'        plt.savefig(chart_filename)        plt.close()        await update.message.reply_text(f'The current price of {ticker} is ${latest_price:.2f}.')        with open(chart_filename, 'rb') as chart:            await update.message.reply_photo(photo=InputFile(chart))        yahoo_finance_url = f'https://finance.yahoo.com/quote/{ticker}'        await update.message.reply_text(f'View more details here: {yahoo_finance_url}')        os.remove(chart_filename)    except IndexError:        await update.message.reply_text('Please provide a valid ticker symbol. Usage: /stock [ticker]')    except Exception as e:        await update.message.reply_text(f"An error occurred: {str(e)}")

Команда /stock {ticker} на этом этапе выведет следующее сообщение:

Как вы уже видели, я также добавил ссылку на график yahoo finance для тикера в качестве быстрого действия для пользователя.

Шаг 3 (опционально): Добавление команды свечного графика

В качестве следующего шага давайте усовершенствуем бота, добавив команду, которая генерирует свечной график. Свечные графики отлично подходят для анализа движения цен на акции с течением времени.

Мы будем использовать библиотеку для построения свечного графика.mplfinance

Создать команду/stock_candlestick

import mplfinance as mpf# Command to fetch stock price and candlestick graphasync def stock_candlestick_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:    try:        ticker = context.args[0].upper()        stock = yf.Ticker(ticker)        end_date = datetime.datetime.now()        start_date = end_date - datetime.timedelta(days=14)        data = stock.history(start=start_date.strftime('%Y-%m-%d'), end=end_date.strftime('%Y-%m-%d'))        if data.empty:            await update.message.reply_text(f"No data found for {ticker}. Please check the ticker symbol.")            return        latest_price = data['Close'].iloc[-1]        chart_filename = f'{ticker}_candlestick_chart.png'        mpf.plot(data, type='candle', mav=(3, 6), volume=True, show_nontrading=True, savefig=chart_filename)        await update.message.reply_text(f'The current price of {ticker} is ${latest_price:.2f}.')        with open(chart_filename, 'rb') as chart:            await update.message.reply_photo(photo=InputFile(chart))        yahoo_finance_url = f'https://finance.yahoo.com/quote/{ticker}'        await update.message.reply_text(f'View more details here: {yahoo_finance_url}')        os.remove(chart_filename)    except IndexError:        await update.message.reply_text('Please provide a valid ticker symbol. Usage: /stock_candlestick [ticker]')    except Exception as e:        await update.message.reply_text(f"An error occurred: {str(e)}")

Эта команда генерирует свечной график для акции и предоставляет пользователю графическое представление движения цены акции за последние 14 дней.

Шаг 4: Финальный код и тестирование

Теперь, когда у нас есть и базовый линейный график, и свечной график, давайте объединим все в нашем окончательном боте. Вот основная функция, которая поддерживает команды , , , и следующие:/start/help/stock/stock_candlestick

from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup, InputFilefrom telegram.ext import CommandHandler, CallbackQueryHandler, Application, ContextTypesimport yfinance as yfimport mplfinance as mpffrom matplotlib import pyplot as pltimport datetimeimport osAPI_TOKEN = 'YOUR_API_TOKEN'# All the commands (as seen earlier)# Full code here...def main():    application = Application.builder().token(API_TOKEN).build()    application.add_handler(CommandHandler('start', start))    application.add_handler(CommandHandler('help', help_command))    application.add_handler(CommandHandler('stock', stock_command))    application.add_handler(CommandHandler('stock_candlestick', stock_candlestick_command))    application.run_polling()if __name__ == '__main__':    main()

Поместите свой токен API, полученный от BotFather, на место 'YOUR_API_TOKEN' и запустите скрипт:

python main.py

Чтобы протестировать бота, найдите его в Telegram по имени пользователя и начните чат.

Полный код

Вы можете найти полный код, описанный в этой статье, в моем репозитории GitHub: yahoo_finance_telegram_bot.

Интересует создание миниапсов или ботов в телеграмме?

Хотите заказать или научиться делать сами?

Обращайтесь в наш канал Вокруг Крипты