Virtual Markets, Part Five: Low-Effort Processing

In our last article we discussed market shocks and reporting strategies centered around detecting price dips. In this article we will investigate the concepts of intermediate and final goods in Old School Runescape, with the end-goal of developing a reporting strategy allowing us to capitalize on the difference in price between intermediate and final goods via low-effort processing methods.

Disclaimer: This article is strictly academic in-nature and does not constitute financial advice. I have deleted my OSRS accounts and have no stake in any position within the game.

Intermediate and Final Goods

What Are Intermediate and Final Goods?

An intermediate good is any commodity representing an unfinished product. Intermediate goods can be used to create other intermediate goods, or to create final goods, which represent consumer-ready products.

If automobiles are an example of a final good, examples of intermediate goods include engines, transmissions, exhaust systems, and chassis. Each of these intermediate goods come together in a manufacturing process to create a final good which is then purchased by consumers.

Why Should We Care About Intermediate and Final Goods?

Like anything else, there are market conditions involving intermediate and final goods which we can monitor, report against, and profit from. Supply chains of intermediate goods and their resulting final products present an ocean of opportunity cost configurations; by purchasing and allocating intermediate goods toward their most efficient use-cases, we can profit in circumstances where intermediate goods are undervalued.

The global supply chain crisis encountered in the wake of the COVID-19 pandemic presents a great case study of the importance of managing intermediate goods allocations. When demand for final goods temporarily outpaces supply of requisite intermediate goods, or if intermediate goods face unexpected shortages, manufacturers must efficiently allocate limited resources toward their most valuable end use-cases.

What Does Supply Chain Management Have Anything To Do With A 20 Year-Old Medieval Clicking RPG?

Old School Runescape features an abundance of recipes. These include the various means and methods of turning intermediate goods into final goods. Just as the relationship between intermediate and final goods is important in real life, this relationship also plays a large part in the market of OSRS.

All of our analysis and reporting performed in our earlier articles has been centered around markets for individual commodities. By considering the options presented by processing recipes, we can uncover another dimension of in-game market opportunity.

Identifying Supply Chains in OSRS

Before we can conduct any sort-of reporting, we first need to figure out what actually constitutes an “intermediate good” and a “final good” in the context of OSRS.

While a seasoned veteran of Old School Runescape might be able to provide a list of ad-hoc examples, we can come-up with a comprehensive and relevant list on our own without any requisite knowledge concerning the game. This can be performed by applying an objective economic model against the trade history of the Grand Exchange, using data provided by the OSRS Wiki API.

Goods in a Vacuum

We can better understand what something is by first understanding what it isn’t. Let’s create an extremely simplistic model of a market with the following traits:

  • A single commodity is bought and sold.
  • There are no trade restrictions or costs
  • All market participants are rational.

Such a model is so simple, that the only meaningful observation we can make is that buying and selling pressure will be at an equilibrium, resulting in an equilibrium price. It is otherwise impossible to categorize the traded commodity as being either “intermediate” or “final”; It is simply a “good”.

So, why is that? To start, intermediacy implies the existence of a latter step, while final implies the existence of a previous step. Thus, in-order for intermediate and final goods to exist in a market:

  • There must be a minimum of two commodities in a market
  • One commodity (the intermediate good) can be transformed into the other commodity (the final good) through manufacturing or another process

So, does this model adequately represent a basic market of intermediate and final goods? If we let this model run its course, we run into a problem: As intermediate goods are converted into final goods, all else being equal, we will run out of intermediate goods, leaving us with the exact same single-commodity equilibrium we were faced with previously.

The fundamental problem with our modeling in this context is that goods do not exist in a vacuum; they enter and leave a market via production and consumption. This becomes obvious when we consider that automobiles do not last forever; they face depreciation and an eventual demise in a junkyard, necessitating the creation of new automobiles, and thus, the production of new intermediate components used therein. Likewise, oil enters a market after it is pumped from the ground, after which it is refined and processed into consumable final products such as gasoline.

By breaking the vacuum of our simple model, we can now analyze the difference in trade dynamics between intermediate and final goods by taking a closer look at their rates of production and consumption.

The Trade Dynamics of Production and Consumption

There comes a time when we all must ask
“Did I buy it, or was it sold to me?”

Jerry Paper
“Did I Buy It?” – Like A Baby (2018)

In this song, the artist Jerry Paper presents the listener with not only an important philosophical question, but also the crux of our discussion concerning trade dynamics between the production and consumption of goods.

Corn farmers produce corn. While there is nothing stopping a corn farmer from buying corn, they cannot buy corn from themselves. Production impacts trade dynamics, because when a good is produced, in that moment it is necessarily not bought. Corn farmers typically produce corn not because they want corn, but because they want to sell it in-exchange for currency so that they can buy other things.

Likewise, consumers eat candy bars. While there is nothing stopping an individual from selling a candy bar to another individual, that candy bar must eventually be consumed, either through useful ingestion or as a product of waste. Consumption impacts trade dynamics, because when a good is consumed, in that moment it is necessarily not sold. Consumers typically buy candy bars because they want to consume them but don’t otherwise have the means to produce them themselves.

