UAS Mata Kuliah Optimasi

Optimalisasi Portofolio Koin Kripto

Valensius Jimy

December 14, 2023

Kontak \(\downarrow\)
Email
Instagram https://www.instagram.com/valjimy_/
RPubs https://rpubs.com/valensiusjimy/

1 Pendahuluan

  Sejak pandemi COVID-19 menyerang lini kehidupan di seluruh dunia, termasuk Indonesia banyak sekali hal baru yang dipelajari oleh masyarakat, khususnya di Indonesia untuk kalangan muda pada masa pandemi, kegiatan trading menjadi suatu hal yang sangat menarik untuk dipelajari. Trading sendiri memiliki banyak partisi, misalnya saham, forex, kripto dan lainnya. Hal ini merupakan sebuah kenyataan bagi penulis sendiri, dimana semasa pandemi penulis belajar banyak tentang trading, khususnya dalam bidang kripto dan hingga sekarang masih terus berjalan walaupun banyak pil pahit yang harus ditelan.
  Berbicara tentang kripto, banyak masyarakat yang sangat tertarik untuk terjun dalam kripto karena beranggapan bisa meraih keuntungan yang cukup besar dan di beberapa negara Eropa pembayaran sudah bisa menggunakan kripto, sehingga terdapat beberapa konspirasi bahwa kripto akan menjadi satu kesatuan mata uang untuk seluruh negara pada waktu yang akan datang. Hal ini menjadi kontroversial yang cukup panas dalam kalangan masyarakat Indonesia, terdapat pihak yang pro dan tentunya ada yang kontra.
  Kripto sendiri sering disebut cryptocurrency atau mata uang kripto karena fungsinya yang memang dapat menjadi alat pembayaran pada beberapa negara, misalnya untuk membeli KFC di negara Spanyol sudah bisa menggunakan mata uang kripto ini. Kripto bersifat aset digital, hal ini sejalan dengan yang diungkapkan oleh Teguh Kurniawan Harmanda, M.Ec.Dev. yang merupakan Ketua Asosiasi Pedagang Aset Kripto Indonesia (ASPAKRINDO), dimana beliau menjelaskan bahwa aset kripto merupakan komoditi yang tidak berwujud berbentuk digital yang menggunakan kriptografi dan jaringan peer to peer.
  Pada kesempatan kali ini, penulis ingin memberikan salah satu ilmu dalam mata kuliah Optimasi yang mana menggunakan beberapa konsep yang telah dipelajari untuk membuat Optimisasi pada Portofolio Kripto. Umumnya, untuk proses optimisasi menggunakan portfolio saham, tetapi penulis ingin mencoba hal baru yang jarang dilakukan oleh beberapa orang. Pada portofolio kripto akan menggunakan beberapa contoh koin yang dimiliki oleh penulis, dengan tujuan penulis juga dapat belajar dan mendapat informasi untuk optimisasi agar kedepannya lebih baik lagi.

2 Library Pada Proses Optimalisasi

  Pada proses optimisasi portofolio menggunakan bantuan bahasa pemrograman R, kita perlu meng-install beberapa paket atau library untuk memerintahkan atau membuat suatu sintaks dalam melakukan analisa. Library yang dibutuhkan dapat diperhatikan seperti berikut ini:

pacman::p_load(tidyverse,
               tidyquant,
               tidyr,
               DT,
               timetk,
               forcats,
               plotly,
               hrbrthemes,
               tint,
               tufte,
               prettydoc,
               rmdformats)

3 Grafik Market Kripto Sejak Awal Tahun 2023

koin <- c('BTC-USD', 'ETH-USD', 'MATIC-USD', 'SHIB-USD', 'DOGE-USD')

harga <- tq_get(koin,
                from = '2023-01-01',
                to = Sys.Date(),
                get = 'stock.prices')

harga %>%
  plot_ly(x = ~date,
          type = 'candlestick',
          open = ~open,
          close = ~close,
          high = ~high,
          low = ~low)


  Grafik di atas sebagai gambaran umum mengenai perjalanan kripto sejak awal tahun 2023 atau lebih tepatnya 1 Januari 2023 hingga sekarang. Secara umum, kripto terkhususnya untuk Bitcoin mengalami kondisi yang dinamakan Bullish atau diartikan kondisi yang trennya meningkat. Hal ini dibuktikan dari grafik yang mana pada bulan Januari angkanya di bawah 20ribu USD dan pada saat ini sudah menyentuh 40ribu USD.

