This probably isn't the best way for realistic purposes but since I don't know how you want it to look. You can do something like this. Basically, where the shark sits on map load is the HOME for the shark.
When the map starts, the script starts moving the shark to different points around the map, which you define in script. Using XYZ coords. You can rotate the shark so it can turn and such. Just duplicate the MoveTo and or the rotateYaw lines for the full path the shark is going to use until it finally does its complete loop, and can then loop until the map ends.
Swap out the shark targetname in script and edit the coords and a few other properties and you should be able to get it moving. You don't need any origins, or linking, just the Shark Model as a script model. I haven't tested the code, so if there are errors, they should be easy to fix.
sharkModel = getEnt("MY SHARK MODEL", "targetname");
// Move shark to first point
sharkModel moveTo ((-704, -800, 496),6,2,2); // ((x,y,z), total move time in seconds, acceleration time, deceleration time))
iprintlnbold("Moved Shark to First Point"); // Debug line
// If you need to rotate the shark a little before next move or during move
sharkModel rotateYaw (-90,3,0.5,0.5); // (angle, total move time in seconds, acceleration time, deceleration time)
// Move shark to second point
sharkModel moveTo ((-204, -300, 523),3,1,1); // ((x,y,z), total move time in seconds, acceleration time, deceleration time))
// Move it and rotate it as many times as you need to
// Eventually get the shark back to HOME (where it started on map load) so script can loop