To answer Jerry Paper’s question, whether a commodity has been purchased or sold depends on context; intermediate goods are necessarily sold more frequently than they are bought due to the trade dynamics of production, while final goods are necessarily bought more frequently than they are sold due to the trade dynamics of consumption.

In the case of corn farmers, the decision to plant and produce corn comes from a reasonable and calculated expectation of future profit resulting from the direct sale of corn to the market. If profit is not anticipated, farmers simply will not plant, produce, or sell any corn. If a farmer faces an unexpected market dip in corn prices, they will still in all likelihood sell any corn they produced at a loss since corn has a limited shelf life and otherwise provides limited utility for a single household. Agricultural subsidies benefit farmers by establishing a price floor in a market, which farmers can use to directly sell their surplus product. Thus, corn, representing an intermediate good, is typically sold by farmers to price-setting markets.

Likewise, consumers go to stores to buy candy bars. The last time I checked, store clerks do not (typically) haggle with potential customers and capitulate at each customer’s “bid” price. Rather, store prices for candy bars are typically non-negotiable, with transactions being initiated by consumers who want candy bars enough to be willing to capitulate at the set “ask” price. While there are gimmicks such as “sales” intended to blur this line, these are just clever marketing techniques intended to draw more consumers in to buy their product. Thus, candy bars, representing a final good, are typically purchased by consumers from price-setting markets.

Identifying Intermediate and Final Goods in OSRS

If intermediate goods are sold more frequently than they are bought, and if final goods are bought more frequently than they are sold, we can differentiate between intermediate and final goods by considering their ratio of purchases to sales.

In the case of OSRS, sales are represented by the Low “Insta-Sell” volume and price, while purchases are represented by the High “Insta-Buy” volume and price. These values can be pulled and compared directly from the OSRS Wiki API.

Using our report generation script, we can use some simple queries to obtain this data and save it to two speadsheets:

...
FinalOutputReport = pd.read_sql('SELECT itemlistname AS ItemName, round(YearlyMedianVolumeLow / YearlyMedianVolumeHigh) AS LowHighRatio FROM MasterTable WHERE YearlyMedianVolumeLow > YearlyMedianVolumeHigh ORDER BY LowHighRatio DESC;', tempdb)
FinalOutputReport.to_csv('IntermediateGoodRatio.csv', index=False)

FinalOutputReport = pd.read_sql('SELECT itemlistname AS ItemName, round(YearlyMedianVolumeHigh / YearlyMedianVolumeLow) AS HighLowRatio FROM MasterTable WHERE YearlyMedianVolumeHigh > YearlyMedianVolumeLow ORDER BY HighLowRatio DESC;', tempdb)
FinalOutputReport.to_csv('FinalGoodRatio.csv', index=False)

YearlyMedianVolumeLow provides the median daily volume sold over the past year, while YearlyMedianVolumeHigh provides the median daily volume bought over the past year. The ratio between the former and the latter allows us to rank items by their intermediacy, while the ratio between the latter and the former allows us to rank items by their finality.

Combing through our intermediate goods report, most examples include:

Likewise, the corollary results appearing in our final goods report include:

  • 4-dose or “full” potions, as well as some 1-dose or “single-dose” potions
  • “Unfinished” potions
  • Refined secondary herblore components, such as Crushed Nest and Nihil Dust
  • Complete armor, armor sets, or weapons systems, including “repaired” Barrows Equipment and Torva armour, Godswords, and many others
  • Refined products including planks and other improved construction materials, birdhouses, cast ingots and other metallic products like cannonballs, dart tips, arrow tips and nails, most cooked foods, potted saplings, tanned leather, etc.

These corollary categories of intermediate and final goods represent the major supply chains of the game.

While some intermediate goods such as “degraded” Barrows Equipment feature Sell-to-Buy ratios as high as 100:1, many others such as Coal feature tighter ratios of approximately 2:1. This is likewise seen with final goods, with many items having tighter ratios than others.

This doesn’t necessarily indicate that items with tight ratios are any “less intermediate” or “less final” than items with looser ratios. Many commodities feature a lot of secondary buying and selling activity which necessarily tightens these ratios as the same units exchange hands multiple times. This is fostered by the fact that like-goods in OSRS are generally 100% fungible with zero difference between “new” or “used” products; with the exception of very specific usage-based transmutations, most items do not suffer any depreciation over time or with use. A raw trout harvested 2 years ago is considered by the game to be identical to a trout harvested today, and a sword used ten thousand times is just as sharp now as it was when it was created.

The fact that there is any imbalance between buying and selling activity at all is more important than the magnitude of the ratio, with even a slight imbalance over the long-run supporting a differentiation between a commodity being classified as intermediate or final. As we work through the listed examples above, we’ll start to better understand this in the context of each supply chain.

Assessing Supply Chains in OSRS

So far, we have successfully identified the major supply chains of OSRS, including their respective intermediate and final goods. Next, we’ll want to categorize and break down their mechanics so that we can assess how much effort they involve, with the goal of identifying sufficiently low-effort processing tasks to report against.