4 Proses Optimalisasi

  Pada proses optimalisasi kripto ini yang mana bertujuan unuk mengendalikan resiko pada investasi kripto ini dan menanalisis bagaimana keuntungan yang didapat. Nantinya akan dianalisis resiko untuk masing-masing koin dan tentunya dengan menganalisis return yang didapat juga. Langkah yang harus ditempuh atau dilakukan dalam melakukan optimalisasi portofolio ini adalah sebagai berikut:
* Mengumpulkan data harga koin kripto yang ingin dianalisis
* Melakukan analisa pada koin tersebut.
* Menghitung besaran risiko dan return sebagai penilai untuk mengambil keputusan dalam melakukan pemilihan koin.

4.1 Mengumpulkan Data

  Hal yang paling penting pada permulaan adalah mengumpulkan datanya, jika tidak ada data langkah selanjutnya tidak akan bisa dijalankan. Untuk data yang dikumpulkan adalah data harga untuk beberapa koin yang ingin dianalisis, khususnya koin yang dimiliki oleh penulis. Adapun untuk koinnya sebagai berikut ini:
* BITCOIN (BTC)
* ETHEREUM (ETH)
* BITTORENT (BTT)
* SHIBA INU (SHIB)
* DOGE COIN (DOGE)

koin <- c('BTC-USD', 'ETH-USD', 'MATIC-USD', 'SHIB-USD', 'DOGE-USD')

harga <- tq_get(koin,
                from = '2023-01-01',
                to = Sys.Date(),
                get = 'stock.prices')

head(harga, 5)
## # A tibble: 5 × 8
##   symbol  date         open   high    low  close      volume adjusted
##   <chr>   <date>      <dbl>  <dbl>  <dbl>  <dbl>       <dbl>    <dbl>
## 1 BTC-USD 2023-01-01 16548. 16630. 16521. 16625.  9244361700   16625.
## 2 BTC-USD 2023-01-02 16626. 16759. 16572. 16688. 12097775227   16688.
## 3 BTC-USD 2023-01-03 16689. 16760. 16622. 16680. 13903079207   16680.
## 4 BTC-USD 2023-01-04 16680. 16965. 16668. 16863. 18421743322   16863.
## 5 BTC-USD 2023-01-05 16863. 16884. 16790. 16837. 13692758566   16837.

Catatan : data yang ditampilkan hanya 5 data teratas.

4.2 Return

  Selanjutnya, ketika sudah melakukan proses pengumpulan data kita dapat melanjutkan dengan mencari tahu atau menghitung bagaimana return yang didapatkan ketika memiliki koin kripto tersebut, untuk perhitungannya dalam jangka harian.

return <- harga %>%
  group_by(symbol) %>%
  tq_transmute(select = adjusted,
               mutate_fun = periodReturn,
               period = 'daily',
               col_rename = 'ret',
               type = 'log') 
  
datatable(return)

4.3 Rerataan Return

  untuk nilai return di atas adalah nilai untuk hariannya, kita dapat mencari untuk nilai rata-rata nilai tersebut untuk memudahkan kita menyimpulkan suatu informasinya.

ret <- return %>%
  spread(symbol, value = ret) %>%
  tk_xts()
## Warning: Non-numeric columns being dropped: date
## Using column `date` for date_var.
rerata_ret <- colMeans(ret)
knitr::kable(round(rerata_ret, 5))
x
BTC-USD 0.00272
DOGE-USD 0.00090
ETH-USD 0.00181
MATIC-USD 0.00042
SHIB-USD 0.00060


koin <- c("BTC", "ETH", "DOGE", "MATIC", "SHIB")
return <- c(0.00266, 0.00176, 0.0009, 0.00039, 0.00052)
data <- data.frame(koin, return)

library(ggplot2)
warna <- c("#FFB6C1", "#ADD8E6", "#90EE90", "#FFD700", "#D3D3D3")

