Here's the formulation of the problem and the Gurobi code to solve it:

**Decision Variables:**

* `x`: Number of pairs of skis to buy and sell
* `y`: Number of snowboards to buy and sell

**Objective Function:**

Maximize profit: `200x + 175y`

**Constraints:**

* **Budget:** `500x + 400y <= 20000`
* **Minimum skis:** `x >= 10`
* **Maximum skis:** `x <= 30`
* **Snowboard limit:** `y <= 0.5x`
* **Non-negativity:** `x, y >= 0`
* **Integer constraint:** `x, y` must be integers as you can't sell fractions of skis or snowboards.


```python
from gurobipy import Model, GRB

# Create a new model
m = Model("winter_sports")

# Create variables
x = m.addVar(vtype=GRB.INTEGER, name="skis")
y = m.addVar(vtype=GRB.INTEGER, name="snowboards")

# Set objective
m.setObjective(200*x + 175*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(500*x + 400*y <= 20000, "budget")
m.addConstr(x >= 10, "min_skis")
m.addConstr(x <= 30, "max_skis")
m.addConstr(y <= 0.5*x, "snowboard_limit")

# Optimize model
m.optimize()

if m.status == GRB.OPTIMAL:
    print('Obj: %g' % m.objVal)
    print('Skis:', x.x)
    print('Snowboards:', y.x)
else:
    print("Infeasible or unbounded")

```