If a processing task for a given supply chain involves using more than a marginal amount of our time, we’re going to ignore it. Since time is our most valuable resource, and since our time as a trader can be used to engage in other profit-generating activities, we should aim to spend as little of our time engaging with the game’s processing mechanics as possible.

Potion Decanting

The Herblore skill encompasses some of the most complicated supply chains in the game, with potions representing one of the most widely-consumed final products.

Decanting represents the very tip of this supply chain iceberg and is often the final step needed to produce a marketable potion. This is effectively equivalent to bottling or packaging steps in real-world manufacturing processes.

Vials are the vessels used to contain most potions. Excluding some strange exceptions, most vials can be “filled” with up-to four doses of a single potion type. Despite this, when most potions are initially mixed in-accordance with their recipe, the resulting product is typically only 3 doses. This necessitates decanting in-order to convert 3-dose vials into 4-dose vials, providing the most spatially-efficient and marketable end-products.

We can clearly see consumer preference for 4-dose potions by checking the trade volume history for “Prayer Potion”, the most widely traded potion type in the game:

For the 4-dose variant, we can clearly see an extreme bias toward purchasing, with “High” volume vastly outpacing “Sell” volume consistently over the span of the past year. This is in stark contrast with 3, 2, and 1-dose potions of the same type, which all feature extreme bias toward selling, with “Low” volume vastly outpacing “Buy” volume:

While all dose variants provide the same general function, consumer preference leans heavily toward the 4-dose variant as it represents the most spatially-efficient form. This is also reflected in total trade volume, with 4-dose potions being traded at three to four times the volume of 3-dose potions on the Grand Exchange. It is also important to note that 1 and 2-dose potions in this case are traded at vastly lower volumes, since vials with these dosages only exist in-game after a potion has been partially consumed.

This makes more intuitive sense when we consider real-life products. Most people would never consider buying a half gallon of milk stored in a gallon-sized container even if price was proportionally less; notwithstanding how unbelievably strange that would be, it simply isn’t efficient. In real-life markets, products and their containers are spatially-paired; milk can be purchased in gallons, half-gallons or quarts, with different quantities being stored in correspondingly-sized containers. In the case of OSRS, vials represent a non-compressible standard container size for all potions, occupying a single inventory slot which is already the smallest spatial unit in the game. Since 4-dose potions occupy the same amount of space as 1-dose potions, the market prefers the former.

There is one interesting exception to this rule; some 1-dose potions show a skewed buy-to-sell ratio, indicative of a final product. We can see this with items such as “Stamina Potion(1)”:

In this case, the item is bought by consumers far more frequently than it is sold despite being spatially inefficient at face value. The reasoning has to do with some esoteric gameplay strategies which benefit from the use of single-dose potions, such as using the blast furnace. Single-dose potions can be consumed and discarded in a single action, making their use more efficient than four-dose potions in some niche circumstances.

Given some examples, while we now understand why there is product differentiation between potion doses, we now need to determine if converting these intermediate products into their associated final products is worth our time. So, how do we decant?

The most efficient means of decanting potions is by using a service offered by an NPC who resides at the Grand Exchange itself. This NPC can decant stacks of “noted” potions in an instant and charges nothing for this service, only charging a nominal fee if a player does not have a sufficient number of vials when decanting-down. Furthermore there are no requisite skills or other in-game requirements for using this service other than having an active membership.

These conditions make decanting easily one of the simplest and least time-consuming processing tasks in the entire game. Decanting mechanics present the closest in-game analogue to the concept of arbitrage.

In-conclusion, decanting presents our first example of a low-effort manufacturing method which we should report against and attempt to profit from.

Creating Unfinished Potions

Going a bit further down the herblore iceberg, the next supply chain component we need to address are unfinished potions. An herb and a vial of fluid can be combined to make an unfinished potion, which can then be combined with a secondary ingredient to create a finished potion.

Just as “Prayer Potion(4)” is the most frequently purchased potion in the game, its precursor “Ranarr potion (unf)” is the most frequently purchased unfinished potion:

While this item has a tighter buy-to-sell ratio than other examples, it still fits within the standard we have set for final goods; on-average, there are far greater consumers of this product than there are producers selling it directly to the market.

This begs a very obvious question: How on earth could an “unfinished” product also be a “final” product? If unfinished ranarr potions are used to make prayer potions, why aren’t they an intermediate good? What is going-on here?

The answer lies in the fundamental economic concept of utility. In OSRS, utility often comes in the form of experience, which unfinished potions provide in relative abundance. Many players treat training herblore as an end in-itself, with finished potions representing a bi-product. This phenomenon becomes clearer when we consider potions such as “Attack potion(3)” which trade in substantial volume at single-digit prices, while its primary precursor “Guam potion (unf)” trades at over 200GP each. In such circumstances, the bulk of an unfinished potion’s utility is expressed through the experience it provides, rather than through any usefulness of the resulting potion itself.

While prayer potions are valuable in their own right, unfinished ranarr potions, and unfinished potions in-general possess the greatest utility out of all items within the herblore supply chain. This is reflected both by their desirability by consumers and by their prices. Just as decanted 4-dose potions are “final goods”, so are unfinished potions.