ggplot(data, aes(x = koin, y = return)) +
  geom_bar(stat = "identity", fill = warna, alpha = 0.8) +
  geom_text(aes(label = round(return, 6)), vjust = -0.5, color = "black", size = 3) +
  labs(title = "Return Koin Kripto",
       x = "Koin",
       y = "Return") +
  theme_minimal()


  Pada hasil di atas dapat dilihat bahwa rata-rata nilai return paling tinggi adalah koin BTC atau Bitcoin karena memang secara data juga dapat dibuktikan bahwa koin ini mengalami kenaikan yang cukup signifikan, diikuti oleh ETH. Sebaliknya, koin MATIC mendapat nilai paling rendah dibanding 4 koin lainnya karena koin ini sempat mengalami penurunan yang drastis.

4.4 Matriks Kovariansi

  Perhitungan ini cukup penting pada proses optimalisasi, dimana tujuannya untuk mencari tahu hubungan arah antara harga koin tertentu. Pada proses ini terdapat 2 nilai, untuk positif artinya koin bergerak dengan arah yang sama dan untuk nilai negatif berlaku sebaliknya.

cov_mat <- cov(ret) * 365
knitr::kable(round(cov_mat,4))
BTC-USD DOGE-USD ETH-USD MATIC-USD SHIB-USD
BTC-USD 0.1911 0.1645 0.1700 0.1925 0.1504
DOGE-USD 0.1645 0.3878 0.1785 0.2439 0.2562
ETH-USD 0.1700 0.1785 0.2152 0.2328 0.1718
MATIC-USD 0.1925 0.2439 0.2328 0.4865 0.2357
SHIB-USD 0.1504 0.2562 0.1718 0.2357 0.8837


  Mungkin terdapat pertanyaan, terlihat pada kodingan di atas, mengapa dikalikan dengan nilai 365 dan untuk menjawab ini didasarkan pada waktu pasar kripto tidak ada libur, artinya terus berjalan entah jual atau beli akan tetap dilakukan setiap saat. Berbeda dengan saham, dimana terdapat hari libur yang tidak bisa digunakan untuk perdagangan saham, sehingga dalam setahun hanya 252 hari bersihnya. Nilai 365 hari dihitung secara satu tahun full selama tahun 2023.

5 Penerapan Metode Portofolio

  Untuk menerapkan metode portofolio secara efektif, pertimbangan utama melibatkan perhitungan teliti terkait pengembalian dan risiko portofolio. Langkah-langkah ini bergantung pada beberapa faktor kunci yang perlu dipertimbangkan. Pertama, adalah penetapan bobot atau alokasi yang tepat untuk setiap aset dalam portofolio. Misalnya, penggunaan bobot acak atau strategi tertentu yang didasarkan pada preferensi investor. Selanjutnya, perhitungan rata-rata pengembalian dari masing-masing aset menjadi krusial untuk mengetahui hasil yang diharapkan dari portofolio secara keseluruhan.

Saat mempertimbangkan risiko, perhitungan standar deviasi atau risiko portofolio menjadi penting untuk memahami tingkat variabilitas atau ketidakpastian hasil investasi. Pengukuran ini mencerminkan seberapa jauh pengembalian aktual dari portofolio dapat berfluktuasi dari rata-rata yang diharapkan. Selain itu, bobot portofolio yang disesuaikan dengan baik juga merupakan faktor penting. Bobot ini menggambarkan seberapa besar setiap aset berkontribusi terhadap keseluruhan kinerja portofolio. Dengan memperhitungkan komponen-komponen ini secara hati-hati, investor dapat mengelola risiko, mengoptimalkan pengembalian, serta membangun portofolio yang sejalan dengan tujuan investasi.

bobot <- runif(n = length(koin))
bobot <- bobot/sum(bobot)
knitr::kable(bobot)
x
0.3411579
0.2057575
0.0619007
0.3524682
0.0387158


5.1 Return Pada Portofolio

  Selanjutnya, penulis ingin menghitung berapa banyak return yang sudah didapat sejauh ini dari koin yang ada

port_returns <- (sum(bobot * rerata_ret) + 1)^365 - 1
knitr::kable(port_returns)
x
0.6663963


5.2 Risiko Portofolio

  Kemudian, setelah menganalisa return yang didapat, penting juga untuk menghitung risiko yang diterima ketika membeli koin yang ada pada proses ini.

port_risk <- sqrt(t(bobot) %*% (cov_mat %*% bobot))
knitr::kable(port_risk)
0.4931643


  Ternyata lebih besar risiko dibanding dengan nilai return yang didapat oleh penulis.


