[R] the problem of buying and selling

Zhang Weiwu zhangweiwu at realss.com
Sat Sep 14 10:49:19 CEST 2013



On Sat, 14 Sep 2013, Zhang Weiwu wrote:

> I own a lot to the folks on r-help list, especially arun who answered 
> every of my question and was never wrong. I am disinclined to once again 
> ask this question, since it is more arithmatic than technical. But, having 
> worked 2 days on it, I realized my brain is just not juicy enough....
>
> Here is the problem.
>
> 	Trust not for freedom to the Franks---
> 	They have a king who buys and sells.
> 			- Lord Byron: The Isles of Greece
>
> Suppose the French King commands you to buy and sell, and tells you only to
> deal if the profit is higher than 2%. Question: how much quantity will be 
> dealt, and what is the actual profit? In fact, the King wants to see the 
> relationship between his minimum-profit requirement and your result, in order 
> to better his decision.
>
> Let's look at the input data - a dump of which is attached to this mail.
>
> Column 1 is the price of the market where you buy goods from, column 2 is the 
> quantity of goods that is being sold at that price.
>
> Column 3 is the price of the market where you sell goods to, column 4 is the 
> quantity the buyers willing to buy at that price.

Forgive my carelessness. I should emphasize that there is only one type 
goods to be dealt. The below table should be read in this way: there is 190 
quantity of goods being sold at 61.7050 that you can buy from, and 29 
quantity of goods beign sold at 61.7500 that you can buy from (row 1 and 2, 
column 1 and 2).  They are exactly the same type of goods, that you can sell 
the total volume of 219 at the price of 63.170.

>> cbind(t(to_buy_from), t(to_sell_to))
>
> 	 [,1]  [,2]   [,3]   [,4]
> [1,] 61.7050   190 63.170   2500
> [2,] 61.7500    29 63.150    799
> [3,] 61.8050   166 63.110    500
> [4,] 61.8950   166 63.060  10000
> [5,] 61.9450   166 63.020   7840
> [6,] 61.9805  6150 62.995   2000
> [7,] 62.0000  3069 62.930   2000
> [8,] 62.0600   166 62.860  10811
> [9,] 62.1100   166 62.780  18054
> [10,] 62.1450   166 62.755   9000
> [11,] 62.1750   166 62.690  10960
> [12,] 62.2250   166 62.635    100
> [13,] 62.2450   166 62.585   2380
> [14,] 62.2720   100 62.550   2119
> [15,] 62.2830  4000 62.525 108091
> [16,] 62.2875   100 62.505   2000
> [17,] 62.2955   100 62.485    816
> [18,] 62.3250   307 62.435    600
> [19,] 62.3800  2906 62.400    300
> [20,] 62.3940  1969 62.375   4611
> [21,] 62.4250   166 62.355   5111
> [22,] 62.4505  2000 62.335   1969
> [23,] 62.4700   259 62.315    500
> [24,] 62.4755    50 62.250   5142
> [25,] 62.4800   166 62.165    660
> [26,] 62.4935   305 62.115   2428
> [27,] 62.4975  7786 62.085    779
> [28,] 62.4995 50049 62.050  12811
> [29,] 62.5045   914 62.015    192
> [30,] 62.5150  1110 61.975   1200
> [31,] 62.5285   400 61.895  40000
> [32,] 62.5500  6352 61.835    100
> [33,] 62.5750     9 61.775    133
> [34,] 62.6000   394 61.750   7723
>
> For the simpliest case, if the King had commanded that the minimum profit 
> should be 2.3742%, which is equal to 63.170/61.7050 (look at the first row), 
> then you can easily project that 190 quantity of goods will be dealt (the 
> minmum of [1,2] and [1,4]), and that the actual profit is 2.3742%.
>
> If the king, however, has commanded that a deal should only be carried out if 
> the profit is higher than 2%, the calculation will be more complicated. I 
> don't know the right method, but I can demonstrate the wrong method and 
> explain why it is wrong.
>
> The wrong approach is the following:
>
> The idea is to write a function that asks how much volume (total quantity) 
> you want to deal, and returns the profit. This generates a relationship 
> between volume and profit, and with interpolation you can get the volumen for 
> any given minimum-profit requirement.
>
>
> revenues <- function(open_orders, volumes) {
> # calculate revenue using a list of open orders and desirable "volumes" of 
> goods
>
> # expecting volumnes as a vector, to test the revenue (total amont of money)
> # for each volume (total amount of goods to deal) in the 'volumes'
>
> 	volume  <- sapply(1:length(open_orders[2,]),
> 		function(x) { sum(open_orders[2,1:x])})
> 	revenue <- sapply(1:length(open_orders[2,]),
> 		function(x) { sum(open_orders[1, 1:x] * open_orders[2,1:x])})
> 	i <- findInterval(volumes, c(0, volume))
> 	c(0, revenue)[i] + c(open_orders[1,], 0)[i]*(
> 		volumes - c(0, volume)[i])
> }
>
> data.frame(volume = volumes, profit = revenues(to_sell_to, volumes) /
> 	                              revenues(to_buy_from, volumes) - 1)
>
> With the above routine, let us test the profit with the following volumes:
>
>> volumes = c(10, 100, 500, 1000, 5000, 10000, 30000, 50000, 70000, 90000)
>
> And the result:
>
>> data.frame(volume = volumes, profit = revenues(to_sell_to, volumes) /
> +                                       revenues(to_buy_from, volumes) - 1)
>   volume      profit
>   1      10 0.023741938
>   2     100 0.023741938
>   3     500 0.022424508
>   4    1000 0.020974612
>   5    5000 0.018972785
>   6   10000 0.018087976
>   7   30000 0.012223652
>   8   50000 0.009288480
>   9   70000 0.007729286
>   10  90000 0.006204251



More information about the R-help mailing list