This is not exactly the same as the figure in your picture, but it is very close. If you would like to reproduce the exact version shown there, let me know and I will try to improve it further.
\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[line join=round,line cap=round]
\tikzset{
ribbon/.style={
line width=11pt,
line join=round,
line cap=round
},
stripe/.style={
draw=white,
line width=2pt,
line join=round,
line cap=round
}
}
\colorlet{RedCol}{red}
\colorlet{GreenCol}{green!60!black}
\colorlet{BlueCol}{blue!75!black}
% Radius of the local redraw region at each crossing
\def\CrossRad{0.7}
% Outline of a single "wasp" figure
\def\WaspPath{
(0.8,0)
.. controls (0.8,1.0) and (2.0,1.8) .. (1.5,2.4)
.. controls (1.0,3.0) and (-1.0,3.0) .. (-1.5,2.4)
.. controls (-2.0,1.8) and (-0.8,1.0) .. (-0.8,0)
.. controls (-0.8,-1.0) and (-2.0,-1.8) .. (-1.5,-2.4)
.. controls (-1.0,-3.0) and (1.0,-3.0) .. (1.5,-2.4)
.. controls (2.0,-1.8) and (0.8,-1.0) .. (0.8,0)
-- cycle
}
% Draw the entire ribbon
% #1 = transformation
% #2 = color
\newcommand{\DrawRibbon}[2]{%
\begin{scope}[#1]
\draw[ribbon,draw=#2] \WaspPath;
\draw[stripe] \WaspPath;
\end{scope}
}
% Locally redraw the upper ribbon near a single crossing point
% #1 = transformation of the upper figure
% #2 = color of the upper figure
% #3 = name of the intersection point
\newcommand{\TopAt}[3]{%
\begin{scope}
\clip (#3) circle[radius=\CrossRad];
\begin{scope}[#1]
\draw[ribbon,draw=#2] \WaspPath;
\draw[stripe] \WaspPath;
\end{scope}
\end{scope}
}
% --- Invisible named paths used to find intersections ---
\path[name path=R] \WaspPath;
\path[name path=G,rotate=120] \WaspPath;
\path[name path=B,rotate=240] \WaspPath;
% Intersections:
% rg1..rg4 = R with G
% rb1..rb4 = R with B
% gb1..gb4 = G with B
\path[name intersections={of=R and G, by={rg1,rg2,rg3,rg4}}];
\path[name intersections={of=R and B, by={rb1,rb2,rb3,rb4}}];
\path[name intersections={of=G and B, by={gb1,gb2,gb3,gb4}}];
% --- Initial drawing of all three ribbons ---
\DrawRibbon{}{RedCol}
\DrawRibbon{rotate=120}{GreenCol}
\DrawRibbon{rotate=240}{BlueCol}
% --- Correct over/under order at all 12 crossings ---
% Green goes over red at all four of their crossings
\foreach \P in {rg1,rg2,rg3,rg4}{
\TopAt{rotate=120}{GreenCol}{\P}
}
% Red goes over blue at all four of their crossings
\foreach \P in {rb1,rb2,rb3,rb4}{
\TopAt{}{RedCol}{\P}
}
% Blue goes over green at all four of their crossings
\foreach \P in {gb1,gb2,gb3,gb4}{
\TopAt{rotate=240}{BlueCol}{\P}
}
\end{tikzpicture}
\end{document}

Edit.
I have corrected the code. The picture now matches the one in the question exactly. However, this made the code somewhat more cumbersome, so I have kept my previous code and the previous picture.
\documentclass[tikz,border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[line join=round,line cap=round]
\tikzset{
ribbon/.style={
line width=11pt,
line join=round,
line cap=round
},
stripe/.style={
draw=white,
line width=2pt,
line join=round,
line cap=round
}
}
\colorlet{RedCol}{red}
\colorlet{GreenCol}{green!60!black}
\colorlet{BlueCol}{blue!75!black}
% Radius of the local redraw region at each crossing
\def\CrossRad{0.7}
% Outline of a single "wasp" figure
\def\WaspPath{
(0.8,0)
.. controls (0.8,1.0) and (2.0,1.8) .. (1.5,2.4)
.. controls (1.0,3.0) and (-1.0,3.0) .. (-1.5,2.4)
.. controls (-2.0,1.8) and (-0.8,1.0) .. (-0.8,0)
.. controls (-0.8,-1.0) and (-2.0,-1.8) .. (-1.5,-2.4)
.. controls (-1.0,-3.0) and (1.0,-3.0) .. (1.5,-2.4)
.. controls (2.0,-1.8) and (0.8,-1.0) .. (0.8,0)
-- cycle
}
% Draw the entire ribbon
% #1 = transformation
% #2 = color
\newcommand{\DrawRibbon}[2]{%
\begin{scope}[#1]
\draw[ribbon,draw=#2] \WaspPath;
\draw[stripe] \WaspPath;
\end{scope}
}
% Locally redraw the upper ribbon near a single crossing point
% #1 = transformation of the upper figure
% #2 = color of the upper figure
% #3 = name of the intersection point
\newcommand{\TopAt}[3]{%
\begin{scope}
\clip (#3) circle[radius=\CrossRad];
\begin{scope}[#1]
\draw[ribbon,draw=#2] \WaspPath;
\draw[stripe] \WaspPath;
\end{scope}
\end{scope}
}
% Invisible named paths used to find intersections
\path[name path=R] \WaspPath;
\path[name path=G,rotate=120] \WaspPath;
\path[name path=B,rotate=240] \WaspPath;
% Intersections:
% rg1..rg4 = R with G
% rb1..rb4 = R with B
% gb1..gb4 = G with B
\path[name intersections={of=R and G, by={rg1,rg2,rg3,rg4}}];
\path[name intersections={of=R and B, by={rb1,rb2,rb3,rb4}}];
\path[name intersections={of=G and B, by={gb1,gb2,gb3,gb4}}];
% Initial drawing of all three ribbons
\DrawRibbon{}{RedCol}
\DrawRibbon{rotate=120}{GreenCol}
\DrawRibbon{rotate=240}{BlueCol}
% Over/under order at the 12 crossings
% rg1: red over green
\TopAt{}{RedCol}{rg1}
% the other rg crossings: green over red
\TopAt{rotate=120}{GreenCol}{rg2}
\TopAt{rotate=120}{GreenCol}{rg3}
\TopAt{rotate=120}{GreenCol}{rg4}
% rb1: red over blue
\TopAt{}{RedCol}{rb1}
% rb2: blue over red
\TopAt{rotate=240}{BlueCol}{rb2}
% rb3: blue over red
\TopAt{rotate=240}{BlueCol}{rb3}
% rb4: blue over red
\TopAt{rotate=240}{BlueCol}{rb4}
% gb1: green over blue
\TopAt{rotate=120}{GreenCol}{gb1}
% the other gb crossings: blue over green
\TopAt{rotate=240}{BlueCol}{gb2}
\TopAt{rotate=240}{BlueCol}{gb3}
\TopAt{rotate=240}{BlueCol}{gb4}
%\foreach \P in {rg1,rg2,rg3,rg4,rb1,rb2,rb3,rb4,gb1,gb2,gb3,gb4}{\node (1) at (\P) {\P};}
\end{tikzpicture}
\end{document}

knotsandspath3packages.