5.3 Menghitung Nilai Sharpe Ratio

  Nilai Sharpe Ratio adalah salah satu ukuran yang digunakan dalam dunia keuangan untuk mengevaluasi kinerja portofolio investasi. Sharpe Ratio mengukur pengembalian yang dihasilkan oleh portofolio investasi per unit risiko yang diambil.

  Secara matematis, Sharpe Ratio dihitung dengan membagi excess return dari portofolio dengan risiko yang diambil, diukur dalam satuan deviasi dari pengembalian portofolio. Excess return adalah selisih antara pengembalian portofolio dengan tingkat bunga bebas risiko.

  Formula untuk Sharpe Ratio adalah: Sharpe Ratio = (Rp - Rf) / σp

  • Rp adalah pengembalian rata-rata dari portofolio.
  • Rf adalah tingkat bunga bebas risiko.
  • σp adalah deviasi standar dari pengembalian portofolio.


  Secara umum, semakin tinggi nilai Sharpe Ratio, semakin baik kinerja relatif dari portofolio tersebut karena menunjukkan bahwa portofolio telah menghasilkan pengembalian yang lebih tinggi dalam kaitannya dengan risiko yang diambil. Sebaliknya, nilai Sharpe Ratio yang lebih rendah menandakan bahwa portofolio mungkin tidak memberikan pengembalian yang sebanding dengan tingkat risiko yang diambil.

  Sharpe Ratio digunakan sebagai alat untuk membantu investor memilih portofolio yang optimal, karena memungkinkan mereka untuk membandingkan efisiensi pengembalian portofolio relatif terhadap risiko yang diambil, dan juga membantu dalam proses pengambilan keputusan investasi. Namun, perlu diingat bahwa Sharpe Ratio memiliki batasan, termasuk asumsi terkait distribusi pengembalian portofolio dan tingkat bunga bebas risiko yang digunakan dalam perhitungannya.

sharpe_ratio <- port_returns/port_risk
knitr::kable(sharpe_ratio)
1.351266


5.4 Melakukan Optimalisasi Dengan Data Random

num_port <- 5000

random <- matrix(nrow = num_port,
                 ncol = length(koin))

port_returns <- vector('numeric', length = num_port)
port_risk <- vector('numeric', length = num_port)
sharpe_ratio <- vector('numeric', length = num_port)

set.seed(1)
for (i in seq_along(port_returns)) {
  
  bobot <- runif(length(koin))
  bobot <- bobot/sum(bobot)
  
  #store the weights in the matrix
  random[i,] <- bobot
  
  #portfolio returns
  port_ret <- sum(bobot * rerata_ret)
  port_ret <- ((port_ret + 1)^365) - 1
  
  #store the Portfolio Returns values
  port_returns[i] <- port_ret
  
  
  #create and store portfolio risk
  port_sd <- sqrt(t(bobot) %*% (cov_mat  %*% bobot))
  port_risk[i] <- port_sd
  
  #create and store Portfolio Sharpe Ratios
  #assume a 0% Risk free rate
  sr <- port_ret/port_sd
  sharpe_ratio[i] <- sr
  
}


6 Visualisasi Portofolio

  Setelah melakukan pengujian dengan 5000 data untuk portofolio, kita dapat melakukan visualisasi untuk menganalisa lebih lagi untuk model yang telah kita bangun.

portfolio_baru <- tibble(Return = port_returns,
                           Risk = port_risk,
                           SharpeRatio = sharpe_ratio)

random <- tk_tbl(random)
## Warning in tk_tbl.data.frame(as.data.frame(data), preserve_index, rename_index,
## : Warning: No index to preserve. Object otherwise converted to tibble
## successfully.
colnames(random) <- colnames(ret)

