На главную > Блог > Категория > ⚡ Основы программирования на Julia: полное руководство для начинающих
Julia — это высокоуровневый, динамический язык программирования, созданный в MIT в 2012 году. Он сочетает простоту Python, скорость C++ и математическую мощь MATLAB. Главная фишка Julia — JIT-компиляция (Just-In-Time), которая делает код быстрым без необходимости низкоуровневой оптимизации вручную.
Почему Julia идеален для трейдинга?
В этом руководстве я дам все основы Julia: от установки до написания функций, работы с массивами, многопоточности и создания собственных модулей. К концу вы сможете написать простой скрипт для расчёта технических индикаторов.
«Julia — это как швейцарский нож для учёного. Быстрый, лёгкий, с острыми лезвиями и штопором для сложных вычислений».
Julia можно установить с официального сайта julialang.org. Выберите версию для вашей ОС (Windows, macOS, Linux).
После установки откройте терминал и введите julia. Вы увидите приглашение julia>. Напишите первую программу:
println("Привет, трейдер!")
2 + 2
x = 10
y = 20
println(x + y)
Создайте файл hello.jl, напишите код и выполните:
# hello.jl
println("Привет из файла!")
В терминале: julia hello.jl.
Julia — динамический язык с опциональной статической типизацией. Тип может быть указан явно, но чаще он выводится автоматически.
# Числа
age = 30 # Int (целое)
price = 100.5 # Float64 (число с плавающей точкой)
# Строки
symbol = "BTC/USDT"
# Булевы значения
is_trend_up = true
# Символы (особый тип для идентификаторов)
:buy
:sell
# Кортежи (неизменяемые)
trade = (symbol, price, 0.1) # ("BTC/USDT", 100.5, 0.1)
println(trade[1]) # BTC/USDT
a = 10
b = 3
println(a + b) # 13
println(a - b) # 7
println(a * b) # 30
println(a / b) # 3.3333333333333335
println(a ^ b) # 1000 (возведение в степень)
println(a % b) # 1 (остаток от деления)
/ всегда возвращает Float64. Для целочисленного деления используйте ÷ (unicode: \div) или div(a, b).
Массивы в Julia — основа работы с данными. Они могут быть многомерными, индексация начинается с 1 (как в MATLAB).
# Одномерный массив (вектор)
prices = [67400, 67850, 68000, 67500, 68200]
# Массив с указанием типа
prices_float = Float64[67400, 67850, 68000, 67500, 68200]
# Диапазон
range_1_10 = 1:10 # Range, а не массив
collect(1:10) # Преобразование в массив
# Двумерный массив (матрица)
matrix = [1 2 3; 4 5 6; 7 8 9] # 3x3
prices = [67400, 67850, 68000, 67500, 68200]
println(prices .+ 100) # Добавить 100 к каждому элементу (. - точка означает поэлементно)
println(prices .* 1.05) # Увеличить на 5%
println(prices[end]) # Последний элемент (68200)
println(prices[2:4]) # Срез со 2 по 4
# Функции для массивов
println(sum(prices)) # Сумма
println(mean(prices)) # Среднее (требуется using Statistics)
println(maximum(prices)) # Максимум
println(minimum(prices)) # Минимум
.+, .*) работают быстро и читаемо. Это аналог NumPy в Python.
Словари в Julia хранят пары ключ-значение и аналогичны dict в Python.
# Создание словаря
trade = Dict("symbol" => "BTC/USDT", "entry" => 67400, "stop" => 67000)
# Доступ по ключу
println(trade["symbol"])
# Добавление нового ключа
trade["take_profit"] = 68500
# Удаление ключа
delete!(trade, "stop")
# Проверка наличия ключа
if haskey(trade, "entry")
println("Есть запись о входе")
end
# Итерация по ключам и значениям
for (key, value) in trade
println("$key => $value")
end
price = 68000
sma = 67500
if price > sma
println("Сигнал на покупку")
elseif price < sma
println("Сигнал на продажу")
else
println("Нет сигнала")
end
signal = price > sma ? "BUY" : "SELL"
prices = [67400, 67850, 68000, 67500, 68200]
# Цикл for по элементам массива
for p in prices
println("Цена: $p")
end
# Цикл for с индексом
for i in 1:length(prices)
println("prices[$i] = $(prices[i])")
end
# Цикл while
i = 1
while i <= length(prices)
println(prices[i])
i += 1
end
Функции в Julia — это объекты первого класса. Они могут быть короткими (однострочными) или многострочными.
# Функция для расчёта простой скользящей средней (SMA)
function sma(prices, period)
if length(prices) < period
return nothing
end
sum(prices[end-period+1:end]) / period
end
# Более короткий синтаксис (однострочная функция)
sma_short(prices, period) = sum(prices[end-period+1:end]) / period
# Пример использования
prices = [67400, 67850, 68000, 67500, 68200]
sma_3 = sma(prices, 3)
println("SMA 3: $sma_3") # 67900.0
function min_max(prices)
return minimum(prices), maximum(prices)
end
min_val, max_val = min_max(prices)
println("Минимум: $min_val, Максимум: $max_val")
return нужен только для досрочного выхода.
Менеджер пакетов Julia — Pkg. Он аналогичен pip в Python.
# В REPL (интерактивной консоли)
import Pkg
Pkg.add("DataFrames")
Pkg.add("Plots")
Pkg.add("YFinance") # Загрузка котировок
# Или в режиме пакетного менеджера: нажать ] в REPL и написать add DataFrames
using YFinance, Plots, DataFrames
# Загрузка данных
btc = y"BTC-USD" 30d
# Простой график
plot(btc.date, btc.close, title="BTC/USD", label="Цена закрытия", xlabel="Дата", ylabel="Цена")
# Расчёт и добавление SMA 5 и SMA 20
sma5 = [mean(btc.close[max(1, i-4):i]) for i in 1:length(btc.close)]
sma20 = [mean(btc.close[max(1, i-19):i]) for i in 1:length(btc.close)]
plot!(btc.date, sma5, label="SMA5")
plot!(btc.date, sma20, label="SMA20")
Julia имеет встроенную поддержку многопоточности. Это критично для обработки больших объёмов данных и бэктестинга.
# Запуск Julia с 4 потоками: julia -t 4
using Base.Threads
function parallel_sma(prices_list, period)
results = Vector{Float64}(undef, length(prices_list))
@threads for i in 1:length(prices_list)
prices = prices_list[i]
if length(prices) >= period
results[i] = sum(prices[end-period+1:end]) / period
else
results[i] = NaN
end
end
return results
end
# Данные для 100 активов
data = [rand(1000) * 1000 for _ in 1:100] # 100 случайных временных рядов
sma_20 = parallel_sma(data, 20)
Julia позволяет создавать собственные типы (структуры) для организации данных.
# Определение структуры "Сделка"
struct Trade
symbol::String
entry_price::Float64
stop_loss::Float64
take_profit::Float64
quantity::Float64
end
# Создание экземпляра
my_trade = Trade("BTC/USDT", 67400.0, 67000.0, 68500.0, 0.1)
# Доступ к полям
println(my_trade.symbol)
println(my_trade.entry_price)
# Функция, работающая со структурой
function calculate_pnl(trade::Trade, exit_price::Float64)
if exit_price > trade.entry_price
return (exit_price - trade.entry_price) * trade.quantity
else
return (exit_price - trade.entry_price) * trade.quantity
end
end
Напишем функцию для расчёта RSI (индекс относительной силы) и генерации сигнала.
function rsi(prices, period=14)
if length(prices) <= period
return nothing
end
gains = Float64[]
losses = Float64[]
for i in 2:length(prices)
diff = prices[i] - prices[i-1]
if diff >= 0
push!(gains, diff)
push!(losses, 0.0)
else
push!(gains, 0.0)
push!(losses, -diff)
end
end
avg_gain = sum(gains[end-period:end]) / period
avg_loss = sum(losses[end-period:end]) / period
if avg_loss == 0
return 100.0
end
rs = avg_gain / avg_loss
return 100 - (100 / (1 + rs))
end
# Пример использования
prices = [67400, 67850, 68000, 67500, 68200, 68300, 68100, 67900, 68400, 68600]
rsi_val = rsi(prices, 5)
println("RSI = $rsi_val")
if rsi_val < 30
println("Перепроданность → сигнал на покупку")
elseif rsi_val > 70
println("Перекупленность → сигнал на продажу")
else
println("Нейтральная зона → наблюдаем")
end
Julia — это язык, который объединяет лучшее из двух миров: скорость C и простоту Python. Для трейдера это означает быстрые бэктесты, real-time обработку данных и возможность писать сложные модели без боли низкоуровневой оптимизации.
Дорожная карта изучения Julia для трейдера:
Начните с малого: установите Julia, запустите REPL, поиграйте с массивами. Затем установите YFinance.jl и загрузите исторические данные. Напишите функцию для расчёта SMA. Постройте график. Через неделю вы сможете написать простого бота для бэктестинга. А через месяц — использовать Julia для анализа реальных рыночных данных.
И помните: Julia — это не панацея, но для задач, где важна скорость и математическая точность, она часто превосходит Python и даже C++ по удобству разработки. Удачи в кодинге!
«Julia не спрашивает, где ваш GIL. Она просто компилируется и бежит. Бежит так быстро, что Python даже не видит её хвоста».
Дата размещения статьи: 2026-06-02T08:16:46