If he keeps downvoting his XP will go to 0 over time and he can't vote at all then putting an end to his mass downvoting. Your right he would have to contribute daily with posts to counteract the negative XP. Unless the ratio isn't 1/3rd and the RNG that perlmonks uses has been hacked :-(
For each user, PerlMonks tracks a weighted average of the recent votes that
they have cast. Each time you cast an up-vote, your weighted average, $vtavg,
is set to 0.1 + 0.9*$vtavg. Each time you cast a down-vote, your
weighted average is set to -0.1 + 0.9*$vtavg. So somebody who only
ever up-votes will quickly have a $vtavg very close to +1 while somebody who
only ever down-votes will quickly have a $vtavg very close to -1.
That is the whole implementation (there is no reset). In hindsight, the "of the recent votes [...] cast" could raise that question. It is actually a weighted average of all votes cast since the implementation of the feature. It is just that the weight on a "non-recent" vote (in terms of cardinality, not calendarity) becomes geometrically smaller with each vote cast (by that user) to the point that floating point renders it effectively zero after about 330 votes (and "insignificant" much sooner than that).
The direction of your most recent vote constitutes 10% of your "vote average". Your 2nd-most-recent vote counts for 9%. Your 22nd-most-recent vote counts for 1%. Your votes prior to that (up-to about 308 of them) total up to less than 10%. Your votes prior to 44 votes ago add up to less than 1%. Your most recent 10 votes add up to about 2/3 of the "average".