portfolio_baru <- tk_tbl(cbind(random, portfolio_baru))
## Warning in tk_tbl.data.frame(cbind(random, portfolio_baru)): Warning: No index
## to preserve. Object otherwise converted to tibble successfully.
knitr::kable(head(portfolio_baru))
BTC-USD DOGE-USD ETH-USD MATIC-USD SHIB-USD Return Risk SharpeRatio
0.1144249 0.1603723 0.2468796 0.3914055 0.0869178 0.5059316 0.5128132 0.9865808
0.2812070 0.2956949 0.2068378 0.1969204 0.0193399 0.7300737 0.4720236 1.5466889
0.0926353 0.0794049 0.3089827 0.1727474 0.3462297 0.5295431 0.5407272 0.9793166
0.1479177 0.2132783 0.2947974 0.1129476 0.2310590 0.6162338 0.4964658 1.2412411
0.4265534 0.0968114 0.2973918 0.0572972 0.1219463 0.9889535 0.4434509 2.2301306
0.1938390 0.0067223 0.1919684 0.4366066 0.1708637 0.5323032 0.5265322 1.0109603
min <- portfolio_baru[which.min(portfolio_baru$Risk),]
max <- portfolio_baru[which.max(portfolio_baru$SharpeRatio),]

6.1 Risiko Kecil, Return Maksimal!!

data <- data.frame(
  Koin = c("BTC-USD", "ETH-USD", "DOGE-USD", "MATIC-USD", "SHIB-USD"),
  Return = c(0.5714939, 0.5773458, 0.5495337, 0.5196439, 0.5699668),
  Risk = c(0.4159848, 0.4585667, 0.4720121, 0.5136514, 0.4766808),
  SharpeRatio = c(0.5261665, 1.2590225, 1.5455825, 0.6417659, 1.1956993)
)

# Menampilkan scatter plot
library(ggplot2)

ggplot(data, aes(x = Risk, y = Return, label = Koin)) +
  geom_point(size = 3, color = "red", alpha = 0.6) +
  geom_text(hjust = 0, vjust = 0, size = 3) +
  labs(
       x = "Risiko",
       y = "Return") +
  theme_minimal()


6.2 Tingkat Sharpe Ratio Koin

warni <- c("#FF0066", "#FFCC33", "#00FF66", "#6699FF", "#FF6699")

ggplot(data, aes(x = Koin, y = SharpeRatio)) +
  geom_bar(stat = "identity", fill = warni, alpha = 0.7) +
  geom_text(aes(label = round(SharpeRatio, 2)), vjust = -0.5, color = "black", size = 3) +
  labs(title = "Tingkat Sharpe Ratio Koin",
       x = "Koin",
       y = "Sharpe Ratio") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

6.3 Portofolio Optimalisasi Keseluruhan

p <- portfolio_baru %>%
  ggplot(aes(x = Risk, y = Return, color = SharpeRatio)) +
  geom_point(size = 3, alpha = 0.7) +  
  scale_color_gradient(low = "blue", high = "red") +  
  theme_minimal() +  
  labs(x = 'Annualized Risk',
       y = 'Annualized Returns',
       title = "Portfolio Optimization & Efficient Frontier") +
  geom_point(aes(x = Risk, y = Return), data = min, color = 'green', size = 4) +  
  geom_point(aes(x = Risk, y = Return), data = max, color = 'black', size = 2) +  
  annotate('text', x = 0.32, y = 0.26, label = "Tangency Portfolio", color = "red", size = 4) +
  annotate('text', x = 0.21, y = 0.13, label = "Minimum variance portfolio", color = "blue", size = 4) +
  annotate(geom = 'segment', x = 0.2, xend = 0.3, y = 0.1, 
           yend = 0.2, color = 'purple', arrow = arrow(type = "open", angle = 30, length = unit(0.3, "cm")))

ggplotly(p, height = 500, width = 800)


7 Kesimpulan

  Pada proses mencari tahu seberapa optimal portfolio yang dimiliki penulis untuk aspek investasi koin kripto yang mencakup 5 jenis koin, yaitu BTC, ETH, MATIC, SHIB dan DOGE ternyata disimpulkan bahwa risiko yang diterima oleh penulis lebih besar dibanding dengan return yang didapatkan dalam satu tahun ini. Dan terlihat bahwa koin dengan risiko yang paling kecil, tetapi return yang cukup besar adalah BTC, hal ini sangat jelas dan sesuai dengan apa yang terjadi di pasar kripto (seperti yang sudah digambarkan pada grafik awal). Sedangkan, koin MATIC menjadi koin dengan risiko dan return paling rendah dibandingkan dengan koin yang lainnya. Maka dari itu, penulis memilih untuk menghindari koin MATIC pada masa yang akan datang karena memberikan return yang cukup rendah bagi portfolio kripto penulis.