동경 126°25′, 북위 34°27′에 위치하며, 해남반도(海南半島)와 진도(珍島) 사이에 있다. 면적은 0.39㎢이고, 해안선 길이는 3.2㎞이다. 최고 지점은 남쪽 섬 서안에 위치한 안산으로 지형도에서 확인되는 높이는 약 60m이다. 북서에서 남동 방향으로 분포하는 안도, 중마도(中馬島) · 하마도(下馬島) 등과 함께 삼마군도(三馬群島)를 형성한다. 조선시대에는 주변의 섬들을 총괄하여 ‘마뢰도(磨賴島)’ 또는 ‘마루섬’이라고 하였다. 이후 이들 섬을 삼마도(三馬島) 또는 삼마로도(三馬路島)라고도 하였다. 삼마도 가운데 가장 위쪽에 있는 섬으로, 섬의 형태가 말과 같다 하여 현재의 상마도로 불리게 되었다.
지질은 대부분 산성화산암류로 이루어져 있다. 상마도는 두 개의 섬이 좁은 (간조육계)사주에 의해 연결되어 있다. 간조시에는 사주가 드러나 두 섬을 이어 주지만 만조시에는 수면 아래로 잠겨 두 섬이 분리된다. 상마도는 삼마군도에서 가장 큰 섬으로 북쪽의 섬은 대체로 산지로 이루어져 있으며, 남쪽의 섬은 완만한 경사의 구릉지가 서쪽에서 남쪽을 돌아 동쪽으로 이어진다. 북쪽 해안을 제외한 대부분이 주1가 발달한 암석 주2을 이루고 있으므로 대부분의 주민은 남쪽섬에 거주하고 있으며, 선착장도 남쪽섬에만 있다. 1월 평균 기온은 1.1℃, 8월 평균 기온은 25.2℃, 연 강수량은 1,277㎜이다.
구전에 의하면 고려시대에 유배지로 이용되었으며, 1600년대에 본격적인 거주가 시작되었다고 한다. 원래는 완도군 보길면에 속하였으나 1914년에 행정구역 개편으로 중마도 · 하마도 · 죽도 등과 함께 해남군 화산면에 편입되어 현재에 이르고 있다.
2018년 기준으로 인구는 109명(남 64명, 여 45명)이 거주하고 있으며, 세대수는 34세대이다. 남쪽 섬 저평한 북쪽 해안의 만(灣) 내부에 취락이 입지하고 있다. 화산초등학교 상마 분교장은 2000년 9월에 폐교되었고, 해남군 화산면 구성리 선착장에서 도선 '삼마호'가 매일 3회 왕복 운항하고 있다.
토지 이용 현황은 논은 없고 밭 0.09㎢, 임야 0.27㎢이다. 주민들의 대부분은 어업에 종사한다. 주요 농산물로는 보리 · 쌀 · 무 · 마늘 · 배추 · 콩 등이 생산된다. 근해에서 장어 · 농어 · 전복 · 돔 등이 어획되며 김양식도 활발하다. 돌김은 섬의 대표적인 특산물이다. 용바위 주변에 돔과 숭어 낚시가 잘 알려져 있으며, 여름철 민어 낚시를 위해 상마도를 찾는 사람들이 늘고 있다.