<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def refund(self, amount=None, reason=None):
 		""" 		Initiate a refund. If amount is not provided, then this will be a full refund. 		:param amount: A positive decimal amount representing how much of this charge 			to refund. Can only refund up to the unrefunded amount remaining of the charge. 		:trye amount: Decimal 		:param reason: String indicating the reason for the refund. If set, possible values 			are ``duplicate``, ``fraudulent``, and ``requested_by_customer``. Specifying 			``fraudulent`` as the reason when you believe the charge to be fraudulent will 			help Stripe improve their fraud detection algorithms. 		:return: Stripe charge object 		:rtype: dict 		"""

		charge_obj = self.api_retrieve().refund(
			amount=self._calculate_refund_amount(amount=amount), reason=reason
		)
		return self.__class__.sync_from_stripe_data(charge_obj)