Создайте Telegram-бота с графиками цен на акции и свечами с помощью Python
Программируйте с силой, только с Майком!
В этом уроке мы проведем вас через шаги по созданию Telegram-бота, который получает последнюю цену акций и отображает свечной график для любого заданного тикера акции. К концу этого руководства у вас будет полнофункциональный бот, который может предоставлять данные об акциях в режиме реального времени, с дополнительным свечным графиком для технического анализа.
Зачем создавать стокового бота?
Автоматизация выборки цен на акции может быть невероятно полезной для мониторинга инвестиций или исследования рыночных тенденций. Этот бот позволит вам быстро получать актуальные цены на акции и визуализировать движение цен с помощью свечного графика, используя данные Yahoo Finance. Это практичный инструмент для трейдеров и энтузиастов финансов.
Необходимые условия
Прежде чем мы углубимся в программирование, убедитесь, что у вас есть следующее:
Шаг 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.
Интересует создание миниапсов или ботов в телеграмме?
Хотите заказать или научиться делать сами?
Обращайтесь в наш канал Вокруг Крипты