Imagine a schoolyard during recess. A group of children bring Pokemon cards, show each other their collections, and start trading: one child wants a fire-type card, another is chasing rare cards, someone else is trying to complete a small imagined deck. Nobody is forced to trade, and a trade only happens when both children feel they got something they wanted. Still, the yard has a visible asymmetry from the first minute: some children arrived with a thicker binder, more duplicates, or one rare card that attracts attention. This article uses that everyday scenario as a small market simulation to make one claim precise: in this model, later success does not require superior trading skill, manipulation, or cheating. Starting conditions alone can create more future opportunities.
simpleVis is a small Jupyter and Manim project that models exactly this schoolyard Pokemon-card market. The model starts from a deliberately modest question: what happens when some children randomly begin with larger or more liquid collections, every later trade is voluntary, and every executed trade is subjectively useful to both sides? The answer is intentionally not that the initially lucky children are better negotiators. The simulation removes that explanation: every child follows the same trading rules. The mechanism is simpler and more structural: a bigger and more diverse portfolio creates more independent opportunities, more cards that somebody else may want, and more ways to assemble a bundle deal.
Notebook repository: eosfor/simpleVis. Runnable Binder notebook: pokemon_yard_simulation.ipynb.
The repository contains the notebook, the reproducible model in pokemon_yard_model.py, and three Manim scenes in manim_card_flow.py. The code is best read and run there: Binder opens the full notebook in the browser, while this article keeps only the argument, charts, animations, and explanations.
Model Idea
The notebook separates two quantities that are easy to mix together in casual discussion: subjective utility and market value. A child may value a card highly because it fits a favorite type, completes an imagined deck, or is simply more exciting than the cards they already have. Market value is different: it is the transferable value of the card in the model, based on rarity and type.
Every trade must improve subjective utility for both children. At the same time, the owner of a liquid target card does not have to accept a market loss. If someone wants that card enough, the owner can ask for a bundle of less personally useful cards whose total market value is at least as high. The buyer may accept because the target card is subjectively better for them.
That distinction is the whole point of the model. It is possible for total subjective utility to go up while market value becomes more concentrated.
1. Starting Collections
The first notebook section generates physical card counts for 100 children. The distribution is random but clipped at zero, so some children start with almost nothing and some start with a much larger collection. Then the simulation creates the actual cards. Each card has a type, rarity, and market value. Rarity is skewed toward common cards, while a few rare cards carry much higher value.
This means two children with similar physical card counts can have very different starting market value. One may have many common cards; another may have fewer cards but one rare card that many people want.
Transparent bars show the initial state; opaque bars show the final state. In the initial bottom 20%, only 1 child out of 20 ends with a positive market-value gain; 16 finish below their starting value, and 3 are unchanged. In aggregate, the group falls from 166.6 to 129.6 value units, a loss of 36.9. In the middle group, 24 children out of 60 gain value and 36 lose value; the group total falls from 3030.7 to 2871.9, a loss of 158.8. The initial top 20% looks different: 11 children out of 20 gain value and 9 lose value, while the group total rises from 2713.9 to 2909.6, a gain of 195.7.
2. Preferences And Utility
The model also gives every child a private preference vector. Each child has a general taste profile plus one boosted favorite type. So the subjective utility of a card is not just its market value. The model uses a dampened value term, the child’s preference weight for that card type, and a small idiosyncratic fit term.
This is why the model can execute trades that are good for both children even when market value moves in one direction. Each side evaluates the cards through their own preference vector.
3. Voluntary Bundle Trades
This section has two separate steps. A trade lead is not a trade yet; it is only an opportunity to try one. A card attracted attention, the model picks a potential counterparty, and only then does the bundle-search logic check whether a voluntary trade is possible.
The first step is intentionally mechanical. Each physical card can independently create a lead. More valuable cards create somewhat more leads because they are more liquid and more likely to attract attention.
That is what the first chart shows. It does not show who is better at negotiating. It shows the size of the input into the trading funnel. A child with more cards gets more attempts because more cards are visible in the yard. A child with valuable cards gets more attempts because those cards attract more interest. The probability of one particular deal being favorable is not secretly improved for the initially lucky group; that group simply has more reasons to start the deal-checking process.
For every lead, the simulation picks a counterparty, mostly local in the circular schoolyard layout but sometimes random. This turns abstract interest in a card into a concrete pair of children who can try to trade.
The second step is the bundle trade itself. The model searches for a target card owned by one child and a bundle that the bidder can offer in return. A trade is allowed only if both children gain enough subjective utility. The owner of the target card also requires non-negative market value change.
This is where the second chart fits. Once a trade is accepted, ownership changes, but total cards and total market value in the yard are conserved. So the final minus initial chart does not show newly created market value. It shows where existing market value moved after all accepted bundle trades.
If the initially stronger group more often owns liquid target cards, it more often gets to accept bundles only when the market-value side is non-negative. The other child can still agree because the target card is subjectively more useful to them. That is how a voluntary trade can improve both children’s utility while moving market value toward the owner of the more liquid position.
4. What The Notebook Measures
After the simulation, the notebook does not look at a single final number. It tracks several different traces of the process because the model asks two different questions.
The first question is whether children become subjectively better off. That is what total subjective utility measures. If this line rises, the accepted trades are doing their local job: collections become better matched to each child’s preferences.
The second question is whether market value becomes more evenly distributed or more concentrated. That is what market-value Gini and the Lorenz curve measure. These metrics do not care how much a child personally likes a card; they track transferable market value.
The third series, normalized executed trades, is a progress scale for the simulation. It shows that changes in utility and Gini accumulate as accepted trades happen; they are not only an end-state artifact.
This chart is intentionally switchable. With total subjective utility, voluntary exchange looks successful: aggregate subjective utility rises. With market-value Gini, a different pattern appears: the inequality index rises too, meaning market value becomes less evenly distributed. That is the central tension in the model. Locally mutually beneficial trades do not guarantee an equal market outcome.
The Lorenz curve reads as follows: the x-axis sorts children from lowest to highest market value, and the y-axis shows the cumulative share of all market value held by those children. The dashed diagonal is perfect equality: for example, the bottom 50% would hold 50% of the value. The farther the curve bends below that diagonal, the more concentrated the value is. If the final curve sits farther below the diagonal, more market value ended up in the hands of fewer children.
5. Groups And Rank Movement
Up to this point, we have looked at aggregate inequality. The next question is more direct: what happened to children who started from different positions?
The notebook divides children into three groups by initial collection market value: the bottom 20%, the middle 60%, and the top 20%. This is not a final ranking and not a claim about merit. It is a snapshot of starting conditions. From there, we track whether those starting groups keep, lose, or gain shares of cards and market value.
The first chart answers the group-level question: how much of the total “pie” does each starting group hold as the simulation progresses? The selector changes what the pie means. In market value mode, it is the share of total transferable market value. In physical cards mode, it is the share of physical card count.
In market value mode, the trend is straightforward: the red and blue groups lose share, while the green group gains share. The initial bottom 20% falls from about 2.8% to 2.2%, the middle 60% falls from about 51.3% to 48.6%, and the initial top 20% rises from about 45.9% to 49.2%. Switching to physical cards shows that card counts also move, but card counts do not fully explain the market-value redistribution.
But group shares do not tell us whether individual children crossed boundaries between groups. The next chart answers a different question: where did a child start, and where did that child end? It is a transition matrix from initial group to final group. The row is the starting group, the column is the final group, and the cell value is the number of children who followed that path.
The transition matrix shows how sticky the starting niche is. Of the initial bottom 20%, 17 children remain in the bottom group, 3 move into the middle, and nobody reaches the top. Of the middle group, 54 children remain in the middle, 3 fall to the bottom, and 3 move to the top. Of the initial top 20%, 17 children remain at the top, 3 fall into the middle, and nobody drops directly to the bottom. Individual movement exists, but the starting group strongly constrains the likely range of outcomes.
The last view is a named table of the largest movers. It keeps individual churn visible instead of hiding it behind aggregates. For each child, the table shows the starting group, final group, starting rank, final rank, rank change, and market-value change.
This is one of the most useful parts of the notebook. The model is not saying that every child is permanently locked into the starting group: transitions exist, and individual children can move up or down sharply. But the table and the matrix together show the range constraint. Mobility exists inside the structure created by the starting collection, not instead of that structure.
6. Manim Scenes
The notebook finishes with three Manim animations.
CardFlowScene sorts children by initial market value and draws a bar chart over time. Red bars are the initial bottom 20%, blue bars are the middle 60%, and green bars are the initial top 20%. Yellow particles show notable market-value transfers from a lower initial rank to a higher one.
CircleTradeScene places the children around a circle. Node color still means initial group, while node radius follows current market value. Yellow dots animate value transfers created by bundle trades. The frame caption tracks Gini, zero-card children, and maximum market value.
This scene shows something that is harder to see in static charts: trades happen between concrete children, value moves through individual events, and each child’s current market position changes gradually rather than as a single final recalculation.
GroupMigrationScene recalculates current bottom, middle, and top groups at each frame. Children move between three zones, and labels briefly appear for the most important boundary crossings.
This animation complements the transition matrix from section 5: it shows not only the starting and final group, but the boundary-crossing process itself. Some children really do migrate between zones, but that movement still happens inside the broader structure created by starting conditions.
The notebook renders these scenes in a Binder-friendly way, so Manim can run quietly and embed the resulting MP4 below the cell. The exact commands and parameters stay in the notebook and in manim_card_flow.py; in the article, the important part is the result and how the animations connect to the charts above.
Running It
The fastest path is the ready-to-run Binder notebook. It lets you execute the model, rebuild the charts, and run the Manim scenes without installing anything locally.
For local execution, use the eosfor/simpleVis repository: it contains the notebook, model, dependencies, and Manim scenes. The setup and run commands are better kept there so the article does not drift out of sync with the project.