حزمة tasi 2.0 📦


حزم-r


tasi هي حزمة قمت بتطويرها لجلب بيانات السوق السعودي المنشورة لعامة الناس على موقع السوق السعودي. هدفها تسهيل وتبسيط سير عمل تحليل بيانات السوق وتطوير المؤشرات والتحليلات الفنية. الإصدار الأول من هذه الحزمة كان مقتصرا على جلب الأسعار اليومية لأسهم الشركات فقط. لكن مع مرور الوقت قررت أن اوسع أمكانيات هذه الحزمة إلى جلب القوائم المالية ايضا وتنسيق البيانات بصيغة ومعيار يتناسب مع الحزم المتخصص في تحليل التسلسلات الزمنية.

ما الجديد في الحزمة

  • جلب بيانات مؤشرات القطاعات

    الآن بإمكانك جلب ليس فقط اسعار الؤشر العام بل حتى مؤشرات القطاعات التجارية ايضا. تم إضافة حوالي اكثر من عشرين دالة لجلب تلك المؤشرات. جميع الدوال تبدأ بـ get_ ثم أسم القطاع. كل ما عليك فعله هو تحديد المدة الزمنية فقط. إليك هذا المثال
# Install the package if you have not 
# devtools::install_github("Hussain-Alsalman/tasi")
library("tasi")
library("magrittr")
library("ggplot2")
library("dplyr")
library("tidyquant")

# Basic Example  
get_capitals(start_date = "2020-01-01", end_date = "2021-11-27") %>% 
  head()
##           date    high    open     low   close totalVolume  totalTurnover
## 476 2020-01-01 4423.98 4332.37 4371.88 4410.43     4422290  93,012,358.61
## 475 2020-01-02 4483.10 4410.43 4451.19 4461.49     6559384 116,314,994.75
## 474 2020-01-05 4444.04 4461.49 4356.14 4373.23     6900081 155,820,965.02
## 473 2020-01-06 4375.32 4373.23 4274.97 4278.48     6359870 126,953,206.07
## 472 2020-01-07 4374.45 4278.48 4264.59 4298.68     6229559 141,720,681.00
## 471 2020-01-08 4362.64 4298.68 4227.44 4296.50     6365297 135,112,493.24
##     noOfTrades
## 476       7045
## 475       7789
## 474      11095
## 473      10206
## 472       9581
## 471       9872
# More sophisticated Example

bnk_df <- get_banks(start_date = "2021-06-01", end_date = "2021-11-30") %>%
  mutate(date = lubridate::ymd(date))

  ggplot(bnk_df,mapping = aes(x = date, y = close)) +
    geom_candlestick(mapping = aes(open =open,
                                   high= high,
                                   low = low,
                                   close = close)) + 
    scale_x_date(date_labels = "%b-%d-%Y",date_breaks = "month") + 
    theme_bw() + 
    geom_smooth() +
    labs(title = "Bank Industry performance over June-Nov 2021 period",
         subtitle = "Rapid recovery was corrected during the month of November")

  • تعديل سعر السهم ليتضمن الارباح الموزعة

    من العمليات الشائعة في تحليل الأسهم هو حساب عوائد السهم خلال فترة زمنية معينة (معدل التغير في سعر السهم). لكن ذلك لا يعكس العائد الكلي للسهم لأن معظم الشركات تقوم بتوزيع الأرباح للمساهمين مما يشكل عائد إضافي للمستثمر. لذلك قمت بتطوير دالة تقوم بتعديل سعر السهم ليعكس ايضا الارباح الموزعة. إليك هذا المثال
library("tasi")
comp_symbol <- 1180 #NCB Bank. 
comp <- get_company_records(start_date = "2020-01-01",
                    end_date = "2021-11-27",
                    company_symbol = comp_symbol
                    )
comp %>% 
  df_to_xts() %>% # converting it to xts format 
  head()
##             Open  High   Low  Volume Close
## 2020-01-01 49.25 49.25 48.60  361128 48.65
## 2020-01-02 48.65 48.85 48.25  627781 48.80
## 2020-01-05 47.20 48.50 47.20  952211 47.40
## 2020-01-06 47.20 47.45 46.60 2101193 46.90
## 2020-01-07 47.00 47.25 46.45 1300968 46.50
## 2020-01-08 46.20 46.30 45.80 1306755 46.30
comp %>% add_adj_price(comp_symbol) %>% head()
##             Open  High   Low  Volume Close Adjusted
## 2020-01-01 49.25 49.25 48.60  361128 48.65 45.85164
## 2020-01-02 48.65 48.85 48.25  627781 48.80 45.99302
## 2020-01-05 47.20 48.50 47.20  952211 47.40 44.67354
## 2020-01-06 47.20 47.45 46.60 2101193 46.90 44.20230
## 2020-01-07 47.00 47.25 46.45 1300968 46.50 43.82531
## 2020-01-08 46.20 46.30 45.80 1306755 46.30 43.63682
  • جلب بيانات الأسهم على طريقة quantmod::getSymbols

