Regression: How to deal with positive skewness in continuous target variable
Problem in this competition is VERY similiar. Instead of me copy-pasting some interesting ideas just check out winner write-ups in the discussions.

Some takeways: 


Add count of values of features as new features.
This is information that LightGBM can’t see
Check unique value counts for all features of train and test set.
Model stacking almost always works better than single model (forget about it in production)
Check for feature independence. For this competition, features were all uncorrelated (naive bayes worked great)
etc...


And finally and independently from this competition general note: Its all about the right data representation and not about the model. If you can represent data in the right way than basic linear regression will score good. I would do some serios data analysis for residual values in range negative until 200 and 500 until infty and see what confuses your model, obviously there are some conflicting features that force your model to predict low when it should be high. Maybe this is not satisfying to you but to really solve this problem you have to find what confuses him so that he predicts high when it should be high, and then engineer feature/data representation so that he can discriminate around this.