So, how are unfinished potions made? The most efficient way to create unfinished potions involves using a service offered by another NPC. The mechanics are similar to using NPCs to decant, with three important differences:

  • There is a 200GP cost per unit of unfinished potion made.
  • This NPC lives in the desert, requiring a little bit of travel time to reach
  • This NPC’s services are only unlocked when at least one of two non-trivial accomplishments have been achieved.

The alternative to using this NPC would be to manually craft unfinished potions, however this activity is extremely inefficient and a colossal waste of time for traders, let alone for most players.

While these conditions set some fixed costs and requirements to consider before attempting to craft and trade unfinished potions, this process otherwise represents a low-effort manufacturing method which we should consider reporting against.

Secondary Herblore Ingredients

An unfinished potion needs to be combined with a secondary ingredient in-order to successfully create a finished potion. These secondary ingredients can often be used in their harvested form, however in some cases these secondary ingredients must go through additional processing before they can used, which typically involve crushing or otherwise transforming the material.

“Bird nest (empty)” is an example of an unprocessed secondary herblore ingredient, with “Crushed nest” representing the processed form. While the former is typically sold directly to the market, the latter is typically purchased by consumers:

Based off of their respective trade histories, “Bird nest (empty)” is an intermediate good while “Crushed nest” is a final good. So, how do we crush or otherwise process secondary ingredients?

There is an NPC named Wesley who specializes in crushing items, charging 50gp per unit. While they also reside in the desert, there are no substantial requisite steps needed to enlist the help of Wesley. As a result, crushing presents another low-effort manufacturing method which we should absolutely report against.

Unfortunately, Wesley cannot assist with processing all secondary herblore ingredients; items such as “Giant egg sac” or “Swamp toad” represent intermediate goods which can only be transformed into their corresponding final goods “Red spiders’ eggs” or “Toad’s legs” through a procedure that a player must perform manually. While it might be possible to capitalize on differences in market value between these corresponding intermediate and final goods, bulk manual processing is typically not worth the time investment, especially in the context of trading. As a result, while we will report against many crushing recipes, we will ignore bulk processing tasks which cannot be performed with the assistance of an NPC.

Ancient Artefacts and Other Wilderness Recipes

Ancient Artefacts, Odium Shards and Malediction Shards all have one thing in-common; they are all examples of intermediate goods which can only be manufactured into their associated final goods by venturing into the Wilderness.

The Wilderness is one of the only locations in the game where players are subject to being attacked and killed by other players, effectively precluding our engagement with these particular supply chains. While it is possible to manufacture a single Odium or Malediction Ward at a time without risk of loss, this represents an extremely inefficient use of time. Ancient Artefacts are off the table entirely, since their mechanics involve unavoidable risk of loss.

Barrows Equipment

Barrows Equipment includes a variety of “degradable” armour and weapons pieces. Fully-repaired variants go by a regular name, while completely-degraded variants are designated by a “0” suffix.

Let’s take a look at one of the most frequently traded Barrows items, “Dharok’s platebody”:

While repaired variants feature mostly balanced trade which slightly favors buying activity, the degraded variants possess some of the most heavily skewed sell-to-buy ratios of any item type in the entire game, making it a textbook example of an intermediate good.

This trade behavior makes a lot more sense when we take a closer look at the mechanics of this supply chain. First, all Barrows equipment is initially produced, or “dropped” in its fully-repaired, useful, and marketable state. As players use this equipment, it degrades over-time and undergoes transmutation until it reaches its lowest state. Repairing degraded Barrows equipment involves a very unique set of mechanics where players spend a quantity of GP which scales not only with the degree of degradation, but also against the player’s “smithing” skill, with higher-skilled players spending less GP.

The end-result is that the vast majority of players who frequently use Barrows equipment may forego repairing equipment themselves, since it may be cheaper and more efficient to simply sell their broken equipment directly to the market in-exchange for a replacement set. Inversely, players with higher smithing levels can repair equipment for profit, leveraging economies of scale when repairing more than a single set at a time.

So, is repairing Barrows equipment a worthwhile low-effort manufacturing process? While the mechanics governing equipment repair are not as streamlined as potion decanting, in my experiences they are not clunky enough to preclude useful engagement by an inclined trader with the requisite in-game skill level. We should report against this, assuming a fixed reasonable skill floor of about level 80 smithing; players with a higher skill level should interpret the report results assuming proportionally greater potential profit.

Voidwaker

The Voidwaker is a weapon produced by providing three separate items and a fixed 500,000GP fee to an NPC.

The three separate components all feature extremely skewed Sell-to-Buy ratios, indicating that they are all intermediate goods. The end-product itself features more balanced trade.

Manufacturing Voidwakers has no skill level or other requirements; any player with the necessary components and GP can have as many made as they like. While this NPC technically lives in the Wilderness, they reside in a protected area which players can visit at no risk and with relative ease.

As a result, manufacturing Voidwakers presents an extremely low-effort manufacturing process which we should definitely report against.