من حزم R الشهيرة جدا في عالم تحليل سوق المال هي quantmod. هذه الحزمة توفر الكثير من الأدوات التحليلية الرائعة لكنها لا تعمل بشكل سلس مع بيانات الأسواق الغير امريكية. لذلك قمت بتطوير دالة مماثلة لـ getSymbols() للسوق السعودي. إليك هذا المثال

library("quantmod")
library("tasi")
tasi::getSymbols(start_date = "2021-01-01",
                 end_date = "2021-11-27",
                 symbol_vector = c(2222,1180,1010))

#make sure to prefix the company symbol num by "T" 
chart_Series(T2222)


  • جلب القوائم المالية

    لعل هذه الميزة هي الأقوى بين المزايا في الحزمة الجديد. هناك الكثير من المعدٌلات والنِسَب المالية التي يحتاج المستثمر حسابها ليحدد مدى كفاءة تشغيل الشركة أو مدى ربحيتها او معدل تغير سبل التمويل لديها. كل هذه المعلومات وغيرها يمكن العثور عليها في القوائم المالية لكن ذلك يتطلب الكثير من البحث اليدوي. لذلك قمت بتطوير عدة دوال تبسط هذه العملية. إليك هذا المثال
library("tasi")
library("kableExtra")

get_income_statement(company_symbol = 1010,
                    period_type = "y" # "q" for quarterly and "y" for yearly
                    ) %>%
  head() %>%
  kbl(table.attr = "style='direction: ltr'")
statement_of_income Y_2020 Y_2019 Y_2018 Y_2017
Special Commission Income 9813394000 10371426000 8332365000 7425107000
Special Commission Expenses 1599789000 2534411000 1646601000 1490030000
Net Special Commission Income 8213605000 7837015000 6685764000 5935077000
Fees from Services 1873555000 2030745000 1711052000 1510314000
Exchange Income 412614000 342658000 337043000 290207000
Trading Income 218297000 132806000 2717000 21815000


  • جلب القوائم المالية الأخرى من صيغة XBRL

    لقد سبق وتحدث بشكل مفصل عن صيغة XBRL الخاصة بالتقارير المالية يمكنك الأطلاع على التدوينة هنا. هذه الصيغة تمكننا من جلب معلومات اضافية من التقارير الربعية والسنوية بالأيضاحات ومعلومات مدققي المحاسبة. إليك هذا المثال
library("tasi")
library("kableExtra")
# NOTE!!! This function will ask you to choose from available statements if you leave statement_type unfilled. 
get_statement_xbrl(company_symbol = 2350,
                   period = "Q1-2021",
                   statement_type = "StatementOfFinancialPositionCurrentNonCurrent") %>%
  .[c(1:3,6:10),] %>% 
  kbl(table.attr = "style='direction: ltr'")
[300200] Statement of financial position, current/ non-current
Start Date 2021-01-01 2020-01-01 2020-01-01 Note No. 
End Date 2021-03-31 2020-03-31 2020-12-31 Note No. 
Statement of financial position [abstract]
Bank balances and cash 884,724 533,923 564,726
Short-term deposits 952,500 1,282,500 615,000
Trade accounts receivable 2,844,837 2,108,162 2,643,059
Prepayments 80,083 79,143 96,028
Inventories 1,319,617 1,219,801 1,280,975


هذه الصيغة تمكننا من استخراج معلومات معينة وإجراء حسابات متخصصة مثل معدل دوران الأصول asset turnover ratio لقياس مدى كفاءة الشركة في توظيف مواردها. إليك هذا المثال :

balance_sheet <- get_statement_xbrl(company_symbol = 2350,
                   period = "Q1-2021",
                   statement_type = "StatementOfFinancialPositionCurrentNonCurrent") 
income_statement <- get_statement_xbrl(company_symbol = 2350,
                   period = "Q1-2021",
                   statement_type = "StatementOfIncomeNatureOfExpense") 
colnames(income_statement) <- c("Term", "Q1_2021", "Q1_2020")
colnames(balance_sheet) <- c("Term", "Q1_2021", "Q1_2020", "FY_2020")


sales <- income_statement[stringr::str_detect(string = income_statement$Term,"Sales of goods"),2:3]
assets <- balance_sheet[stringr::str_detect(string = balance_sheet$Term,"Total assets"),2:3]

sales <- sales %>% gsub(x = .,",","") %>%  as.numeric()
assets <- assets  %>% gsub(x = .,",","") %>%  as.numeric()
names(sales) <- c("Q1_2021", "Q1_2020")
names(assets) <- c("Q1_2021", "Q1_2020")

# Asset turn over is 
print("Asset Turnover ratio Q/Q")
## [1] "Asset Turnover ratio Q/Q"
unlist(sales)/unlist(assets)
##    Q1_2021    Q1_2020 
## 0.07950360 0.05407454

جرب بنفسك

كامل الكود تجده هنا

comments powered by Disqus