σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyRoteiros
Ctrl K
AO
+1,2 mil alunos
EntrarParticipar ↗
Roteiros
AO
+1,2 mil alunos
Entrar
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Roteiro de Python›Módulo 2 · NumPy e pandas para dados de mercado›Tópico 2.2·~35 minIniciante

Indexação e fatiamento de arrays

Posição no roteiroMódulo 2 de 11 · Tópico 2 de 20
2.2 Indexação e fatiamento de arrays
—Nota do lab— / 100XP total—Sequência—

Posições e fatias, agora em várias dimensões

Os arrays são indexados como as listas: a[0] é o primeiro elemento, a[-1] o último e a[início:fim:passo] uma fatia que para antes de fim. A diferença é que um array pode ter várias dimensões, e você dá um índice ou fatia por dimensão, separados por vírgulas: m[linha, coluna]. Um : sozinho significa «toda esta dimensão»: m[:, 1] é toda a segunda coluna e m[1] (ou m[1, :]) toda a segunda linha. Números negativos contam do fim, e um passo de -1 inverte.

import numpy as np

a = np.array([10., 11., 12., 13., 14., 15.])
print(a[0], a[-1])           # 10.0 15.0
print(a[1:4])                # [11. 12. 13.]
print(a[-2:])                # [14. 15.]
print(a[::2])                # [10. 12. 14.]
print(a[::-1])               # [15. 14. 13. 12. 11. 10.]

# Two dimensions: one index or slice per dimension
m = np.arange(12).reshape(3, 4)
print(m[1, 2])               # 6
print(m[:, 1])               # [1 5 9]      the whole second column
print(m[-1, :])              # [ 8  9 10 11] the last row
print(m[0:2, 1:3])           # [[1 2]
                             #  [5 6]]

Fatias são visões, não cópias

Ao contrário de uma fatia de lista, uma fatia básica do NumPy não copia os dados: é uma visão da mesma memória, então escrever por ela altera o array original. Isso torna o fatiamento instantâneo mesmo para arrays enormes, mas surpreende: part = a[1:4]; part[0] = 99 também altera a[1]. Quando precisar de um array independente, chame .copy(). Dá para conferir com np.shares_memory(a, b). O mesmo comportamento de visão vale para linhas, colunas, passos e fatias invertidas.

import numpy as np

a = np.array([10., 11., 12., 13., 14., 15.])

part = a[1:4]           # a view, no data copied
part[0] = 99
print(a)                # [10. 99. 12. 13. 14. 15.]   a changed too

safe = a[1:4].copy()    # an independent array
safe[0] = -1
print(a)                # [10. 99. 12. 13. 14. 15.]   unchanged

print(np.shares_memory(a, a[::2]))   # True
print(np.shares_memory(a, safe))     # False

Máscaras booleanas e listas de índices

Comparar um array dá um array de booleanos do mesmo tamanho: r > 0 é True onde o retorno é positivo. Usando essa máscara como índice, r[r > 0], escolhem-se só esses elementos. Combine condições com & (e), | (ou) e ~ (não), cada condição entre parênteses, porque os and/or do Python não funcionam com arrays. Uma lista ou array de inteiros também serve, a[[0, 2, 5]], que pega exatamente essas posições nessa ordem. A seleção por máscara ou por lista de índices copia os dados, e também é possível atribuir por uma máscara: a[a > 3] = 0.

import numpy as np

r = np.array([0.01, -0.02, 0.03, -0.01, 0.0, 0.02])
print(r > 0)                        # [ True False  True False False  True]
print(r[r > 0])                     # [0.01 0.03 0.02]
print(r[(r > 0) & (r < 0.025)])     # [0.01 0.02]    parentheses are required
print(np.where(r > 0)[0])           # [0 2 5]        positions where it holds

# Pick by position, in any order
w = np.array([3.0, 9.0, 1.0, 7.0])
order = np.argsort(-w)              # positions from the largest value down
print(order[:2], w[order[:2]])      # [1 3] [9. 7.]

# Assign through a mask
counts = np.array([1, 2, 3, 4, 5, 6])
counts[counts > 3] = 0
print(counts)                       # [1 2 3 0 0 0]
import numpy as np

# Rows are days, columns are assets (AAPL, MSFT, GOOG)
R = np.array([[ 0.02, -0.01,  0.03],
              [ 0.01,  0.00,  0.02],
              [-0.03,  0.02, -0.01],
              [ 0.00,  0.01,  0.04]])

print(R[:, [0, 2]])             # the AAPL and GOOG columns, as a copy
print(R[R[:, 0] > 0])           # the days on which AAPL rose (whole rows)
print(R[R[:, 0] > 0].shape)     # (2, 3)
print(R[-2:, 1].mean())         # 0.015  last two days of MSFT
Saiba o que você tem: uma visão ou uma cópiaFatias básicas (a[1:4], m[:, 1], a[::2]) são visões; máscaras e listas de índices (a[a > 0], a[[0, 2]]) são cópias. Uma função que devolve uma fatia do seu argumento dá a quem chama uma janela para os próprios dados dele, então uma escrita posterior pode alterá-los de forma inesperada. Decida de propósito: devolva uma visão quando a velocidade importa e os dados são somente leitura; senão .copy(). Os testes do lab verificam os dois comportamentos.
  • Um índice ou fatia por dimensão: m[linha, col], m[:, 1] (uma coluna), m[-1] (última linha), a[::-1].
  • Fatias básicas são visões (escritas aparecem; .copy() para separar); máscaras e listas de índices fazem cópias.
  • Máscaras: a[a > 0], combine com &, |, ~ entre parênteses; np.argsort dá as posições em ordem.

A seguir: vetorização, que troca laços Python por aritmética sobre arrays inteiros.

Lab: o que é avaliado

  • Pegar as linhas mais recentes com last_rows25 pts
  • Manter só os ganhos com positive_values25 pts
  • Amostrar um a cada k valores com every_kth25 pts
  • Encontrar as posições dos k maiores valores com top_k_indices25 pts
Explorador · lab-35-1
▾ lab-35-1
…
bash · no navegador
learner@quantcraft:~/lab-35-1$
Python ainda não carregadoPythonLn 1, Col 1Spaces: 4UTF-8

Redefinir este tópico?

Tudo em lab-35-1 volta aos arquivos iniciais e o terminal é limpo. Sua solução atual será perdida — isso não pode ser desfeito.

Será redefinido
  • main.py → código inicial
  • Histórico do terminal e saída dos testes
  • Alterações não enviadas
Será mantido
  • Melhor nota do lab
  • Seu XP e sua sequência
  • Progresso da aula e anotações

Entre para executar o seu código.

Todas as aulas são gratuitas para ler. Crie uma conta ou entre para executar código, rodar os testes e enviar este lab.

  • IDE no navegador com terminal bash — nada para instalar
  • Correção instantânea, XP e o seu lugar no roteiro
Criar uma contaEntrar
OU
Continuar com o GitHub