Godswords

Godswords are weapons which occupy a very specific combat niche, which likewise feature their own niche supply chain.

There are five different types of godswords, all of which use the exact same type of blade. This blade is manufactured by combining three disparate shards, requiring a smithing level of 80. Given their historical trade ratios, each of these shards represent intermediate goods while the finished blade itself represents a final good.

Next, a finished godsword is made by combining the aforementioned blade with a unique hilt. This step has no requisite skill requirement and can be performed by anybody. The trade history of hilts implies that they are intermediate goods; when players obtain them, they typically sell them directly to the market.

So, is any part of this supply chain worth engaging with?

Manufacturing godsword blades in-particular is a bit pointless; the trending prices for godsword shards and finished blades hovers near their price floors set by alchemy. As a result, there really isn’t any circumstance where these are going to be worth our time manufacturing and selling since excess supply has already pushed the long-term prices for these items down to a fixed, minimum value.

Manufacturing finished godswords on the other hand does present a feasible opportunity for near-arbitrage trading. Hilts do not trade anywhere near their price floor and are the most valuable intermediate product in this supply chain. Despite being a final good in its own right, finished godsword blades present a fixed cost of manufacturing which can be acquired most of the time without an excessive premium. Combining these aspects with the fact that godsword manufacturing lacks any requisite skill or other requirements, we are presented with a low-effort manufacturing process which we should include in our reporting.

Torva Armour

Torva armour is some of the most expensive equipment in the game. Like many other items, they feature a unique supply chain.

The most expensive piece of the set, “Torva platebody” is dropped in a “damaged” form, representing an intermediate good, which can be repaired by players, yielding a fixed, functional, and final variant:

The other two components, “Torva platelegs” and “Torva full helm” share similar buy-to-sell dynamics between their damaged and repaired variants. So, how do we repair Torva armour?

To start, a player must have level 90 smithing, which is one of the steepest requirements out of all of the processes we have reviewed so far and is commensurate to their cost. While this precludes participation by most players on the basis of skill or capital, high barriers to entry can present correspondingly high margins, so we’ll continue investigating this supply chain.

Repairing Torva armor requires one or two units of a secondary ingredient, “Bandosian Components“:

While Bandosian components are substantially cheaper than damaged Torva armour, unlike our earlier example involving godsword blades, these components trade at far higher prices than their alchemy-adjusted price floor. Furthermore, their trade history implies that they are a final good.

While purchasing both a final good and an intermediate good to manufacture a different final good can still yield profit, purchasing final goods makes us a consumer, costing us the same premium that we otherwise wish to capture through our reporting. A better strategy would be to capture the entire supply chain, which in this case includes the step required to create Bandosian components.

Creating Bandosian components involves breaking-down one of two pieces of cheaper armour. This can be either a Bandos chestplate, or Bandos tassets, each yielding a different quantity of Bandosian components. Both of these armour pieces feature far more balanced trade activity and are traded at far greater volumes and with more favorable margins than Bandosian components themselves, however the catch is that performing this conversion requires unlocking a requisite area of the game world, involving a lot of mid-to-high-level combat.

While these skill and area unlock requirements are much steeper than those required by the other processes we have reviewed, repairing Torva armour is not particularly time-intensive, especially given the low volume a trader would be working with. Despite these barriers to entry, repairing Torva armour is a low-effort manufacturing process with the potential to yield substantial margins, and as such is something we should report against.

Miscellaneous Weapons and Armour

Other examples of weapons and armour in the game which we should report against include the “Dragon Hunter Lance“, “Dragonfire Shield“, “Venator Bow“, “Kodai wand“, “Guardian Boots” and “Black Mask“.

Each of these items feature low-effort manufacturing processes or transmutations which can be used for trading purposes. We will cover the nuances for each of these when we build recipe tables, however they all share similar traits with other items we have already covered. Some have requirements, while others have none.

Other Supply Chains

There are countless other supply chains in the game which involve the conversion of raw resources into more refined and marketable goods. Some examples include turning logs into planks, smelting ores into ingots and other metallic products, cooking food, planting saplings, tanning hides, performing alchemy, and many other processes.

These all share the common trait of being “higher-effort” manufacturing processes than anything else we have discussed in this article. Engaging with these processes is more akin to actually playing OSRS rather than engaging in a trade strategy, since they involve a greater investment of a player’s attention and time.

While I encourage anybody to enjoy OSRS or any other game in the manner that best suits them, actually playing OSRS is not an efficient strategy for generating GP. As we established in our article concerning price floors, bot farms present better opportunity cost than human players, to the extent that rule-abiding players suffer from inflation and diminished returns on their labor due to bot-induced market saturation. As a result, players who actually enjoy OSRS should prioritize their personal enjoyment over in-game profit, eschewing any content they do not enjoy, even at the expense of greater returns.

Since our reporting goal encompasses trading strategies requiring minimal in-game effort, there is no need for us to consider reporting against any supply chains which require more than marginal engagement with the game’s processing mechanics. We should leave higher-effort supply chains to bots, and to human players who find enjoyment in extremely repetitive tasks.

