Guest User

Untitled

a guest
Sep 28th, 2017
629
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.75 KB | None | 0 0
  1. // This script automatically rebalances a stock portfolio to keep an equal amount
  2. // invested in every stock, and a certain percentage in cash. It requires significant
  3. // moves in order to make transactions, in order to minimize commission fees.
  4.  
  5. symbols = ["ECP", "MGCP", "BLD", "CLRK", "OMTK", "FSIG", "KGI", "FLCM", "STM", "DCOMM", "HLS", "VITA", "ICRS", "UNV", "AERO", "OMN", "SLRS", "GPH", "NVMD", "WDS", "LXO", "RHOC", "APHE", "SYSC", "CTK", "NTLK", "OMGA", "FNS", "SGC", "JGN", "CTYS", "MDYN", "TITN"];
  6. investQuantity = 0.9;
  7. rebalanceThreshold = 0.1;
  8.  
  9. while (true)
  10. {
  11. prices = [];
  12. shares = [];
  13.  
  14. print("Getting positions...");
  15. totalCost = 0;
  16. for (i = 0; i < symbols.length; i = i+1)
  17. {
  18. position = getStockPosition(symbols[i]);
  19. shares.push(position[0]);
  20. totalCost += position[0] * position[1];
  21. }
  22.  
  23. print("Getting initial prices...");
  24. for (i = 0; i < symbols.length; i = i+1)
  25. prices.push(getStockPrice(symbols[i]));
  26.  
  27. cash = getServerMoneyAvailable("home");
  28. netWorth = cash;
  29.  
  30. for (i = 0; i < symbols.length; i = i+1)
  31. netWorth += prices[i] * shares[i];
  32.  
  33. // Keep a certain amount in cash, and invest the rest
  34. targetStock = (netWorth * investQuantity) / symbols.length;
  35.  
  36. moneyDisp = netWorth;
  37. suffix = "";
  38. if (moneyDisp >= 1000)
  39. {
  40. moneyDisp /= 1000;
  41. suffix = "k";
  42. }
  43. if (moneyDisp >= 1000)
  44. {
  45. moneyDisp /= 1000;
  46. suffix = "m";
  47. }
  48. if (moneyDisp >= 1000)
  49. {
  50. moneyDisp /= 1000;
  51. suffix = "b";
  52. }
  53. if (moneyDisp >= 1000)
  54. {
  55. moneyDisp /= 1000;
  56. suffix = "t";
  57. }
  58. if (moneyDisp >= 1000)
  59. {
  60. moneyDisp /= 1000;
  61. suffix = "qa";
  62. }
  63. if (moneyDisp >= 1000)
  64. {
  65. moneyDisp /= 1000;
  66. suffix = "qt";
  67. }
  68. if (moneyDisp >= 1000)
  69. {
  70. moneyDisp /= 1000;
  71. suffix = "se";
  72. }
  73. if (moneyDisp >= 1000)
  74. {
  75. moneyDisp /= 1000;
  76. suffix = "st";
  77. }
  78. if (moneyDisp >= 1000)
  79. {
  80. moneyDisp /= 1000;
  81. suffix = "o";
  82. }
  83. if (moneyDisp >= 1000)
  84. {
  85. moneyDisp /= 1000;
  86. suffix = "n";
  87. }
  88. if (moneyDisp >= 1000)
  89. {
  90. moneyDisp /= 1000;
  91. suffix = "d";
  92. }
  93.  
  94. print("Net worth: $" + (Math.round(100 * moneyDisp) / 100) + suffix);
  95.  
  96. moneyDisp = totalCost;
  97. suffix = "";
  98. if (moneyDisp >= 1000)
  99. {
  100. moneyDisp /= 1000;
  101. suffix = "k";
  102. }
  103. if (moneyDisp >= 1000)
  104. {
  105. moneyDisp /= 1000;
  106. suffix = "m";
  107. }
  108. if (moneyDisp >= 1000)
  109. {
  110. moneyDisp /= 1000;
  111. suffix = "b";
  112. }
  113. if (moneyDisp >= 1000)
  114. {
  115. moneyDisp /= 1000;
  116. suffix = "t";
  117. }
  118. if (moneyDisp >= 1000)
  119. {
  120. moneyDisp /= 1000;
  121. suffix = "qa";
  122. }
  123. if (moneyDisp >= 1000)
  124. {
  125. moneyDisp /= 1000;
  126. suffix = "qt";
  127. }
  128. if (moneyDisp >= 1000)
  129. {
  130. moneyDisp /= 1000;
  131. suffix = "se";
  132. }
  133. if (moneyDisp >= 1000)
  134. {
  135. moneyDisp /= 1000;
  136. suffix = "st";
  137. }
  138. if (moneyDisp >= 1000)
  139. {
  140. moneyDisp /= 1000;
  141. suffix = "o";
  142. }
  143. if (moneyDisp >= 1000)
  144. {
  145. moneyDisp /= 1000;
  146. suffix = "n";
  147. }
  148. if (moneyDisp >= 1000)
  149. {
  150. moneyDisp /= 1000;
  151. suffix = "d";
  152. }
  153.  
  154. print("Total cost of shares: $" + (Math.round(100 * moneyDisp) / 100) + suffix);
  155.  
  156. moneyDisp = netWorth - cash - totalCost;
  157. suffix = "";
  158. if (moneyDisp >= 1000)
  159. {
  160. moneyDisp /= 1000;
  161. suffix = "k";
  162. }
  163. if (moneyDisp >= 1000)
  164. {
  165. moneyDisp /= 1000;
  166. suffix = "m";
  167. }
  168. if (moneyDisp >= 1000)
  169. {
  170. moneyDisp /= 1000;
  171. suffix = "b";
  172. }
  173. if (moneyDisp >= 1000)
  174. {
  175. moneyDisp /= 1000;
  176. suffix = "t";
  177. }
  178. if (moneyDisp >= 1000)
  179. {
  180. moneyDisp /= 1000;
  181. suffix = "qa";
  182. }
  183. if (moneyDisp >= 1000)
  184. {
  185. moneyDisp /= 1000;
  186. suffix = "qt";
  187. }
  188. if (moneyDisp >= 1000)
  189. {
  190. moneyDisp /= 1000;
  191. suffix = "se";
  192. }
  193. if (moneyDisp >= 1000)
  194. {
  195. moneyDisp /= 1000;
  196. suffix = "st";
  197. }
  198. if (moneyDisp >= 1000)
  199. {
  200. moneyDisp /= 1000;
  201. suffix = "o";
  202. }
  203. if (moneyDisp >= 1000)
  204. {
  205. moneyDisp /= 1000;
  206. suffix = "n";
  207. }
  208. if (moneyDisp >= 1000)
  209. {
  210. moneyDisp /= 1000;
  211. suffix = "d";
  212. }
  213.  
  214. earningsPrint = "Earnings: $" + (Math.round(100 * moneyDisp) / 100) + suffix;
  215. if (totalCost > 0)
  216. earningsPrint += " (" + (Math.round(10 * 100 * (((netWorth - cash) / totalCost) - 1)) / 10) + "%)";
  217. print(earningsPrint);
  218.  
  219. moneyDisp = targetStock;
  220. suffix = "";
  221. if (moneyDisp >= 1000)
  222. {
  223. moneyDisp /= 1000;
  224. suffix = "k";
  225. }
  226. if (moneyDisp >= 1000)
  227. {
  228. moneyDisp /= 1000;
  229. suffix = "m";
  230. }
  231. if (moneyDisp >= 1000)
  232. {
  233. moneyDisp /= 1000;
  234. suffix = "b";
  235. }
  236. if (moneyDisp >= 1000)
  237. {
  238. moneyDisp /= 1000;
  239. suffix = "t";
  240. }
  241. if (moneyDisp >= 1000)
  242. {
  243. moneyDisp /= 1000;
  244. suffix = "qa";
  245. }
  246. if (moneyDisp >= 1000)
  247. {
  248. moneyDisp /= 1000;
  249. suffix = "qt";
  250. }
  251. if (moneyDisp >= 1000)
  252. {
  253. moneyDisp /= 1000;
  254. suffix = "se";
  255. }
  256. if (moneyDisp >= 1000)
  257. {
  258. moneyDisp /= 1000;
  259. suffix = "st";
  260. }
  261. if (moneyDisp >= 1000)
  262. {
  263. moneyDisp /= 1000;
  264. suffix = "o";
  265. }
  266. if (moneyDisp >= 1000)
  267. {
  268. moneyDisp /= 1000;
  269. suffix = "n";
  270. }
  271. if (moneyDisp >= 1000)
  272. {
  273. moneyDisp /= 1000;
  274. suffix = "d";
  275. }
  276.  
  277. print("Target stock holdings: $" + (Math.round(100 * moneyDisp) / 100) + suffix);
  278.  
  279. for (i = 0; i < symbols.length; i = i+1)
  280. {
  281. // Get the price again to avoid script delay errors
  282. price = getStockPrice(symbols[i]);
  283. holdings = price * shares[i];
  284. diff = Math.floor((targetStock - holdings) / price) * price;
  285.  
  286. // Because of the $100k commissions, we only want to trade if it's a differential of
  287. // $10m or more, and also 10% to avoid too much jitter.
  288. if (diff > 10000000 && (holdings === 0 || targetStock / holdings >= (1 + rebalanceThreshold)))
  289. buyStock(symbols[i], diff / price);
  290. else if (diff < -10000000 && targetStock / holdings <= (1 - rebalanceThreshold))
  291. sellStock(symbols[i], -diff / price);
  292. }
  293. }
Advertisement
Add Comment
Please, Sign In to add comment