How about tracing the position of your object with an edgeline?
start_frame = 1 # when do you want to start the tracking?
end_frame = 1000 # and when should it stop again?
stylus = 'Empty' # name of the object to track
new_name = "Whirl" # name of the created object
verts =  # list of all vertices
edges =  # list of all edges
sce = bpy.context.scene # the current scene
old_frame = sce.frame_current # remember the current frame
vertex_count = start_frame
while vertex_count <= end_frame: # iterate through the specified time
sce.frame_set(vertex_count) # set the frame so the object is in the right place for any given frame
loc = bpy.data.objects[stylus].matrix_world.translation # the global coordinates of the stylus
verts.append((loc.x, loc.y, loc.z)) # add the position to the vertex list
vertex_count += 1
edge_count = 1 # starting with the second vert because the edge list is one item shorter
end = len(verts)
while edge_count < end: # building the edges
edges.append((edge_count - 1, edge_count)) # assigns the indices of the verts to the edges
edge_count += 1
#edges = [(x-1 , x) for x in range(len(verts)) if x > 0] # this does the same as the above edge code. list comprehensions are scary
mesh_data = bpy.data.meshes.new(new_name + '-mesh') # makes a new mesh
mesh_data.from_pydata(verts, edges, ) # fills verts and edges into the mesh
obj = bpy.data.objects.new(new_name, mesh_data) # makes a new object with the mesh linked
sce.frame_set(old_frame) # repair the frame position
You can even animate it using a Build Modifier. And if you want a particle effect, just convert the mesh into a curve with ALTC, maybe change the spline type into bezier with auto handles and you can let a particle emitter follow the path.