Reporting Strategies

With our low-effort manufacturing processes now identified, let’s get started with some reporting.

Unlike the reporting strategies we’ve used in earlier articles, we will need to start by creating a recipe table. This is essentially a spreadsheet containing important details for each of the recipes we wish to report against.

Using the examples we’ve covered, I’ve created and uploaded a recipe table for us to use here. This table includes useful information about various recipes we have discussed, including the product name, recipe instructions, ingredient IDs and quantities, and any fixed processing costs.

Next, we’ll need to modify our report generation script a bit in-order to incorporate this recipe table. With LowEffortRecipes.csv saved in the same directory as our script, the necessary changes are outlined in bold:

...
## Open LowEffortRecipes Spreadsheet
LowEffortRecipes = pd.read_csv("LowEffortRecipes.csv", sep=",")

...

## Convert latest data to a pandas dataframe and merge with MasterTable
dflatest = pd.read_table(StringIO(latestcomplete), sep=",")
MasterTableLatestList = [MasterTable, dflatest, LowEffortRecipes]
MasterTableLatest = reduce(lambda  left,right: pd.merge(left,right,on=['id'],how='outer'), MasterTableLatestList)
...

Now we can get started with some SQLite queries. We’ll start by creating a table containing only the 79 final products we wish to report against. We’ll do this by only importing rows where “ProductName” is not null, since this column is unique to our recipe table:

...
cur.execute('''CREATE TABLE LowEffortRecipeTable AS SELECT * FROM MasterTable WHERE ProductName IS NOT NULL;''')
...

Next, since we need to compare prices between disparate goods, we need a table where price information for each product and their corresponding ingredients are stored in a single row. Since there are up-to three different ingredients per recipe, we’ll create three placeholder columns for Low price:

...
cur.executescript('''ALTER TABLE LowEffortRecipeTable ADD ingredient1lowprice; ALTER TABLE LowEffortRecipeTable ADD ingredient2lowprice; ALTER TABLE LowEffortRecipeTable ADD ingredient3lowprice;''')
...

We can then populate our placeholders by cross-referencing real-time price data from our Master table. In circumstances where a recipe does not have a second or third ingredient, the coalesce argument simply returns 0:

...
cur.executescript('''UPDATE LowEffortRecipeTable SET ingredient1lowprice = coalesce((SELECT MasterTable.low FROM MasterTable WHERE LowEffortRecipeTable.ingredient1id = MasterTable.id), 0); UPDATE LowEffortRecipeTable SET ingredient2lowprice = coalesce((SELECT MasterTable.low FROM MasterTable WHERE LowEffortRecipeTable.ingredient2id = MasterTable.id), 0); UPDATE LowEffortRecipeTable SET ingredient3lowprice = coalesce((SELECT MasterTable.low FROM MasterTable WHERE LowEffortRecipeTable.ingredient3id = MasterTable.id), 0);''')
...

We’ll then repeat these two steps for both the Buy Limit and Low Volume for all of our recipes’ ingredients. Instead of using a coalesce argument to set null values to zero, we will keep these null:

# buy limit
cur.executescript('''ALTER TABLE LowEffortRecipeTable ADD ingredient1buylimit; ALTER TABLE LowEffortRecipeTable ADD ingredient2buylimit; ALTER TABLE LowEffortRecipeTable ADD ingredient3buylimit;''')
cur.executescript('''UPDATE LowEffortRecipeTable SET ingredient1buylimit = (SELECT MasterTable.mappinglimit FROM MasterTable WHERE LowEffortRecipeTable.ingredient1id = MasterTable.id); UPDATE LowEffortRecipeTable SET ingredient2buylimit = (SELECT MasterTable.mappinglimit FROM MasterTable WHERE LowEffortRecipeTable.ingredient2id = MasterTable.id); UPDATE LowEffortRecipeTable SET ingredient3buylimit = (SELECT MasterTable.mappinglimit FROM MasterTable WHERE LowEffortRecipeTable.ingredient3id = MasterTable.id);''')
# volume
cur.executescript('''ALTER TABLE LowEffortRecipeTable ADD ingredient1hourlylowvolume; ALTER TABLE LowEffortRecipeTable ADD ingredient2hourlylowvolume; ALTER TABLE LowEffortRecipeTable ADD ingredient3hourlylowvolume;''')
cur.executescript('''UPDATE LowEffortRecipeTable SET ingredient1hourlylowvolume = (SELECT MasterTable.GranularDailyMeanVolumeLow FROM MasterTable WHERE LowEffortRecipeTable.ingredient1id = MasterTable.id); UPDATE LowEffortRecipeTable SET ingredient2hourlylowvolume = (SELECT MasterTable.GranularDailyMeanVolumeLow FROM MasterTable WHERE LowEffortRecipeTable.ingredient2id = MasterTable.id); UPDATE LowEffortRecipeTable SET ingredient3hourlylowvolume = (SELECT MasterTable.GranularDailyMeanVolumeLow FROM MasterTable WHERE LowEffortRecipeTable.ingredient3id = MasterTable.id);''')
...

Now that we have our data where we need it, we can start identifying potentially profitable low-effort processing methods.

At this point, our trading strategy is not unlike trading against the High-Low margin which we discussed in the second article in this series. Rather than looking for a large spread between the Low and High price for a single commodity, we are now looking for this difference between a recipe’s ingredients and its products.

Grand Exchange taxes always present unavoidable costs of engaging in trade. In our current reporting context, processing costs also represent a per-unit fee. As a result, we’ll apply the same tax formula we have used in past articles against each final product, followed by adding each recipe’s ProcessingCost to its corresponding Tax value.

...
cur.execute('''CREATE TABLE LowEffortRecipeTableTax AS SELECT * FROM LowEffortRecipeTable;''')
cur.execute('''ALTER TABLE LowEffortRecipeTableTax ADD COLUMN Tax;''')
cur.execute('''CREATE TABLE MaxTax AS SELECT * FROM LowEffortRecipeTableTax WHERE round(GranularDailyMeanHigh) > 500000000;''')
cur.execute('''CREATE TABLE MinTax AS SELECT * FROM LowEffortRecipeTableTax WHERE round(GranularDailyMeanHigh) <= 500000000;''')
cur.executescript('''DROP TABLE LowEffortRecipeTableTax; DROP TABLE LowEffortRecipeTable;''')
cur.execute('''UPDATE MaxTax SET Tax = 5000000 + ProcessingCost;''')
cur.execute('''UPDATE MinTax SET Tax = round((GranularDailyMeanHigh * 0.01) - 0.5) + ProcessingCost;''')
cur.execute('''CREATE TABLE LowEffortRecipeTable AS SELECT * FROM MaxTax UNION SELECT * FROM MinTax;''')
...

Next, we need to run some calculations to determine ingredient costs, as well as the effective rate limit imposed by buy limits and historical trade volume:

...
cur.execute('''CREATE TABLE LowEffortRecipeTable1 AS SELECT *, (ingredient1lowprice * ingredient1Qty) + (ingredient2lowprice * ingredient2Qty) + (ingredient3lowprice * ingredient3Qty) AS TotalLowCost, min(coalesce(ingredient1buylimit / ingredient1Qty, 'none'), coalesce(ingredient2buylimit / ingredient2Qty, 'none'), coalesce(ingredient3buylimit / ingredient3Qty, 'none'), coalesce((ingredient1hourlylowvolume * 4) / ingredient1Qty, 'none'), coalesce((ingredient2hourlylowvolume * 4) / ingredient2Qty, 'none'), coalesce((ingredient3hourlylowvolume * 4) / ingredient3Qty, 'none')) AS EffectiveBuyLimit FROM LowEffortRecipeTable;''')
...

TotalLowCost represents the total material cost of a recipe. This is taken by aggregating the products of each ingredient’s Low price and quantity. This value represents the minimum price we can expect to pay when we are sold all of the ingredients needed to produce one unit of the recipe’s product. Since recipes which do not possess 2nd or 3rd ingredients feature 0 price, these arguments contribute nothing toward the final TotalLowCost value.

EffectiveBuyLimit represents the maximum quantity of our recipe product which we can manufacture in a 4-hour window, representing our rate limit. This is calculated by taking the minimum value of all of a recipe’s ingredients’ buy limits and recent trade volume. While some ingredients may have higher buy limits or may trade more frequently than others, we are ultimately limited by a recipe’s lowest common denominator; if any one ingredient features low trade volume or low buy limits, this will impact the unit quantity of the recipe’s product which we can produce, which directly impacts a recipe’s potential profitability.

Finally, we need to bring all of these values together in-order to calculate our margins and the potential profitability for all recipes:

...
cur.execute('''CREATE TABLE LowEffortRecipeTable2 AS SELECT *, round(QtyProduced * (high - TotalLowCost - Tax)) AS HighMargin, round(QtyProduced * (low - TotalLowCost - Tax)) AS LowMargin FROM LowEffortRecipeTable1;''')
cur.execute('''CREATE TABLE FinalOutput AS SELECT itemlistname AS ItemName, RecipeType, HighMargin, LowMargin, round(HighMargin * EffectiveBuyLimit) AS HighMaxProfit, round(LowMargin * EffectiveBuyLimit) AS LowMaxProfit FROM LowEffortRecipeTable2 WHERE HighMargin + LowMargin > 0,  ORDER BY HighMaxProfit DESC;''')
...

HighMargin and LowMargin represent the maximum per-unit profit generated when selling the product of a recipe at the current High or Low price respectively, with HighMaxProfit and LowMaxProfit taking into account each recipe’s effective buy limit, providing us with the maximum profit potential of a recipe within a 4-hour window of time.

While our goal when trading should always be to buy Low and sell High, for this report we also want to include LowMargin for a handful of reasons:

  • Since LowMargin represents the “Insta-Sell” price for a good, a trader desiring faster rate of return may wish to execute against this margin, at the cost of higher returns waiting for a buyer at the HighMargin.
  • LowMargin can help gauge risk; if a recipe features a high HighMargin value, but a negative LowMargin value, the trader assumes greater risk in the event that an item somehow fails to sell at the current High price.
  • There are circumstances where High and Low price may briefly be inverted, which can occur if demand for a final good over-saturates present supply. In such circumstances, the High price may actually provide no or negative returns while the Low price may return profit. While counter-intuitive, these circumstances provide an unusual avenue for profit when trading with this method, making LowMargin visibility useful.

In the case of our reporting, we are excluding items where the sum of HighMargin and LowMargin is less than zero, since these circumstances present the most unprofitable, risky, and otherwise undesirable trading positions.

Our finished report sorted by HighMaxProfit in descending order is now being published here.

Other Comments and Observations

Method Efficacy

Despite often being relatively capital-intensive and providing poorer ROI than other trading methods, out of all of the trading strategies we have covered in these articles so far, this particular trading strategy generated the majority of the wealth I accumulated throughout my time spent trading on the Grand Exchange.

Producing Voidwakers in-particular proved to be an especially effective money making strategy. I would often find myself in positions where I was producing up-to 3 Voidwakers at a time. At a materials cost of about 140M GP each and an average return on investment of 1-2M GP each, this was a relatively capital-intensive process with poor ROI, however in many circumstances I could obtain returns within an extremely short time frame which could then be immediately re-invested in other positions. The same goes for producing other products, including Venator bows.

Creating unfinished potions also proved to be quite lucrative, however especially in the case of items such as unfinished Cadantine Blood Potions I often found myself fighting with other market participants in-order to capture limited market demand and recoup liquidity. This resulted in a mixture of obscene gains or losses in the short-term, with the long-run trending toward healthy returns.

All trading strategies carry risk, however with an effective reporting tool at our disposal, risk becomes calculated and manageable. Speculation benefits from the availability and appropriate organization of market data. This is especially important in the context of low-effort processing methods, since traders with reporting tools which signal precisely when processing methods are likely to generate profit will almost always be at an advantage versus traders who otherwise inadequately leverage market data.

Grimy Herbs

There is one component of the herblore production chain which we did not address in our earlier analysis; herbs are initially produced in a “grimy” state and *must be cleaned prior to being used to make unfinished potions. (*unless a player is wielding an herblore cape… however, with some exceptions, skill training beyond level 99 represents behavior that defies rational economic principles)

The act of cleaning herbs does present a low-effort processing method; the NPC Zahur charges 200GP per unit for this service, with the same base requirements as making unfinished potions. So, why shouldn’t we consider leveraging this for our reporting?

Unlike creating unfinished potions, the act of manually cleaning herbs presents utility in the form of a marginal amount of herblore experience. While the amount of experience is negligible when compared with mixing finished potions, the utility presented by cleaning herbs is adequate enough for a subset of players seeking discounted herblore experience. As a result of this utility, the price histories between the most frequently-traded clean and grimy herbs are typically identical. In this context, Zahur’s herb-cleaning service represents an obliteration of utility and is effectively useless in all but the most niche of circumstances.

Processing Risk

Besides aforementioned risks involving wilderness mechanics, there are some niche risks involved when engaging in low-effort processing methods.

When leveraging Zahur’s services, I would recommend only processing one type of unfinished potion at a time. If a player requests their services while carrying a mixture of different vial types (vial of blood, vial of water) there is a risk that the incorrect unfinished potion type might be created, which cannot be reversed. While in some circumstances players will be presented with clarifying dialogue, it is less risky to simply bring one set of ingredients to Zahur at a time, utilizing the nearby bank if additional types of unfinished potions need to be made with different sets of ingredients.

There may be other niche risks involved when engaging in other low-effort processing methods, especially considering that Jagex may change game mechanics at any time. As a result, consulting the OSRS Wiki is always a great idea before attempting a new processing method.

Reporting Shortcomings

The largest shortcoming with this trade strategy is that we are limited by our fixed recipe table. When Jagex introduces new content into the game, the onus is on the report maintainer to incorporate new recipes into the table. This is in-contrast to all of our other reporting strategies which are not reliant on recipe tables and derive all of their data from the OSRS Wiki API, with new commodities being reported against as they’re introduced into the game and added to the /mapping endpoint. Since I no longer play OSRS and have no vested interest in the future of the game, I don’t intend to keep my recipe table updated, and as a result my automated report may end-up missing future low-effort recipes. Any current player who intends to leverage this strategy in the long-run should apply the lessons learned here toward their own reporting, including the creation and maintenance of up-to-date recipe tables.

Other shortcomings include the aforementioned large capital requirements and low per-transaction ROI presented by this trading strategy. These qualities are substantial enough to preclude ROI being calculated and reported, despite its inclusion in every other reporting strategy that we have covered so far. Traders with limited access to capital will find it difficult to leverage this strategy at-scale and in most circumstances will be better served by strategies which provide better ROI. Even with a billion GP of available capital, I frequently found myself running into short-term liquidity issues due to taking-on large processing positions.

Conclusion

I hope this article has been insightful; my next article will expand upon our utilization of recipe tables to investigate and report against substitute goods. Please stay tuned for more analysis and scripting examples!

Thank you for reading!